Исправление ошибки upstream timed out в nginx

Eng
Дата публикации: 2014-08-23

Мне много приходится работать под разными операционными системами, и как-то раз дошла очередь и до настройки всем известного сервера 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 пока что не выделывает таких фокусов.