I have a rather large and slow (complex data, complex frontend) web application build in RoR
and served by Puma
with nginx
as reverse proxy.
Looking at the nginx
error log, I see quite a few entries like:
2014/04/08 09:46:08 [warn] 20058#0: *819237 an upstream response is buffered to a temporary file
/var/lib/nginx/proxy/8/47/0000038478 while reading upstream,
client: 5.144.169.242, server: engagement-console.foo.it,
request: "GET /elements/pending?customer_id=2&page=2 HTTP/1.0",
upstream: "http://unix:///home/deployer/apps/conversationflow/shared/sockets/puma.sock:/elements/pending?customer_id=2&page=2",
host: "ec.reputationmonitor.it",
referrer: "http://ec.foo.it/elements/pending?customer_id=2&page=3"
I am rather curious as it's very unlikely that the page remains the same for different users and different user interactions, and I would not think that buffering the response on disk is necessary/useful.
I know about proxy_max_temp_file_size
and setting it to 0, but it seems to me a little bit awkward (my proxy tries to buffer but has no file where to buffer to… how can that be faster?).
My questions are:
-
How can I remove the [warn] and avoid buffering responses? Is it better to turn off
proxy_buffering
or to setproxy_max_temp_file_size
to 0? Why? -
If
nginx
buffers a response: When does it serve the buffered response, to whom, and why? -
Why
nginx
turnsproxy_buffering
on by default and then [warn]s you if it actually buffers a response? -
When does a response trigger that option? When it takes > some seconds (how many?) to serve the response? Is this configurable?
TIA, ngw.
Best Answer
You should set
proxy_max_temp_file_size
to 0 in order to remove it. Theproxy_buffering
directive isn't directly related to the warning. You can switch it off to stop any buffering at all but that isn't recommended in general (unless it's needed for Comet).It serves the response immediately, but a client usually has a much slower connection and can't consume the response data as fast as it is produced by your application. Nginx tries to buffer the whole response in order to release your application ASAP.
See also: http://aosabook.org/en/nginx.html
As I already mentioned, the
proxy_buffering
isn't directly related to the warning. It's generally needed for optimized proxy operations and turning it off degrades performance and throughput.Nginx only warns you when a response doesn't fit into configured memory buffers. You may ignore the warning if it's ok for you.
It triggers when memory buffers are full. Please, look at the docs, the whole mechanism is explained: http://nginx.org/r/proxy_max_temp_file_size
You may want to increase memory buffers.