Как настроить местоположение блока, чтобы очистить порт от URL - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь настроить nginx для обратного прокси-сервера к порту динамически на основе порта, найденного в пути.

Итак, https://my-nginx.uksouth.cloudapp.azure.com/58585/some/route переходит к https://localhost:58585/some/route

И https://my-nginx.uksouth.cloudapp.azure.com/59595/some/route переходит к https://localhost:59595/some/route

Я могу жестко запрограммировать конфигурацию, подобную этой

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
}

и обратный прокси-сервер, подобный этой

ssh -R 58585:localhost:58585 myuser@my-nginx.uksouth.cloudapp.azure.com
ssh -R 59595:localhost:59595 myuser@my-nginx.uksouth.cloudapp.azure.com

Это работает, как и ожидалось; затем я попытался сделать эту динамику c

Так что https://my-nginx.uksouth.cloudapp.azure.com/targetPort/some/route переходит к https://localhost:$targetPort/some/route

Лучшее, что я могу придумать, - это следующее, но это не помогает и с 502 плохих шлюза.

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;
}

Может кто-нибудь подсказать мне правильный способ сделать это? Спасибо!

1 Ответ

1 голос
/ 19 марта 2020

В соответствии с документацией :

В некоторых случаях невозможно определить часть заменяемого URI запроса:

  • Когда местоположение указывается с помощью регулярного выражения, а также внутри именованных расположений.

    В этих случаях proxy_pass следует указывать без URI.

Я думаю, что вы можете попытаться использовать rewrite здесь, чтобы указать URI:

location ~ ^/(\d+) {
    set $targetPort $1;
    rewrite /\d+(.*) $1 break;
    proxy_pass http://localhost:$targetPort;
    ...
}

Возможно, это можно оптимизировать для одного совпадения с регулярным выражением вместо двух:

location ~ ^/(\d+)(.*) {
    set $targetPort $1;
    set $newuri $2;
    rewrite . $newuri break;
    proxy_pass http://localhost:$targetPort;
    ...
}

Но это необходимо проверить, nginx поведение иногда непредсказуемо.

Обновление

Это определенно можно оптимизировать до

location ~ ^/(?<targetPort>\d+)(?<newURI>.*) {
    rewrite . $newURI break;
    proxy_pass http://localhost:$targetPort;
    ...
}
...