nginx负载均衡策略包括:
- 轮询
- 指定权重(weight)
- ip_hash
- least_conn
- fair
- url_hash
默认执行轮询,fair、url_hash属于第三方策略,需要安装第三方的插件
ngnix的负载均衡通过配置upstream 来实现请求转发,如代码所示
ngnix能自动感知需要转发的后端服务器是否挂掉,如果挂掉,ngnix会自动将那条挂掉的服务器从upstream中剔除
upstream applicationServer{
server 192.168.1.14
server 192.168.1.15
}
轮询:
没有指定任何策略时,ngnix会自动执行轮询转发策略,配置的权重都一样时,会按照顺序执行转发
缺点:由于是平均的转发给各个后端,时它们的负载大致相同,但是有些请求占用的时间很长,会导致所在的后端负载较高
指定权重
upstream applicationServer{
server 192.168.1.14 weight=8;
server 192.168.1.15 weight=10;
}
weight参数值的大小和请求转发比率成正比,一般都是用于服务器硬件配置差异大而导致承受的访问压力不一样的情况下
ip_hash:每个请求按原始访问ip 的 hash 结果来进行请求转发,此种配置一般可以解决多个应用程序服务器的session复制和同步的问题,因为同一个IP的请求都转发到了同一台服务器的应用程序上,但是这可能会导致后端应用服务器的负载不均的情况
upstream applicationServer{
ip_hash;
server 192.168.1.14;
server 192.168.1.15;
}
least_conn:Nginx在接收到请求后会把请求转发给连接数较少的后端应用程序服务器
upstream applicationServer{
least_conn;
server 192.168.1.14;
server 192.168.1.15;
}
fair:按照服务器端的响应时间来分配请求给后端应用程序服务器,响应时间端的优先分配。响应时间短处理效率高的服务器分配到的请求概率高
upstream applicationServer{
server 192.168.1.14;
server 192.168.1.15;
fair;
}
url_hash:按照访问的目标URL的hash值来分配请求,主要是适用对缓存命中进行调优,同一个资源进入不同的服务器,会导致重复下载,如果一直访问同一个服务器,就能直接从缓存中读取
upstream applicationServer{
server 192.168.1.14;
server 192.168.1.15;
hash $request_uri;
}
nginx进程数量配置
Nginx 启动后有两个重要进程
- master 进程:可以控制Nginx服务的启动、停止、重启、配置文件的重新加载
- worker 进程:处理用户请求信息
woker进程个数配置,nginx.conf文件
worker_processes 2; //数值表示启动后worker进程的个数
worker进程的数量一般建议等于CPU的核数或者CPU核数的两倍
建议:将每个worker进程绑定到不同的CPU核上,可以避免出现CPU的争抢
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
nginx事件处理模型配置
在不同的系统中 nginx 采用不同的 io 事件模型
- Linux系统,使用 epoll (io多路复用模型)
- FreeBSD系统,使用 kqueue (io多路复用模型)
- Solaris系统,使用 /dev/pool (io多路复用模型)
- Windows系统,使用 icop
events{
worker_connectinons 1024; //单个进程允许的客户端最大连接数上限
use epoll;
}
io多路复用说明,在nginx中可以配置让一个进程处理多个io事件和多个调用请求。
nginx采用的是异步非阻塞io策略,异步非阻塞io策略在处理时,线程可以不用因为某个io的处理耗时很长而一直导致线程阻塞等待,线程可以不用也不必等待响应,而可以继续处理其他的io事件,当io事件处理完成后,操作系统内核会通知io事件已经处理完成,这时线程才会去获取处理号的结果
nginx客户端连接数配置
worker 进程可以打开的最大文件数,默认都是1024,一般都是配很大,大小会引起 too many openfiles错误
worker_processes 2;
worker_rlimit_nofile 2048;
设置语序的客户端最大连接数不能超过最大文件数
events{
worker_connections 1024;
}