Nginx日志分时间变量分析

ngx_http_upstream_module中时间相关变量

Nginx日志分时间变量分析

$request_time

request processing time in seconds with a milliseconds resolution; 
time elapsed between the first bytes were read from the client and 
the log write after the last bytes were sent to the client

nginx服务从发起请求的客户端获取到第一个字节开始,到返回给客户端最后一个字节后,日志写入文件所经过的时间。单位为秒

$request_time 中包含了数据返回时间
$request_time 中包含了日志打印的时间

$upstream_connect_time (1.9.1+)

keeps time spent on establishing a connection with the upstream server (1.9.1);
the time is kept in seconds with millisecond resolution. In case of SSL, includes time spent on handshake. 
Times of several connections are separated by commas and colons like addresses in the $upstream_addr variable.

nginx服务,从与上游服务开始建立连接,到连接建立成功,所经过的时间。单位为秒。

$upstream_header_time (1.7.10)

keeps time spent on receiving the response header from the upstream server (1.7.10);
the time is kept in seconds with millisecond resolution. 
Times of several responses are separated by commas and colons like addresses in the $upstream_addr variable.

nginx服务,从与上游服务开始建立连接,到接收到响应返回头的第一个字节,所经过的时间。单位为秒。

程序真正的运行时间 = upstream_header_time - upstream_connect_time

$upstream_response_time

keeps time spent on receiving the response from the upstream server; 
the time is kept in seconds with millisecond resolution. 
Times of several responses are separated by commas and colons like addresses in the $upstream_addr variable.

nginx服务从与上游服务开始建立连接,到接收完响应返回的最后一个字节,所经过的时间。单位为秒。



nginx缓冲区优化(从后端代理服务器读取响应)

开启缓冲之后,nginx会尽快的从后端代理服务器接收响应数据,然后将其存放到由proxy_buffer_sizeproxy_buffers指令设置的缓存中。

假如整个响应数据超出了内存缓冲的大小,其中的一部分响应数据会被存放到硬盘的零时文件(temporary file)中。该临时文件由proxy_max_temp_file_sizeproxy_temp_file_write_size指令所控制。

禁用响应缓存后,则当nginx收到后端代理服务器的响应信息时,会马上将响应信息同步的发送给客户端。nginx一次性可以从后端服务器接收的数据大小为proxy_buffer_size



proxy_buffering指令 (开启缓存)

Syntax:	proxy_buffering on | off;
Default:	
proxy_buffering on;
Context:	http, server, location

proxy_buffer_size指令

Syntax:	proxy_buffer_size size;
Default:	
proxy_buffer_size 4k|8k;
Context:	http, server, location

用于设置从后端代理服务器读取到的初始响应部分(first part of the response)所使用的缓存大小

    注: proxy_buffer_size通常只作为响应头的缓冲区,没必要设置的太大,一般设置为4K就够了

proxy_buffers指令

Syntax:	proxy_buffers number size;
Default:	
proxy_buffers 8 4k|8k;
Context:	http, server, location

针对每一个单独的连接,用于设置从后端代理服务器读取响应所使用的缓存的个数(number)及大小(size), proxy_buffers由缓冲区数量和缓冲区大小组成的,总的大小为number * size

   proxy_buffers的缓冲区大小一般会设置的比较大,以应付大网页

若某些请求的响应过大,则超过proxy_buffers的部分将被缓冲到硬盘(缓冲目录由proxy_temp_path指令指定),当然这将会使读取响应的速度减慢,影响用户体验,可以使用proxy_max_temp_file_size指令关闭磁盘缓冲

proxy_busy_buffers_size指令

Syntax:	proxy_busy_buffers_size size;
Default:	
proxy_busy_buffers_size 8k|16k;
Context:	http, server, location

当使用proxy_buffering指令启用了对后端代理服务器的响应缓冲时,通过本指令来限制在后端响应未全部读取完的情况下,最多size大小的缓冲处于busy状态以将响应返回给客户端。在这段时间内,剩余的缓冲可以被用于继续读取后端代理服务器的响应,甚至在必要的情况下将响应数据缓存到临时文件。默认情况下,size的大小受到指令proxy_buffer_size以及指令proxy_buffers中size参数的限制。

proxy_busy_buffers_size不是独立的空间,它是proxy_buffers和proxy_buffer_size的一部分。nginx会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据(这部分的大小是由proxy_busy_buffers_size来控制,建议为proxy_buffers中单个缓冲区大小的2倍),然后它继续从后端取数据,缓冲区满了之后就写到磁盘的临时文件中

proxy_max_temp_file_size指令

Syntax:	proxy_max_temp_file_size size;
Default:	
proxy_max_temp_file_size 1024m;
Context:	http, server, location

当使用proxy_buffering指令启用了对后端代理服务器的响应缓冲时,假如后端代理服务器的响应超出了proxy_buffer_size以及proxy_buffers指令设置的缓冲区大小,则有一部分响应会被保存到临时文件中。本指令用于设置临时文件的最大大小,而每一次向临时文件写入的数据大小由proxy_temp_file_write_size指令控制。

如果超过了这个值, Nginx将与Proxy服务器同步的传递内容, 而不再缓冲到硬盘;如果我们将proxy_max_temp_file_size的大小设置为0,则会禁止将响应写入到临时文件。


注: 本限制并不对那些cached(proxy_cache)到硬盘上的响应产生影响

proxy_temp_file_write_size指令

Syntax:	proxy_temp_file_write_size size;
Default:	
proxy_temp_file_write_size 8k|16k;
Context:	http, server, location
当启用了将后端响应缓存到临时文件时,本指令用于限制每次向临时文件写入的数据大小。

默认情况下,size会受到proxy_buffer_size以及proxy_buffers这两个缓冲的影响。

用例

# 通用网站配置

proxy_buffer_size 4k;            #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k;             #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k;     #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传

# 这个每次传输至少都是9M以上的内容,缓冲区配置大
proxy_buffering on;
proxy_buffer_size 4k; 
proxy_buffers 8 1M;
proxy_busy_buffers_size 2M;
proxy_max_temp_file_size 0;

Buy me a 肥仔水!