Я использую Nginx в качестве обратного прокси-сервера, который принимает запросы, а затем выполняет proxy_pass для получения фактического веб-приложения с вышестоящего сервера, работающего на порту 8001.
Если я захожу на mywebsite.com или выполняю wget, то через 60 секунд я получаю таймаут шлюза 504 ... Однако, если я загружаю mywebsite.com:8001, приложение загружается должным образом!
Итак, что-то мешает Nginx взаимодействовать с вышестоящим сервером.
Все это началось после того, как моя хостинговая компания сбросила машину, на которой работали мои вещи, до этого никаких проблем не было.
Вот мой серверный блок 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 upstream timed out (110: Connection timed out) while connecting to upstream, client: xxx.xx.xxx.xxx, server: mywebsite.com, request: "GET / HTTP/1.1", upstream: "http://xxx.xxx.xxx.xxx:8001/", host: "mywebsite.com"
nginx
reverse-proxy
proxypass
http-status-code-504
Дэйв Рома
источник
источник
Ответы:
Возможно, можно добавить еще несколько строк, чтобы увеличить период ожидания для восходящего потока. В приведенных ниже примерах время ожидания устанавливается равным 300 секундам:
источник
proxy_read_timeout
при отладке на бэкэнде. Спасибо!Увеличение тайм-аута вряд ли решит вашу проблему, поскольку, как вы говорите, фактический целевой веб-сервер отвечает нормально.
У меня была такая же проблема, и я обнаружил, что это связано с тем, что в соединении не используется keep-alive. Я не могу ответить, почему это так, но, очистив заголовок соединения, я решил эту проблему, и запрос был проксирован просто отлично:
Взгляните на эти сообщения, которые объясняют это более подробно: nginx закрывает восходящее соединение после запроса. Уточнение заголовка Keep-alive http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
источник
proxy_set_header Connection "";
lol, не используйте runclouduser2540984 , а также многие другие указали, что вы можете попробовать увеличить настройки времени ожидания. Я сам столкнулся с аналогичной проблемой и попытался изменить настройки тайм-аута в файле /etc/nginx/nginx.conf , как предлагают почти все в этих потоках. Однако это мне нисколько не помогло; в настройках тайм-аута NGINX не было явных изменений. После многих часов поиска мне наконец удалось решить мою проблему.
Решение находится в этой ветке форума , и в нем говорится, что вы должны поместить настройки тайм-аута в /etc/nginx/conf.d/timeout.conf (и если этот файл не существует, вы должны его создать). Я использовал те же настройки, что и в ветке:
Возможно, это не решение вашей конкретной проблемы, но если кто-то еще заметит, что изменения тайм-аута в /etc/nginx/nginx.conf ничего не делают, я надеюсь, что этот ответ поможет!
источник
server{}
или что-то еще? Эта ошибка появляется сразу через 5 минут. Я перезагружаю, перезагружаюсь, и она никогда не проходит дольше этих 5 минут или 300 секунд. Есть еще идеи для исправления это?Добавьте строки ниже в
http
раздел/usr/local/etc/nginx/nginx.conf
или/etc/nginx/nginx.conf
файл.Если вышеуказанных строк нет в
conf
файле, добавьте их, в противном случае увеличьтеfastcgi_read_timeout
иproxy_read_timeout
убедитесь, что у nginx и php-fpm не истекло время ожидания.и после добавления этих строк
nginx.conf
не забудьте перезапустить nginx.или, если вы пользуетесь услугами камердинера, просто введите
valet restart
.источник
fastcgi_read_timeout 600;
proxy_read_timeout 600;
Вы также можете столкнуться с этой ситуацией, если ваш вышестоящий сервер использует доменное имя и его IP-адрес изменяется (например, ваш вышестоящий сервер указывает на AWS Elastic Load Balancer).
Проблема в том, что nginx разрешит IP-адрес один раз и сохранит его в кэше для последующих запросов, пока конфигурация не будет перезагружена.
Вы можете указать nginx использовать сервер имен для повторного разрешения домена после истечения срока действия кэшированной записи:
Документы на proxy_pass объясняют, почему этот трюк работает:
Престижность "Nginx с динамическими восходящими потоками" (tenzer.dk) за подробное объяснение, которое также содержит некоторую важную информацию об оговорках этого подхода в отношении перенаправленных URI.
источник
Была такая же проблема. Оказалось, это было вызвано отслеживанием подключения iptables на вышестоящем сервере. После удаления
--state NEW,ESTABLISHED,RELATED
из брандмауэра скрипта и прошивкиconntrack -F
проблема исчезла.источник
Сам NGINX не может быть основной причиной.
ЕСЛИ «минимальное количество портов на экземпляр виртуальной машины», установленное на шлюзе NAT, которое стоит между вашим экземпляром NGINX и
proxy_pass
местом назначения, слишком мало для количества одновременных запросов, его необходимо увеличить.Решение. Увеличьте доступное количество портов на каждую виртуальную машину на шлюзе NAT.
Контекст В моем случае в Google Cloud обратный прокси-сервер NGINX был размещен внутри подсети со шлюзом NAT. Экземпляр NGINX перенаправлял запросы в домен, связанный с нашим внутренним API (восходящим потоком), через шлюз NAT.
Эта документация от GCP поможет вам понять, какое отношение NAT имеет к таймауту NGINX 504.
источник
В моем случае я перезапускаю php, и все становится нормально.
источник