Nginx upstream性能优化

1      目的

完成基于大报文和小报文场景的Nginx压测方案设计,其在长连接和短连接的最佳并发模型测试结果如下表:

大报文在短连接场景QPS在1.8K左右,在长连接场景QPS在2.1K左右,提升16.5%;

小报文在短连接场景QPS在5.6K左右,在长连接场景QPS在11.8K左右,提升一倍;

业务场景

Nginx到后端

并发量

QPS

CPU(%)

带宽(M)

PPS

大报文

短连接  

800

1855

61.31

763.48

142425.46

大报文

长连接

800

2162

66.74

881.56

133334.1

小报文

短连接

800

5678

43.35

117.64

104862.72

小报文

长连接

800

11808

60.55

226.45

151743.24

   

2      介绍   

在nginx的模块中,分为3种类型,分别是handler,filter和upstream,其中upstream可以看做一种特殊的handler,它主要用来实现和后端另外的服务器(php/jboss等)进行通信,由于在nginx中全部都是使用非阻塞,并且是一个流式的处理,所以upstream的实现很复杂。

upstream顾名思义,真正产生内容的地方在”上游”而不是nginx,也就是说nginx是位于client和后端的upstream之间的桥梁,在这种情况下,一个upstream需要做的事情主要有2个,第一个是当client发送http请求过来之后,需要创建一个到后端upstream的请求。第二个是当后端发送数据过来之后,需要将后端upstream的数据再次发送给client。 

 

2.1      Nginx Upstream连接后端有两种方式:短连接和长连接。   

Keep-Alive即俗称的长连接,使客户端到服务端建立的连接持续有效,当对服务器发起后续请求时,Keep-Alive功能可以复用先前使用过的连接,减少了重新建立连接所需的开销。通常使用HTTP协议采用的是请求应答模式,客户端到服务端的一次请求完成了,它们之间的连接也随之关闭。在某些应用场景下,比如后端RESTful服务,就需要保持住连接,这时就可以启用HTTP Keep-Alive。Nginx长连接的配置:

 

 

upstream backend-others {

            server 10.x.x.x max_fails=0 fail_timeout=10s;

            server 10.x.x.x:81 max_fails=0 fail_timeout=10s;           

            keepalive 20000;

        }

 

location / {

                    #防止502以及Timeout的发生

                    proxy_connect_timeout 75;

                    proxy_read_timeout 300;

                    proxy_send_timeout 300;

                    proxy_buffer_size 64k;

                    proxy_buffers   4 64k;

                    proxy_busy_buffers_size 128k;

                    proxy_temp_file_write_size 128k;

 

                    proxy_http_version 1.1;

                    proxy_set_header Connection "";

                    proxy_pass http://backend-others;

                }

 

1   server

 

定义服务器的地址address和其他参数parameters。 地址可以是域名或者IP地址,端口是可选的,或者是指定“unix:”前缀的UNIX域套接字的路径。如果没有指定端口,就使用80端口。 如果一个域名解析到多个IP,本质上是定义了多个server。还可以定义下面的参数:

1)  weight=number 设定服务器的权重,默认是1。

2)  max_fails=number 设定Nginx与服务器通信的尝试失败的次数。在fail_timeout参数定义的时间段内,如果失败的次数达到此值,Nginx就认为服务器不可用。在下一个fail_timeout时间段,服务器不会再被尝试。 失败的尝试次数默认是1。设为0就会停止统计尝试次数,认为服务器是一直可用的。你可以通过指令proxy_next_upstream、 fastcgi_next_upstream和 memcached_next_upstream来配置什么是失败的尝试。 默认配置时,http_404状态不被认为是失败的尝试。

3)  fail_timeout=time 设定统计失败尝试次数的时间段。在这段时间中,服务器失败次数达到指定的尝试次数,服务器就被认为不可用。服务器被认为不可用的时间段。默认情况下,该超时时间是10秒。

4)  Backup 标记为备用服务器。当主服务器不可用以后,请求会被传给这些服务器。

5)  Down 标记服务器永久不可用,可以跟ip_hash指令一起使用。

2   默认的是RR轮询。

3   ip_hash

指定服务器组的负载均衡方法,请求基于客户端的IP地址在服务器间进行分发。 IPv4地址的前三个字节或者IPv6的整个地址,会被用来作为一个散列key。 这种方法可以确保从同一个客户端过来的请求,会被传给同一台服务器。除了当服务器被认为不可用的时候,这些客户端的请求会被传给其他服务器,而且很有可能也是同一台服务器。可以解决session和cookie的问题,但会导致负载不均衡。

4   keepalive

激活对上游服务器的连接进行缓存。connections参数设置每个worker进程与后端服务器保持连接的最大数量。这些保持的连接会被放入缓存。如果连接数大于这个值时,最久未使用的连接会被关闭。需要注意的是,keepalive指令不会限制Nginx进程与上游服务器的连接总数。 新的连接总会按需被创建。connections参数应该稍微设低一点,以便上游服务器也能处理额外新进来的连接。

1)  对于HTTP代理,proxy_http_version指令应该设置为“1.1”,同时“Connection”头的值也应被清空。

2)  另外一种选择是,HTTP/1.0协议的持久连接也可以通过发送“Connection: Keep-Alive”头来实现。不过不建议这样用。

3)  对于FastCGI的服务器,需要设置 fastcgi_keep_conn 指令来让连接keepalive工作。当使用的负载均衡方法不是默认的轮转法时,必须在keepalive 指令之前配置。

5   proxy_connect_timeout 

默认是60s,设置与后端服务器建立连接的超时时间。应该注意这个超时一般不可能大于75秒。

proxy_read_timeout默认60s,定义从后端服务器读取响应的超时。此超时是指相邻两次读操作之间的最长时间间隔,而不是整个响应传输完成的最长时间。如果后端服务器在超时时间段内没有传输任何数据,连接将被关闭。

6   proxy_send_timeout

默认60s, 定义向后端服务器传输请求的超时。此超时是指相邻两次写操作之间的最长时间间隔,而不是整个请求传输完成的最长时间。如果后端服务器在超时时间段内没有接收到任何数据,连接将被关闭。

7   proxy_buffer_size

设置缓冲区的大小为size。nginx从被代理的服务器读取响应时,使用该缓冲区保存响应的开始部分。这部分通常包含着一个小小的响应头。该缓冲区大小默认等于proxy_buffers指令设置的一块缓冲区的大小,但它也可以被设置得更小。

8   proxy_buffers为每个连接设置缓冲区的数量为number,每块缓冲区的大小为size。这些缓冲区用于保存从被代理的服务器读取的响应。每块缓冲区默认等于一个内存页的大小。这个值是4K还是8K,取决于平台。

9   proxy_busy_buffers_size

当开启缓冲响应的功能以后,在没有读到全部响应的情况下,写缓冲到达一定大小时,nginx一定会向客户端发送响应,直到缓冲小于此值。这条指令用来设置此值。 同时,剩余的缓冲区可以用于接收响应,如果需要,一部分内容将缓冲到临时文件。该大小默认是proxy_buffer_size和proxy_buffers指令设置单块缓冲大小的两倍。

10  proxy_temp_file_write_size

在开启缓冲后端服务器响应到临时文件的功能后,设置nginx每次写数据到临时文件的size(大小)限制。 size的默认值是proxy_buffer_size指令和proxy_buffers指令定义的每块缓冲区大小的两倍, 而临时文件最大容量由proxy_max_temp_file_size指令设置。

2.2      后端服务器的配置   

 

位置

参数名

默认值

Tomcat

Server.xml

Connector标签下的maxKeepAliveRequests

100

Nginx

Server模块

keepalive_requests

100

修改相应的值以适应Nginx Upstream的配置需求,如Nginx的keepalive_requests配置为20000。而在Tomcat中的maxKeepAliveRequests官方建议最大值是200,请根据实际需求测试结果来配置

 

upstream backend-others {

            server 10.123.73.242:81 max_fails=0 fail_timeout=10s;

            server 10.123.73.244:81 max_fails=0 fail_timeout=10s;

            server 10.123.73.245:81 max_fails=0 fail_timeout=10s;

            server 10.123.73.246:81 max_fails=0 fail_timeout=10s;

            server 10.123.73.248:81 max_fails=0 fail_timeout=10s;

            server 10.123.73.249:81 max_fails=0 fail_timeout=10s;

            server 10.123.73.247:81 max_fails=0 fail_timeout=10s;

            keepalive 20000;

        }

 

location / {

                    #防止502以及Timeout的发生

                    proxy_connect_timeout 75;

                    proxy_read_timeout 300;

                    proxy_send_timeout 300;

                    proxy_buffer_size 64k;

                    proxy_buffers   4 64k;

                    proxy_busy_buffers_size 128k;

                    proxy_temp_file_write_size 128k;

 

                    proxy_http_version 1.1;

                    proxy_set_header Connection "";

                    proxy_pass http://backend-others;

                }

1   server定义服务器的地址address和其他参数parameters。 地址可以是域名或者IP地址,端口是可选的,或者是指定“unix:”前缀的UNIX域套接字的路径。如果没有指定端口,就使用80端口。 如果一个域名解析到多个IP,本质上是定义了多个server。还可以定义下面的参数:

1)  weight=number 设定服务器的权重,默认是1。

2)  max_fails=number 设定Nginx与服务器通信的尝试失败的次数。在fail_timeout参数定义的时间段内,如果失败的次数达到此值,Nginx就认为服务器不可用。在下一个fail_timeout时间段,服务器不会再被尝试。 失败的尝试次数默认是1。设为0就会停止统计尝试次数,认为服务器是一直可用的。你可以通过指令proxy_next_upstream、 fastcgi_next_upstream和 memcached_next_upstream来配置什么是失败的尝试。 默认配置时,http_404状态不被认为是失败的尝试。

3)  fail_timeout=time 设定统计失败尝试次数的时间段。在这段时间中,服务器失败次数达到指定的尝试次数,服务器就被认为不可用。服务器被认为不可用的时间段。默认情况下,该超时时间是10秒。

4)  Backup 标记为备用服务器。当主服务器不可用以后,请求会被传给这些服务器。

5)  Down 标记服务器永久不可用,可以跟ip_hash指令一起使用。

2   默认的是RR轮询。

3   ip_hash指定服务器组的负载均衡方法,请求基于客户端的IP地址在服务器间进行分发。 IPv4地址的前三个字节或者IPv6的整个地址,会被用来作为一个散列key。 这种方法可以确保从同一个客户端过来的请求,会被传给同一台服务器。除了当服务器被认为不可用的时候,这些客户端的请求会被传给其他服务器,而且很有可能也是同一台服务器。可以解决session和cookie的问题,但会导致负载不均衡。

4   keepalive激活对上游服务器的连接进行缓存。connections参数设置每个worker进程与后端服务器保持连接的最大数量。这些保持的连接会被放入缓存。如果连接数大于这个值时,最久未使用的连接会被关闭。需要注意的是,keepalive指令不会限制Nginx进程与上游服务器的连接总数。 新的连接总会按需被创建。connections参数应该稍微设低一点,以便上游服务器也能处理额外新进来的连接。

1)  对于HTTP代理,proxy_http_version指令应该设置为“1.1”,同时“Connection”头的值也应被清空。

2)  另外一种选择是,HTTP/1.0协议的持久连接也可以通过发送“Connection: Keep-Alive”头来实现。不过不建议这样用。

3)  对于FastCGI的服务器,需要设置 fastcgi_keep_conn 指令来让连接keepalive工作。当使用的负载均衡方法不是默认的轮转法时,必须在keepalive 指令之前配置。

5   proxy_connect_timeout 默认是60s,设置与后端服务器建立连接的超时时间。应该注意这个超时一般不可能大于75秒。

proxy_read_timeout默认60s,定义从后端服务器读取响应的超时。此超时是指相邻两次读操作之间的最长时间间隔,而不是整个响应传输完成的最长时间。如果后端服务器在超时时间段内没有传输任何数据,连接将被关闭。

6   proxy_send_timeout默认60s, 定义向后端服务器传输请求的超时。此超时是指相邻两次写操作之间的最长时间间隔,而不是整个请求传输完成的最长时间。如果后端服务器在超时时间段内没有接收到任何数据,连接将被关闭。

7   proxy_buffer_size设置缓冲区的大小为size。nginx从被代理的服务器读取响应时,使用该缓冲区保存响应的开始部分。这部分通常包含着一个小小的响应头。该缓冲区大小默认等于proxy_buffers指令设置的一块缓冲区的大小,但它也可以被设置得更小。

8   proxy_buffers为每个连接设置缓冲区的数量为number,每块缓冲区的大小为size。这些缓冲区用于保存从被代理的服务器读取的响应。每块缓冲区默认等于一个内存页的大小。这个值是4K还是8K,取决于平台。

9   proxy_busy_buffers_size当开启缓冲响应的功能以后,在没有读到全部响应的情况下,写缓冲到达一定大小时,nginx一定会向客户端发送响应,直到缓冲小于此值。这条指令用来设置此值。 同时,剩余的缓冲区可以用于接收响应,如果需要,一部分内容将缓冲到临时文件。该大小默认是proxy_buffer_size和proxy_buffers指令设置单块缓冲大小的两倍。

10  proxy_temp_file_write_size在开启缓冲后端服务器响应到临时文件的功能后,设置nginx每次写数据到临时文件的size(大小)限制。 size的默认值是proxy_buffer_size指令和proxy_buffers指令定义的每块缓冲区大小的两倍, 而临时文件最大容量由proxy_max_temp_file_size指令设置。

[ 编辑本段 ]   [ 回目录 ]2.2      后端服务器的配置   

 

位置

参数名

默认值

Tomcat

Server.xml

Connector标签下的maxKeepAliveRequests

100

Nginx

Server模块

keepalive_requests

100

 

修改相应的值以适应Nginx Upstream的配置需求,如Nginx的keepalive_requests配置为20000。而在Tomcat中的maxKeepAliveRequests官方建议最大值是200,请根据实际需求测试结果来配置

posted @ 2021-08-09 00:04  疯子110  阅读(872)  评论(0编辑  收藏  举报