Назад | Перейти на главную страницу

nginx upstream не работает

upstream не работает, когда прокси-сервер имеет привязка более одного имени хоста на тот же порт.

Я столкнулся с этой проблемой при настройке nginx (1.9.12-1 ~ надежный) к proxy_pass а Windows Server 2012 хост.

Я сам воспроизвел то же поведение Windows 10 машина.

В приведенной ниже конфигурации все имена хостов указывают на один и тот же IP-адрес машины.

Запросы иногда работают

Примечание: я подозреваю, что это когда localhost:7778 выбран для прокси.

http {
    upstream w {
        server test1:80;
        server test2:80;
        server localhost:7778;
    }

    server {
        listen       8001;
        server_name  localhost;

        location / {
            proxy_pass http://w;
        }
    }
}

Запросы не работают постоянно

Примечание: отредактировано по указанию Алексея.

http {
    upstream w {
        server test1:80;
        server test2:80;
        # server localhost:7778;
    }

    server {
        listen       8001;
        server_name  localhost;

        location / {
            proxy_pass http://w;
        }
    }
}

Запросы работают все время

http {

    server {
        listen       8001;
        server_name  localhost;

        location / {
            proxy_pass http://test1:80;
        }
    }
}

или

http {

    server {
        listen       8001;
        server_name  localhost;

        location / {
            proxy_pass http://test2:80;
        }
    }
}

или

http {

    server {
        listen       8001;
        server_name  localhost;

        location / {
            proxy_pass http://localhost:7778;
        }
    }
}

Есть ли способ обойти это?

Когда вы используете proxy_pass без proxy_set_header директивы, nginx будет использовать некоторые заголовки по умолчанию. В большинстве случаев это то, что вам нужно или, по крайней мере, безвредно, но в вашем случае вам придется установить их вручную.

Когда ты пишешь proxy_pass http://w, nginx установит proxy_set_header Host w. Если вам нужен другой Host заголовок, вы должны установить его явно. Чаще всего используется proxy_set_header Host $host (или proxy_set_header Host $http_host).

Итак, это должно сработать для вас:

upstream w {
    server test1:80;
    server test2:80;
    server localhost:7778;
}

server {
    listen       8001;
    server_name  localhost;

    location / {
        proxy_pass http://w;
        proxy_set_header Host $host;
    }
}