Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
proxy read timeout закрывает соединение, не получив ответ
- To: nginx-ru@xxxxxxxxx
- Subject: proxy read timeout закрывает соединение, не получив ответ
- From: "nginx_problem" <nginx-forum@xxxxxxxx>
- Date: Mon, 27 Jan 2014 10:58:31 -0500
- Dkim-signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=selenium.jlkhosting.com; s=x; h=Date:Sender:From:Message-ID:Content-Transfer-Encoding:Content-Type:Subject:To; bh=0xp0wB7GEiDaT3hcWu/9g4846euut7FbQTh2DWBXZnY=; b=RXxe24LY2KFdxyqyaVkaHYvVYHAM7HLgCIclWWtupWZqiRaVSSZWUZjYXV7np0E3Y0uEr54bH9zxQebwbva69r0ASI9kAPh+ngrKvNtLkVFGeSFGvYVclI/NlWNCbxp+AT4JJUBvpOe2p4utYakjDOQu26bajId0+SARQH3zFko=;
Добрый день. Столкнулся с проблемой, когда срабатывает proxy_read_timeout
еще до получения какого-либо ответа от бакэнда.
Ситуация такая: есть скрипт, который отправляет POST данные на локальный
nginx, который проксирует запрос на upstream backend и получает ответ.
Сначала причиной таймаута оказался HTTP/100 Continue. По советам перевел
запрос в HTTP/1.0: в курл добавил опцию curl_setopt($Curl,
CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0), в nginx добавил
proxy_http_version 1.0; При этом apache backend все равно отвечал HTTP/1.1 с
предварительным HTTP/100 Continue. Конфиг апача стандартный. Пришлось
ставить загрушку в виде force-response-1.0 downgrade-1.0 для апача, в итоге
перестал получать HTTP/100 Continue, но проблема с таймаутом не пропала.
часть конфигурации nginx:
location / {
proxy_pass http://backend/;
proxy_next_upstream error timeout http_500 http_502 http_503
http_504;
proxy_redirect off;
proxy_buffering off;
proxy_intercept_errors off;
reset_timedout_connection on;
error_page 502 503 504 =403 @error_backend;
send_timeout 8s;
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 12s;
client_body_timeout 20s;
proxy_http_version 1.0;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header X-Upstream $upstream_addr;
}
location @error_backend {
return 403 $upstream_addr;
}
для воспроизведения ошибки без посторонних факторов на бакэнде сделал
скрипт
<?php sleep(20); ?>
отправил 450 байт данных через POST и записал пакеты через tcpdump.
вот что получилось (ip1 - nginx, ip2 - apache backend):
1 0.000000 ip1 ip2 TCP 17433 > http [SYN] Seq=0
Win=14600 Len=0 MSS=1460
WS=7
2 0.097472 ip2 ip1 TCP http > 17433 [SYN, ACK] Seq=0
Ack=1 Win=5840 Len=0
MSS=1460 WS=7
3 0.097577 ip1 ip2 TCP 17433 > http [ACK] Seq=1 Ack=1
Win=14720 Len=0
4 0.097655 ip1 ip2 HTTP POST /script.php HTTP/1.0
(application/x-www-form-urlencoded)
5 0.195452 ip2 ip1 TCP http > 17433 [ACK] Seq=1
Ack=685 Win=7296 Len=0
6 12.067504 ip1 ip2 TCP 17433 > http [FIN, ACK] Seq=685
Ack=1 Win=14720
Len=0
7 12.206336 ip2 ip1 TCP http > 17433 [ACK] Seq=1
Ack=686 Win=7296 Len=0
8 20.196969 ip2 ip1 HTTP HTTP/1.0 200 OK (text/html)
9 20.197196 ip2 ip1 TCP http > 17433 [FIN, ACK] Seq=194
Ack=686 Win=7296
Len=0
10 23.195793 ip2 ip1 HTTP [TCP Retransmission] HTTP/1.0
200 OK (text/html)
11 29.195275 ip2 ip1 HTTP [TCP Retransmission] HTTP/1.0
200 OK (text/html)
апач после того, как принял POST, ответил нормальным ACK, и nginx судя по
всему с этого момента начинает отсчет proxy_read_timeout, но ведь никаких
данных от бакэнда принято еще не было.
Подскажите, нормальная ли это работа proxy_read_timeout и он действительно
включается даже после TCP флагов от бакэнда, либо это какой-то глюк?
Posted at Nginx Forum:
http://forum.nginx.org/read.php?21,246872,246872#msg-246872
_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru
|