epoll_wait() reported that client prematurely closed connection

Валентин Бартенев vbart at nginx.com
Fri Sep 19 14:21:22 UTC 2014


On Friday 19 September 2014 09:52:53 ole-lukoje wrote:
> Валентин, скажите, а почему директива proxy_ignore_client_abort не поможет ?
> Как я понял, она служит для того, чтобы гарантировать, что nginx не будет
> разрывать соединение с проксируемым сервером, если клиент по какой-то
> причине разорвал соединение с nginx. Почему она не помогает ? (и кстати да,
> при включении создается ощущение, что она никак вообще не влияет на
> процесс).

Как уже написал в предыдущем письме, она влияет лишь на отслеживание закрытия
соединения до начала передачи ответа.  Если клиент закрыл соединения после
начала передачи ответа, то соединение с бэкендом будет закрыто также, вне
зависимости от значение директивы, за исключением случаев, когда нужно 
сохранить ответ в кэш или в файл.

Директива proxy_ignore_client_abort нужна в одном из следующих случаев:

 1. Для совместимости с клиентами, которые делают SHUT_WR на соединении
    после отправки запроса;

 2. Когда бэкенд не отслеживает закрытие соединения во время обработки
    запроса, а вы используете limit_conn и хотите чтобы модуль продолжал
    учитывать этот запрос до тех пор, пока бекенд не сформирует ответ
    и не начнет его отдавать;

 3. Когда бэкенд отслеживает закрытие соединения, но, по тем или иным
    причинам, вы не хотите чтобы это происходило до начала передачи
    ответа.

Как видите, ни один из них не гарантирует того, что nginx не будет
закрывать соединение уже после начала передачи ответа.


> 
> Я proxy_store не использовал, но она, вроде, позволяет сохранять ответ от
> прокс. сервера в файле (или если файл получили, то сохранять файл) в кэше.
> 
> 
> НО тут есть 2 момент, 
>           проксируемый сервер выдает картинки (которые он получает от других
> серверов, делает некоторые манипуляции), 
>           и картинка под одним и тем же именем может представлять разные
> изображения, 
> поэтому, видимо, proxy_store использовать нельзя.

Я не предлагал вам сохранять файл для последующего использования.
Сохранять вы его можете хоть в /dev/null, просто nginx в этом случае
не будет закрывать соединение с бэкендом, пока не получит ответ целиком.

Если вы в самом деле планируете использовать кэш, то и проблемы у вас
быть не должно.

--
Валентин Бартенев


Подробная информация о списке рассылки nginx-ru