Nginx Рекурсивное разрешение 301/302 - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь использовать Nginx обратный прокси-сервер (подключен к inte rnet) для предоставления доступа к онлайн-обновлениям для сервера Jenkins (который не подключен к rnet).

Я изменил файл hosts на сервере Jenkins так, чтобы домены обновлений имели IP-адрес Nginx Сервера. Это работает правильно.

Фактический URL-адрес файла метаданных обновления имеет серию перенаправлений для указания на реальный файл: http://updates.jenkins-ci.org/update-center.json?id=default&version=2.222.1
возвращает 301 для:
http://updates.jenkins-ci.org/stable-2.222/update-center.json
возвращает 302 для:
http://mirrors.jenkins-ci.org/updates/stable-2.222/update-center.json
возвращает 302 для:
http://mirror.serverion.com/jenkins/updates/stable-2.222/update-center.json

Мне нужно Nginx, чтобы разрешить каждое из перенаправлений и вернуть файл. Я установил рекурсивный обработчик ошибок, который должен делать это, используя информацию из этих сообщений: https://serverfault.com/questions/423265/how-to-follow-http-redirects-inside-nginx/792035

Перехват переадресации 301/302 бэкэнда (proxy_pass) и переписывание в возможен другой блок местоположения?

Кажется, что Nginx правильно разрешает ошибки 301 и первые 302, но не разрешает последнюю. Затем он возвращает 302 найденных, но не имеет заголовка Location.

Возвращенное содержимое:

$ curl -vv -i -H "Host: updates.jenkins-ci.org" "http://localhost/update-center.json?id=default&version=2.222.1"
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /update-center.json?id=default&version=2.222.1 HTTP/1.1
> Host: updates.jenkins-ci.org
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 302 Moved Temporarily
HTTP/1.1 302 Moved Temporarily
< Server: nginx/1.10.3 (Ubuntu)
Server: nginx/1.10.3 (Ubuntu)
< Date: Thu, 02 Apr 2020 14:35:22 GMT
Date: Thu, 02 Apr 2020 14:35:22 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 170
Content-Length: 170
< Connection: keep-alive
Connection: keep-alive

< 
<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>nginx/1.10.3 (Ubuntu)</center>
</body>
</html>
* Connection #0 to host localhost left intact

Nginx .conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;


events {
        worker_connections 768;
        # multi_accept on;
}

http {
    error_log /var/log/nginx/debug.log debug;
    resolver 127.0.1.1 ipv6=off;

    server {
        listen *:80;
        server_name updates.jenkins.io;
        location / {
            proxy_pass http://updates.jenkins.io/;
            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_intercept_errors on;
            error_page 301 302 307 = @handle_redirect;
            recursive_error_pages on;
        }
        location @handle_redirect {
            proxy_intercept_errors on;
            error_page 301 302 307 = @handle_redirect;
            set $saved_redirect_location '$upstream_http_location';
            proxy_pass $saved_redirect_location;
        }
    }
    server {
        listen *:80;
        server_name updates.jenkins-ci.org;
        location / {
            proxy_pass http://updates.jenkins-ci.org/;
            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;
            recursive_error_pages on;
            proxy_intercept_errors on;
            error_page 301 302 307 = @handle_redirect;
        }
        location @handle_redirect {
            proxy_intercept_errors on;
            error_page 301 302 307 = @handle_redirect;
            set $saved_redirect_location '$upstream_http_location';
            proxy_pass $saved_redirect_location;
        }
    }
}

Вот вывод из tcpdump работает на сервере Nginx (192.168.125.57 Jenkins, 172 ... Nginx, 52 ... Сайт обновления) TCP Dump

Я загрузил Nginx журнал отладки здесь: Nginx журналы отладки . Он был захвачен в блоке 'server'.

Я тестировал с помощью команд cURL:

curl -vv -i -H "Host: updates.jenkins-ci.org" "http://localhost/update-center.json?id=default&version=2.222.1"

Однако, если я cURL результат первых 301, он правильно возвращает JSON файл:

curl -vv -i -H "Host: updates.jenkins-ci.org" "http://localhost/stable-2.222/update-center.json"
...