nginx silently drops response body of POST depending on its length

Maxim Dounin mdounin at mdounin.ru
Mon May 9 14:52:35 MSD 2011


Hello!

On Sun, May 08, 2011 at 03:15:28PM -0400, zildjohn01 wrote:

> I've come across an incredibly weird problem with POST responses using
> nginx 1.0.1 and uWSGI 0.9.7.2 on CentOS 5.6.
> 
> uWSGI successfully sends the response body to nginx, but nginx seems to
> ignore it if both (1) the request method is POST, and (2) the response
> length is less than 4052 bytes. The issue doesn't occur when serving
> directly using `uwsgi --http`, so I'm pretty sure the problem is
> something to do with nginx.
> 
> To explain things in code, this Python results in the desired response:
> 
> ....def app_uwsgi(environ, start_response):
> ........start_response('200 OK', [('Content-type', 'text/html')])
> ........return [b'x' * 4052]
> 
> while this results in zero bytes being sent to the client for POST
> requests:
> 
> ....def app_uwsgi(environ, start_response):
> ........start_response('200 OK', [('Content-type', 'text/html')])
> ........return [b'x' * 4051]
> 
> I stripped down to a minimal nginx.conf, and the issue still occurs:
> 
> ....events {
> ........worker_connections  1024;
> ....}
> 
> ....http {
> ........upstream uwsgi_connect {
> ............server  127.0.0.1:39275;
> ........}
> 
> ........server {
> ............listen       20101;
> ............server_name  domain.net;
> 
> ............location / {
> ................uwsgi_pass  uwsgi_connect;
> ................include     uwsgi_params;
> ............}
> ........}
> ....}
> 
> Does anyone have any clue what could be causing this behavior?

As it was already said - you have to read body of POST before 
sending reply.  Else you'll get something like

... readv() failed (54: Connection reset by peer) while reading 
upstream ...

in nginx error log and possibly incorrect reply (depending on various 
factors, including sizes and event method used).

Maxim Dounin



More information about the nginx mailing list