я хочу использовать директиву 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
'';
};
}
];
};