Исправление ошибки upstream timed out в nginx
Мне много приходится работать под разными операционными системами, и как-то раз дошла очередь и до настройки всем известного сервера nginx под Windows.
Всё шло хорошо, пока при очередном изменении конфигурации я не обнаружил, что страницы с реверс-прокси загружаются очень долго (ровно по 1 минуте), а nginx периодически пишет в логи вот такую ошибку:
upstream timed out (110: Connection timed out)
При этом примерно 50% запросов ко внутреннему ресурсу проходят нормально, а 50% падают по таймауту (по умолчанию таймаут — 1 минута) и только после этого завершаются.
Не буду томить ожиданием — похоже, это известный баг в nginx под Windows, и он как-то связан с поддержкой стека IPv6 под этой операционной системой. Дело в том, что я прописал прокси в nginx.conf
следующим образом:
server {
listen 80;
server_name subdomain.fornever.me;
location / {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_pass http://localhost:8080/;
}
}
По умолчанию localhost
в таком случае резолвится в ::1
(и это действительно стандартный IPv6-адрес для localhost
), однако примерно в половине случаев запросы не проходят. В чём причина такого странного поведения — пока непонятно, но народ на форумах жалуется на него уже несколько лет. Решение простое: не использовать localhost
в конфигурации nginx, а всегда вместо него писать IPv4-адрес текущего компьютера: 127.0.0.1
. IPv4-стек на Windows пока что не выделывает таких фокусов.