Обратный прокси-сервер 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"
Ответы
Ответ 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