Nginx upstream性能优化

转载 2015年11月19日 11:05:27

http://blog.csdn.net/poechant/article/details/7256184

http://blog.csdn.net/Poechant/article/category/1060686

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,请根据实际需求测试结果来配置

Nginx upstream性能优化

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

nginx-upstream-jvm-route-0.1.tar.gz

  • 2013年08月24日 12:45
  • 6KB
  • 下载

nginx_upstream_check_module

  • 2016年11月12日 22:14
  • 167KB
  • 下载

nginx的upstream目前支持5种方式的分配

本博客转载于:http://blog.chinaunix.net/uid-20662363-id-3049712.html nginx的upstream目前支持5种方式的分配...

Nginx_upstream_hash-0.3.tar.gz

  • 2009年08月14日 22:25
  • 5KB
  • 下载

nginx upstream fair算法

  • 2017年12月06日 10:43
  • 11KB
  • 下载

Nginx的upstream目前支持5种分配方式

1、轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 2、weight指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。例...

Nginx模块开发(十二)(续二):upstream负载均衡模块的例子

upstream nginx模块一贯被分成三大类:handler、filter和upstream。前面的章节中,读者已经了解了handler、filter。通过开发这两类模块,可以使nginx轻松搞...

nginx的upstream模块数据转发过程及流量控制分析

关于nginx的upstream模块的基本原理及设计,

Nginx upstream的5种权重分配方式分享

1、轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 2、weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Nginx upstream性能优化
举报原因:
原因补充:

(最多只允许输入30个字)