Подтвердить что ты не робот

Обратный прокси-сервер Nginx, вызывающий 504 Тайм-аут шлюза

Я использую Nginx в качестве обратного прокси-сервера, который принимает запросы, а затем делает proxy_pass для получения фактического веб-приложения с восходящего сервера, работающего на порту 8001.

Если я перейду на mywebsite.com или сделаю wget, я получаю 504 Gateway Timeout через 60 секунд... Однако, если я загружаю mywebsite.com:8001, приложение загружается как ожидалось!

Итак, что-то не разрешает nginx связываться с восходящим сервером...

Все это началось после того, как моя хостинговая компания reset работала на моем компьютере, до этого не возникало никаких проблем.

Здесь мой серверный сервер vhosts:

server {

        listen   80;
        server_name mywebsite.com;

        root /home/user/public_html/mywebsite.com/public;

        access_log /home/user/public_html/mywebsite.com/log/access.log upstreamlog;
        error_log /home/user/public_html/mywebsite.com/log/error.log;

        location / {

                    proxy_pass http://xxx.xxx.xxx.xxx:8001;
                    proxy_redirect off;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                    }

        } 

И вывод из моего журнала ошибок Nginx:

2014/06/27 13:10:58 [error] 31406 # 0: * 1 тайм-аут восходящего потока (110: время ожидания соединения) при подключении к восходящему потоку, клиент: xxx.xx.xxx.xxx, сервер: mywebsite.com, request: "GET/HTTP/1.1", вверх по течению: "http://xxx.xxx.xxx.xxx:8001/", хост: "mywebsite.com"

4b9b3361

Ответ 1

Вероятно, можно добавить еще несколько строк, чтобы увеличить период ожидания до восходящего потока. В приведенных ниже примерах установлен тайм-аут до 300 секунд:

proxy_connect_timeout       300;
proxy_send_timeout          300;
proxy_read_timeout          300;
send_timeout                300;

Ответ 2

Увеличение тайм-аута вряд ли решит вашу проблему, поскольку, как вы говорите, фактический целевой веб-сервер отлично реагирует.

У меня была эта же проблема, и я обнаружил, что это связано с тем, что вы не используете keep-alive в соединении. Я не могу ответить на вопрос, почему это так, но при очистке заголовка соединения я решил эту проблему, и запрос был проксирован просто отлично:

server {
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_pass http://localhost:5000;
    }
}

Взгляните на эти сообщения, которые объясняют это более подробно: nginx закрыть восходящее соединение после запроса Прояснить заголовок заголовка http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive