Estoy tratando de configurar nginx para revertir el proxy a un puerto de forma dinámica en función del puerto que se encuentra en la ruta.
Entonces https://my-nginx.uksouth.cloudapp.azure.com/58585/some/route va a https://localhost:58585/some/route
Y https://my-nginx.uksouth.cloudapp.azure.com/59595/some/route va a https://localhost:59595/some/route
Puedo codificar la configuración de esta manera
server { server_tokens off; server_name my-nginx.uksouth.cloudapp.azure.com; listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/my-nginx.uksouth.cloudapp.azure.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/my-nginx.uksouth.cloudapp.azure.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot location /58585 { proxy_pass http://localhost:58585/; 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 https; proxy_redirect off; } location /59595 { proxy_pass http://localhost:59595/; 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 https; proxy_redirect off; } } server { if ($host = my-nginx.uksouth.cloudapp.azure.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80 default_server; listen [::]:80 default_server; server_name my-nginx.uksouth.cloudapp.azure.com; return 404; # managed by Certbot }y proxy inverso como este
ssh -R 58585:localhost:58585 myuser@my-nginx.uksouth.cloudapp.azure.com ssh -R 59595:localhost:59595 myuser@my-nginx.uksouth.cloudapp.azure.comEsto funciona como se esperaba; entonces he tratado de hacer esto dinámico
Entonces https://my-nginx.uksouth.cloudapp.azure.com/targetPort/some/route va a https://localhost:$targetPort/some/route
Lo mejor que se me ocurre es lo siguiente, pero sigue fallando y con una puerta de enlace 502 incorrecta.
location ~ /([0-9]+) { set $targetPort $1; proxy_pass http://localhost:$targetPort/; 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 https; proxy_redirect off; }¿Alguien puede guiarme con la forma correcta de hacer esto? ¡Gracias!
Según la documentación :
En algunos casos, no se puede determinar la parte de un URI de solicitud que se va a reemplazar:
Cuando la ubicación se especifica mediante una expresión regular y también dentro de ubicaciones con nombre.
En estos casos,
proxy_passdebe especificarse sin URI.
Creo que puedes intentar usar la rewrite aquí para especificar un URI:
location ~ ^/(\d+) { set $targetPort $1; rewrite /\d+(.*) $1 break; proxy_pass http://localhost:$targetPort; ... }Tal vez esto se pueda optimizar para una coincidencia de expresiones regulares en lugar de dos:
location ~ ^/(\d+)(.*) { set $targetPort $1; set $newuri $2; rewrite . $newuri break; proxy_pass http://localhost:$targetPort; ... }Pero debe probarse, el comportamiento de nginx a veces es impredecible.
Actualizar
Esto definitivamente se puede optimizar para
location ~ ^/(?<targetPort>\d+)(?<newURI>.*) { rewrite . $newURI break; proxy_pass http://localhost:$targetPort; ... }