January 27, 2014 10:58AM
Добрый день. Столкнулся с проблемой, когда срабатывает 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 флагов от бакэнда, либо это какой-то глюк?
Subject Author Posted

proxy_read_timeout закрывает соединение, не получив ответ

nginx_problem January 27, 2014 10:58AM

Re: proxy read timeout закрывает соединение, не получив ответ

Maxim Dounin January 27, 2014 11:12AM

Re: proxy read timeout закрывает соединение, не получив ответ

nginx_problem January 27, 2014 12:05PM

Re: proxy read timeout закрывает соединение, не получив ответ

Валентин Бартенев January 27, 2014 12:22PM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 273
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready