Как решить проблему «От вышестоящего сервера был получен неверный ответ» на Kong Gateway?
Я использую Docker с Compose, создал несколько микросервисов и пытаюсь подключить их через Kong Gateway.
Чтобы получить доступ к MS с помощью PHP, я создал в Nginx обратный прокси-сервер, к которому я могу получить доступ через пример URL-адресов ниже:
http://service1.localhost:8081 (Laravel with PHP MS)
http://service2.localhost:8081 (Laravel with PHP MS)
http://service3.localhost:8081 (Laravel with PHP MS)
http://frontend.localhost:8080 (Nuxt JS With Node MS)
Вопрос в том, что у меня есть контейнер только с Nginx, который позволяет мне использовать другие микросервисы указанным выше способом через обратный прокси-сервер, но URL-адреса MS в Laravel имеют примеры путей:
/api/v1/abc /api/v1/abc/def /api/v1/def /api/v1/def/123 /api/v1/abc/abcd-efg
То есть у них есть несколько путей «в глубину». И когда я пытаюсь вставить эти URL-адреса в Kong, я получаю сообщение об ошибке при доступе к ним:
«От вышестоящего сервера получен неверный ответ»
А в браузере показывает 502; Я понимаю, что 502 — это плохой шлюз, поэтому я считаю, что ошибка может быть в настройках, которые я использую в файле конфигурации Nginx.
Моя конфигурация Nginx выглядит следующим образом (по одному файлу для каждого MS в Laravel, просто меняя путь и поддомен URL-адреса):
server {
listen 80;
listen [::]:80;
server_name service1.localhost;
root /var/www/service1/public;
error_log /var/log/nginx/error.logs;
access_log /var/log/nginx/access.logs;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass service1.localhost:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
В журналах докера в контейнере Kong я вижу следующие ошибки:
[error] 2140#0: *13211 connect() failed (111: Connection refused) while connecting to upstream, client: 172.19.0.1, server: kong, request: "GET /api/v1/states HTTP/1.1", upstream: "http://172.19.0.2:8000/api/v1/states", host: "localhost:8000"
[error] 2140#0: *13211 connect() failed (111: Connection refused) while connecting to upstream, client: 172.19.0.1, server: kong, request: "GET /api/v1/states HTTP/1.1", upstream: "http://172.19.0.2:8000/api/v1/states", host: "localhost:8000"
[error] 2140#0: *13211 connect() failed (111: Connection refused) while connecting to upstream, client: 172.19.0.1, server: kong, request: "GET /api/v1/states HTTP/1.1", upstream: "http://172.19.0.2:8000/api/v1/states", host: "localhost:8000"
[error] 2140#0: *13211 connect() failed (111: Connection refused) while connecting to upstream, client: 172.19.0.1, server: kong, request: "GET /api/v1/states HTTP/1.1", upstream: "http://172.19.0.2:8000/api/v1/states", host: "localhost:8000"
[error] 2140#0: *13211 connect() failed (111: Connection refused) while connecting to upstream, client: 172.19.0.1, server: kong, request: "GET /api/v1/states HTTP/1.1", upstream: "http://172.19.0.2:8000/api/v1/states", host: "localhost:8000"
[error] 2140#0: *13211 connect() failed (111: Connection refused) while connecting to upstream, client: 172.19.0.1, server: kong, request: "GET /api/v1/states HTTP/1.1", upstream: "http://172.19.0.2:8000/api/v1/states", host: "localhost:8000"
Поскольку внутренний IP-адрес контейнера service1
192.168.0.109 host.docker.internal
192.168.0.109 gateway.docker.internal
А еще я использую конфигурацию extra_hosts во всех микросервисах:
extra_hosts:
- "host.docker.internal:host-gateway"
Я пробовал конфигурацию в Kong несколькими способами, просматривал несколько руководств, видел несколько примеров, но ни одно видео или статья не показывали пример в виде микросервиса с обратным прокси-сервером в поддомене...
Я уже пытался настроить в Kong конфигурацию для поиска URL-адреса (service1.localhost:8081), я уже пробовал внутренний IP-адрес (172.19.0.2:8081) с внутренним портом, которым поделился MS (49154). ) и никак не получалось.
PS: Я использую WSL2, не знаю, актуально ли это, но если кому-то интересно...