proxy_pass с переменной nginx в качестве аргумента - PullRequest
0 голосов
/ 11 мая 2018

я хочу использовать директиву set nginx , чтобы использовать переменную в качестве аргумента proxy_pass, но это приводит к бесконечной 301 Moved Permanently ошибке в chrome при доступе к https://foo.de/myleaps с кодом ниже:

пример кода

user "reverse-proxy" "reverse-proxy";
error_log stderr;
daemon off;
events {}
http {
        server {
                listen 80;
                listen [::]:80;
                server_name foo.de;  
                location /myleaps {
                        rewrite     ^   https://$server_name$request_uri? permanent;
                }
        } server {
                ssl on;
                listen 443 ssl;
                listen [::]:443 ssl;
                server_name foo.de;
                ssl_certificate /var/lib/nixcloud/TLS/foo.de/selfsigned/fullchain.pem;
                ssl_certificate_key /var/lib/nixcloud/TLS/foo.de/selfsigned/key.pem;
                location /myleaps {
                        set $tttt http://127.0.0.1:3031/myleaps;
                        # https default flags
                        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_pass $tttt;
                }
                location /myleaps/leaps/ws {
                        # https websocket default flags
                        proxy_http_version 1.1;
                        proxy_set_header Upgrade $http_upgrade;
                        proxy_set_header Connection "upgrade";
                        proxy_set_header X-Forwarded-For $remote_addr;
                        proxy_read_timeout 36000s;
                        # required because of CORS
                        proxy_set_header Host $host;
                        proxy_pass http://127.0.0.1:3031/myleaps/leaps/ws;
                }
        }
}

с использованием жестко закодированных значений (без настройки)

при использовании этого:

proxy_pass http://127.0.0.1:3031/myleaps;

вместо:

proxy_pass $tttt;

это работает для моего примера.

, поэтому возникает вопрос: почему proxy_pass работает с жестко закодированной строкой, а не с использованием переменной?

мотивация

в обратном прокси здесь https://github.com/nixcloud/nixcloud-webservices/blob/be57d526547c66db05595002682525ca62c8f068/modules/services/reverse-proxy/default.nix#L144 код, который генерирует proxy_pass, в основном жестко запрограммирован, и если пользователь желает переопределить это, это будет действительно сложно.поэтому идея состоит в том, чтобы сгенерировать 3 переменные: ip, port и path и поместить их в область действия местоположения, а затем позволить пользователю позже использовать их.таким образом, я мог бы избавиться от жестко запрограммированной директивы proxy_pass, и пользователь был бы гораздо более гибким в изменении / генерации записи местоположения.

, поэтому код мог бы быть таким:

set $targetIP = ${location.ip};
set $targetPort = ${toString location.port}
set $targetPath = ${removeSuffix "/" (toString (builtins.toPath (location.path)))};

и 3 строки выше всегда будут сгенерированы в эту запись местоположения, несмотря ни на что.но приведенный ниже код генерируется динамически, и реализация по умолчанию может быть такой:

proxy_pass http://$targetIP:$targetPort$targetPath;

, но пользователь может просто переопределить его с помощью:

  nixcloud.reverse-proxy = {
    enable = true;
    extendEtcHosts = true;
    extraMappings = [
      {  
        domain = "example.com";
        path = "/";
        https = {
          mode = "on";
          basicAuth."joachim" = "foo";
          record = ''
            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_pass http://$targetIP:$targetPort$targetPath
          '';
        };
      }
    ];
  };

1 Ответ

0 голосов
/ 11 мая 2018

он работает с использованием $request_uri вместо жесткого кодирования пути proxy_pass с использованием $ targetPath:

set $targetIP 127.0.0.1;
set $targetPort 3031;
proxy_pass http://$targetIP:$targetPort$request_uri;

этот код скоро будет в nixcloud-webservices!

благодаря irc.freenode.net # nginx @ benbrown (Бен Браун) для этого решения!

...