Конфигурация nginx запущенного в docker-compoze
Мне для целей разработки, нужно поднять в докере ряд приложений написанных на Asp.net core WebApi.
Compose:
version: '3.7'
services:
nginx:
image: nginx:stable-alpine
ports:
- "127.0.0.1:81:80"
- "127.0.0.1:443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/conf.d:/etc/nginx/conf.d
restart: unless-stopped
container_name: nginx
extra_hosts:
- "host.docker.internal:host-gateway"
Конфигурация самого проксирования, находится в файле по пути ./nginx/conf.d/test.conf, который заполнен следующим образом:
server {
listen 127.0.0.1:80;
location /foo/ {
proxy_pass http://host.docker.internal:1002;
}
}
т.е. я ожидаю, при переходе на http://localhost:81/foo/swagger увидеть сваггер своего сервиса (который расположен по адресу http://localhost:1002/swagger). однако, вместо этого, в логах nginx я вижу сообщения об ошибке:
[error] 29#29: *1 open() "/usr/share/nginx/html/foo/swagger" failed (2: No such file or directory), client: 192.168.240.1, server: _, request: "GET /foo/swagger HTTP/1.1", host: "localhost"
Однако если не использовать префикс /foo, а использовать перенаправление только на корень "/", то все работает кооректно и я виду сваггер. Подскажите что не так с настройками?
UPD:
Пробовал пробросить proxy_pass через внутреннюю сеть докера (в первом композ файле создать сеть и присвоить имя к запущенному а в nginx подключиться к сети и проксировать внутреннюю сеть через nginx.) В итоге результат тот же, если не применять префикс /foo а настроить на корень, то все работает. Прошу советов / идей.
Ответы (1 шт):
Это широко известная в узких кругах особенность конфигурации proxy_pass
Вы написали в конфигурации
proxy_pass http://host.docker.internal:1002;
В конце URL нет /, поэтому в proxy_pass переадресация просходит по тому же пути, который использовался в исходном запросе. Вы запросили /foo/swagger? Получите обращение к http://host.docker.internal:1002/foo/swagger
Если вам не нужен префикс /foo/, то вам нужно написать
proxy_pass http://host.docker.internal:1002/;
Обратите внимание на косую черту в конце! общее правило звучит так: префикс из правила заменяется на путь, указанный в URL. То есть вашем случае запрос к /foo/swagger будет обслужен как /swagger: nginx заменит префикс /foo/ из правила на / из URL.