Estoy usando nginx en un escenario de proxy inverso estándar, para pasar todas las solicitudes a /auth a otro host, sin embargo, estoy tratando de usar puertos no estándar.
Mi objetivo final es tener el encabezado X-Forwarded-Port establecido en el puerto en el que entra la solicitud.
Aquí está mi bloque de ubicación en nginx.conf:
location /auth/ { proxy_pass http://otherhost:8090; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port <VAR>; }
Este nginx se ejecuta en un contenedor acoplable, que está configurado para reenviar solicitudes de 8085 a 80 en el contenedor, de modo que el proceso de nginx escucha en 80:
0.0.0.0:8085->80/tcp
Cuando presiono la URL:
Me redirigen correctamente a http://otherhost:8090 , pero falta el encabezado X-Forwarded-Port o es incorrecto.
Donde tengo <VAR> en el bloque original, he intentado lo siguiente:
$server_port : este es el puerto en el que nginx está escuchando (80), no el puerto de solicitud.
$pass_port : parece ser nulo en mi configuración, por lo que nginx elimina el encabezado.
$http_port : este es un puerto aleatorio por solicitud.
$remote_port : este es un puerto aleatorio por solicitud.
Puedo cambiar mi configuración en el momento de la implementación para codificar en el puerto conocido de las solicitudes entrantes, pero idealmente podría cambiar el puerto frontal sin ningún cambio en la configuración de nginx.
Revisé la lista de variables nginx pero no puedo encontrar nada como $request_port . ¿Hay alguna forma de lograr mi intención?
La única solución que he encontrado es usar una regla de map para obtener el puerto de la variable http_host , por ejemplo
map $http_host $port { default 80; "~^[^\:]+:(?<p>\d+)$" $p; }Esta es una idea aproximada para escribir Nginx conf, pero estoy seguro de que esto puede ayudarlo en la redirección
server { listen 80; server_name host.docker.internal; # By default land on localhost:80 to root so in root we copied UI build to the ngnix html dir. # have a look to docker-compose uiapp service. location / { root /usr/share/nginx/html; index index.html index.htm; } # after location add filter, from which every endpoint starts with or comes in endpoint # so that ngnix can capture the URL and reroute it. # like /backend/getUserInfo/<UserId> # In above example /backend is that filter which will be captured by Ngnix and reroute the flow. location /backend { proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #proxy_pass http://<ContainerName>:<PortNumber>; # In our case Container name is as we setup in docker-compose `beservice` and port 8080 proxy_pass http://beservice:8080; } }Para más detalles puedes echar un vistazo a este proyecto
Dentro del contenedor no puede acceder a la configuración externa. Y nginx no admite el uso de variables de entorno dentro de la mayoría de los bloques de configuración.
Pero si usa poco , puede definir sus puertos, rutas, etc. en un archivo env simple. Esta definición utilizada por la configuración de docker-compose o la variable env también. Por ejemplo
yourconfig.env
PROJECT_HOME=.. MAGIC_DOCKER_PORT=8085archivo poco.yml (configuración principal de su proyecto, definir planes)
version: '3.0' maintainer: "youremail@yourdomain.com" environment: include: docker/conf/yourconfig.env plan: live: description: "your plan to run live" docker-compose-file: - docker/dc-proxy.yml - docker/dc-other-service.yml # you can define other plans to run local/dev envy en el archivo de composición docker/dc-proxy.yml (parte relevante):
version: '3' services: proxy: image: nginx:alpine env_file: conf/yourconfig.env ports: - ${MAGIC_DOCKER_PORT}:80 command: /bin/sh -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"y, por último, la parte relevante de su plantilla de configuración de /etc/nginx/conf.d/mysite.template
listen ${MAGIC_DOCKER_PORT}; ... location /auth/ { ... proxy_set_header X-Forwarded-Port ${MAGIC_DOCKER_PORT}; ... }Utilizo la siguiente estructura de carpetas para organizar archivos. No es obligatorio, pero es fácil de usar para mí porque la estructura de cada proyecto es la misma.
/ docker <- all of docker related files here conf <- env files, service configs, etc scripts <- shell scripts which used by containers dc-*.yml <- separate all services into single compose files poco.yml <- main config, "start here" point project-related-files <- separated by each service Defina un par clave-valor en el archivo .env. Poco lo usa para crear archivos docker-compose, y se usa para crear una variable de entorno en el contenedor nginx. Después de eso, use envsubst para completar la plantilla de configuración de nginx y, por último, inicie el servicio de nginx