Рейтинг:0

{«Статус»: 400, «Сообщение»: «Неверный запрос»} при обращении к микросервису с использованием Nginx API Gateway

флаг us

Привет, я пытаюсь использовать API с помощью Nginx API Gateway: у меня есть этот URL: example.com/api/nodeapp. В моей настройке у меня есть контроллер Ingress, который открыт извне на .com и который принимает запрос на выполнение oauth и перенаправляет на внутренний модуль nginx (представленный как IP-служба кластера в частном кластере). также предоставляется как служба Cluster IP в том же частном кластере). Цель: я просматриваю URL-адрес как example.com/api/nodeapp ---> Ingress выполнит oauth и перенаправит запрос на Nginx (что происходит нормально), Nginx примет мой запрос и перенаправит меня на целевой микросервис nodeapp (который терпит неудачу в Ошибка 400) Мои фрагменты кода:

Ingress.yaml

спецификация:
  правила:
    - хост: example.com
      http:
        пути:
          - путь: /api/nodeapp
            серверная часть:
              имя_службы: nginx-внутренняя служба
              сервисПорт: 80
          - путь: /апи/чай
            серверная часть:
              имя_службы: nginx-внутренняя служба
              сервисПорт: 80

Nginx.conf

пользователь nginx;
рабочие_процессы авто;

error_log /var/log/nginx/error.log отладка;
pid /var/run/nginx.pid;


События {
    worker_connections 1024;
}


http {
    включить /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$статус $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    журнал_доступа /var/log/nginx/access.log основной;

    отправить файл включен;
    #tcp_npush включен;

    keepalive_timeout 65;

    #gzip включен;
    включить /etc/nginx/api_gateway.conf;
    включить /etc/nginx/conf.d/*.conf;
}

api_gateway.conf

включить api_backends.conf;
#include api_keys.conf;

сервер {
    access_log /var/log/nginx/api_access.log основной; # Каждый API также может вести журнал в отдельный файл

    слушать 80; # Конфигурация TLS находится здесь (для производственного использования)
    имя_сервера пример.com;

    # Конфигурация TLS
    #ssl_certificate /etc/ssl/certs/api.example.com.crt;
    #ssl_certificate_key /etc/ssl/private/api.example.com.key;
    #ssl_session_cache общий:SSL:10m;
    #ssl_session_timeout 5 м;
    #ssl_ciphers HIGH:!aNULL:!MD5;
    #ssl_protocols TLSv1.2 TLSv1.3;
   # Недопустимый ресурс
    место расположения / {
        переписать ^ https://$host$request_uri навсегда;
    }
    # определения API, по одному на файл
    включить api_conf.d/*.conf;

    # ответы об ошибках
    error_page 404 = @400; # Недопустимые пути рассматриваются как неверные запросы
    местоположение @400 {
        вернуть 400 '{"статус":400,"сообщение":"Неверный запрос"}\n';
    }
    proxy_intercept_errors включен; # Не отправлять ошибки бэкенда клиенту
    включить error_json.conf; # Удобные для клиента API ответы на ошибки JSON
    приложение по умолчанию_тип/json; # Если нет типа содержимого, то предположим, что это JSON
}

nodeapi_simple.conf

# API узла
#
расположение /API/ {
    # Конфигурация политики здесь (аутентификация, ограничение скорости, ведение журнала и т. д.)
    #
    access_log /var/log/nginx/nodeapp_api.log основной;

    # URI-маршрутизация
    #
    расположение /апи/чай {
        прокси_пароль http://чай;
    }

    расположение /api/nodeapp {
        proxy_pass http://nodeapp;
    }

    вернуть 404; # Универсальный
}

# vim: синтаксис=nginx

api_backend.conf

вышестоящее приложение узла {
    зона nodeapp 64k;
    сервер nodeapp IP: 8000;
    
    
}


вверх по течению чай {
    зона чай 64k;
    сервер чайного приложения IP: 80;
    
    
}



# vim: синтаксис=nginx

Мое основное внимание здесь сосредоточено на запуске example.com/api/nodeapp, который не работает, хотя я уже протестировал nodeapp на локальном хосте, и он работает нормально.Также странно, что это приложение для чая представляет собой просто образец текстового приложения, которое работает, когда я нажимаю в браузере URL-адрес example.com/api/tea, он работает [[1]: https://i.stack.imgur .com/3fP3k.png][1]s на ​​приведенный ниже снимок:

Вот мои журналы [1]: https://i.stack.imgur.com/jssnb.png][1] Я застрял в этой ошибке с 3 дней, поэтому прошу всех помочь мне с этим при первой же возможности.

Michael Hampton avatar
флаг cz
Вы написали эту конфигурацию nginx или скопировали ее откуда-то? Это ясно показывает, что «400», которое вы получили, на самом деле было 404 от сервера API, который ваша конфигурация переписывает на 400 с этим конкретным телом ответа. Далее вам следует обратить внимание на сервер API.
yash avatar
флаг us
Я использую конфигурацию nginx из блога nginx «Развертывание NGINX в качестве шлюза API, часть 1», и я протестировал сервер API узла с внешним входом nginx, он работал нормально (200), как всякий раз, когда я нажимал example.com/node (без использования внутреннего nginx) я успешно получаю страницу, но когда я нажимаю example.com/api/nodeapp (через вход и внутренний модуль nginx), я получаю эту ошибку 400
yash avatar
флаг us
Я также добавил журналы, хотя они не очень подробные, но это то, что я получаю только
yash avatar
флаг us
вы правы, я прокомментировал строку "страница ошибки 404 = @400", и теперь я получаю сообщение об ошибке 404, но не знаю, что делать дальше
Michael Hampton avatar
флаг cz
Вы снова проверяете свое приложение.
yash avatar
флаг us
Я перепроверил свое приложение внутри сервера, оно работает, на самом деле есть одна загвоздка, здесь что-то не так с «proxy pass http://nodeip:nodeport». Что я сделал, так это прокомментировал эту строку в блоке location /api/nodeapp {) и вместо этого я поставил return 200; а затем протестировал мое приложение, оно достигло 200, что означает, что есть что-то подозрительное с прокси-проходом, который не может попасть в мое приложение node.
yash avatar
флаг us
Это работает, я думаю, теперь мне просто нужно добавить / в конце прокси-прохода прокси-проход nodeip:nodeport вот так --> прокси-проход nodeip:nodeport/
yash avatar
флаг us
У него была одна проблема: если мое приложение настроено таким образом, что мой запрос может быть похож на /api/nodeapp/something, то как перенаправить этот URL-адрес на целевую страницу?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.