vlambda博客
学习文章列表

Nginx的性能分析与调优(一)

  1. Nginx负载均衡策略的介绍与调优

负载均衡是Nginx的作用之一,Nginx常见的负载均衡策略一般包括轮询、指定权重(weight)、ip_hash、least_conn、fair、url_hash等六种。其中默认执行的策略为轮询,fair和url_hash属于第三方策略,这两种策略不是Nginx自带支持的策略,需要安装第三方的插件来辅助支持。在不同的场景下,每一种策略的选择对系统的整体性能影响都非常大,一般建议根据实际场景和服务器来选择对应的负载均衡策略。
轮询策略:Nginx的负载均衡通过配置upstream来实现请求转发。如果在upstream中没有指定其他的任何的策略时,Nginx会自动执行轮询转发策略,upstream中配置每台服务器的权重都一样,会按照顺序依次转发。如下所示就是一个简单的upstream配置,由于配置了192.168.1.13和192.168.1.14两台服务器,所以请求会按照接收的顺序,依次轮询的转发给两台服务器进行执行。Nginx能自动感知需要转发到的后端服务器是否挂掉,如果挂掉,Nginx会自动将那台服务器从upstream中剔除。

使用轮询策略时,其他非必填的辅助参数如下表所示。
参数
含义
fail_timeout
该参数需要和max_fails参数结合一起使用,用于表示在fail_timeout指定的时间内某个服务器允许重新连接失败的最大次数。
max_fails
在fail_timeout参数设置的时间最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,Nginx就判断该服务器挂掉了。
down
标记指定的服务器已经挂掉了,Nginx将不会再向标记为down的服务器转发任何的请求。

指定权重(weight):通过在upstream配置中给相应的服务器指定weight权重参数来实现按照权重分发请求。weight参数值的大小和请求转发比率成正比,该配置一般用于后端应用程序服务器硬件配置差异大而导致承受的访问压力不一样的情况下,配置示例如下:

Nginx的性能分析与调优(一)

 ip_hash:每一个请求按原始访问ip的hash结果来进行请求转发。由于同一个ip的hash值肯定是不变的,这样每个固定客户端就会只访问一个后端应用程序服务器。此种配置一般可以用于解决多个应用程序服务器的session复制和同步的问题,因为同一个ip的请求都转发到同一台服务器的应用程序上了,所以也就不会有session不同步的问题了。但是这可能会导致后端应用服务器的负载不均的情况,因为在这种策略下,后端应用服务器收到的请求数肯定是很难一样多。示例配置如下:

Nginx的性能分析与调优(一)

least_conn:通过在upstream配置中增加least_conn配置后,Nginx在接收到请求后,会把请求转发给连接数最少的后端应用服务器。前面讲到的轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同,但是有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡的效果,示例配置如下:


Nginx的性能分析与调优(一)

fair:fair属于第三方策略,即不是Nginx本身的策略,需要安装对应的第三方插件。fair是按照服务器端的响应时间来分配请求给后端应用程序服务器,响应时间短的优先分配。示例配置如下:

Nginx的性能分析与调优(一)

url_hash:url_hash同样属于第三方策略,也是需要安装对应的第三方插件。url_hash是按照访问的目标url的hash值来分配请求,使同一个url的请求转发到同一个后端应用程序服务器,请求的分发策略和ip_hash有点类似。在进行性能调优时,主要是适合对缓存命中进行调优,同一个资源(也就是同一个目标url地址)多次请求,可能会到达不同的后端应用程序服务器上,会导致不必要的多次下载。使用url_hash后,这样可以在服务器进行资源缓存,再次收到请求后,就可以直接从缓存中读取了。示例配置如下:

Nginx的性能分析与调优(一)

2.Nginx进程数的配置调优

Nginx服务启动后会包括两个重要的进程:
master进程:可以控制Nginx服务的启动、停止、重启、配置文件的重新加载。
worker进程:出来用户请求信息,将收到的用户请求转发到后端应用服务器上。
worker进程的个数可以在配置文件nginx.conf中进行配置,如下所示:

Nginx的性能分析与调优(一)

worker进程的数量一般建议等于CPU的核数或者CPU核数的两倍。通过执行lscpu命令,可以获得CPU的核数,如下图:

Nginx的性能分析与调优(一)

或者通过执行grep processor /proc/cpuinfo | wc -l 命令也可以直接获取CPU的核数。如下图:

在配置完worker进程的数量后,还建议将每个worker进程绑定到不同的CPU核上,这样可以避免出现CPU争抢。如果是将worker进程分配到4核的CPU上,可以按照如下配置进行配置:

未完,待续。。。