当在业务增长,生产环境里有很大的流量产生和比较高的并发量产生时,一般单机模式的服务已经不再适合业务的需求。所以多机的负载均衡技术来做负载优化就很有必要了。Nginx不光可以实现web Server,还可以作为HTTP反向代理服务器分发客户端请求和流量给后端RS,以此提高服务的性能和降低服务器的压力。Nginx的负载均衡依赖于ngx-http-upstream-module模块,所支持的代理模式有proxy-pass、fastcgi-pass、memcache-pass。Nginx的反向代理效果充当了负载均衡的流量分发效果,类似的负载均衡效果的软件有LVS集群、haproxy。为了高可用集群,LVS+Keepalived和Nginx+Keepalived、haproxy+Keepalived集群保证高可用容灾负载均衡集群。下面介绍Nginx负载均衡。
1. Nginx常用负载均衡算法:
- 轮询(默认算法):简称RR---每个请求会依次分配给后端RS不同应用程序服务器,后端RS实际的压力会忽略不计。
- 加权轮询:权重越大的服务器,被Nginx分配的请求次数会越多,适合用于后端RS中性能不一致的情况,这种算法可以充分利用不同后端RS的配置性能。
- IP HASH:当同IP进行重复访问时会被指定到上次访问的服务器,如果后端超载,请求分发到别的服务器。可以解决session动态网站共享问题。
2. Nginx配置文件常用配置参数:
- server 192.168.74.1:80 负载均衡后端RealServer的IP或者域名,端口默认为80,;在高并发请求下写域名,再通过DNS进行负载均衡。
- weight:权重,默认为1,在配置文件里面,权重越大的服务器接收的请求越多。
- max_fails:失败尝试的失败次数,默认是1,禁止失败尝试是0。
- fail_timeout:失败超时时间,默认是10秒,通常3秒比较好。
- backup:热备配置,master负载均衡器出现问题后会自动接收Master的所有资源和VIP(Virtual IP address);backup服务器。
- down:标志服务器不可用,这个参数通常配合IP_hash使用。
3. Ngxin负载均衡设置:
- 默认负载均衡设置:
http{#upstream模块包含在http模块下
upstream kiwis{#定义upstream名字,下面会引用
server 192.168.74.133;#后端负责处理真正请求的RS的ip地址
server 192.168.74.128;
server 192.168.74.130;
}
server {
listen 80;
server name www.kiwis.com;
location /{
proxy_pass http://kiwis; #引用upstream
}
}
}
- 当用户访问www.kiwis.com时,Nginx会把请求分发给后端的三个RS。
- 加权负载均衡设置。
http{#upstream模块包含在http模块下
upstream kiwis{#定义upstream名字,下面会引用
server 192.168.74.133 weight=3;#后端负责处理真正请求的RS的ip地址;权重为3
server 192.168.74.128;
server 192.168.74.130;
}
server {
listen 80;
server name www.kiwis.com;
location /{
proxy_pass http://kiwis; #引用upstream
}
}
}
- 加权负载均衡中,每5个请求分配给192.168.74.133,然后第4、5个请求依次分配给后两个服务器,如此循环操作。
- IP HASH负载均衡:
http{#upstream模块包含在http模块下
upstream kiwis{#定义upstream名字,下面会引用
ip_hash;#采用IP HASH算法
server 192.168.74.133;#后端负责处理真正请求的RS的ip地址
server 192.168.74.128;
server 192.168.74.130;
}
server {
listen 80;
server name www.kiwis.com;
location /{
proxy_pass http://kiwis; #引用upstream
}
}
}
- 如果需要将同一个客户端请求绑定到相同得到后端服务器上,可以使用ip_hash负载均衡,除非该服务器不可用。
- Nginx高可用实现,利用backup标签,可以实现高可用;Master服务器故障;backup服务器可以自动接管服务;期间接管服务的时间是1秒甚至更短,可以保证服务不中断;对于客户端来说是透明的。当Matser服务器修复,backup会自动放弃服务。
http{#upstream模块包含在http模块下
upstream kiwis{#定义upstream名字,下面会引用
server 192.168.74.133;#后端负责处理真正请求的RS的ip地址
server 192.168.74.128;
server 192.168.74.130 backup;
}
server {
listen 80;
server name www.kiwis.com;
location /{
proxy_pass http://kiwis; #引用upstream
}
}
}
3. Nginx的http_proxy_module模块常用参数。
- Nginx的upstream模块相当于是建立一个函数库,把后端的服务器地址放在一个池子里面,而proxy模块则是从这个池子里调用了这些服务器,http_proxy_module模块常用参数:
- proxy_set_header:让后端服务器能获取到前端用户真实IP,而不只是代理服务器的IP。
- proxy_set_header Host $host:当后端服务器配置了多个应用时,该选项可以让服务器识别出具体要访问的是哪个应用,而不会将第一个站点作为默认应用传递给用户。
- proxy_set_header X-Forward-For $remote_addr:如果后端服务器需要获取用户的真实IP,需要该选项。
- client_body_buffer_size:客户端请求主体缓冲区大小。
- proxy_connect_timeout:代理服务器和后端服务端握手链接时间。
- proxy_send_timeout:后端服务器回传数据给Nginx的时间,需要在设置的时间内发送完所有的数据;如果没有发送完数据,Nginx将断开数据链接。
- proxy_read_timeout:代理服务器和后端服务器连接成功后,等待后端服务器响应的时间。
+Nginx作反向代理,获取客户端的真实IP地址,转发动态页面给Tomcat进行处理。
location ~\.( jsp | jspx )?${
proxy_set_header Host $host;
proxy_set_header x-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy-add_x_forward_for;
proxy_pass http://tomcat.server
}
4. Nginx的配置文件说明:
- 在此记录Nginx服务器nginx.conf的配置文件说明:
#定义运行用户和用户组,此用户必须在系统存在;可以是nologin
user nginx nginx;
#启动进程,通常设置为何cpu数量相等
worker_process 8;
#全局错误日志及pid文件
error_log /var/log/nginx/error.log;#错误日志定义等级 [debug|info|notice|warn|error|crit]
pid /var/run/nginx.pid;#指定进程id的存储文件位置
worker_rilimit_nofile 65535;#一个nginx进程最多打开的文件描述符数目,理论值是最大打开文件数(系统的值ulimit -n)与nginx进程数相除;nginx请求分配不均,网上有些博客建议与ulimit -n数目相等
#工作模式及连接上限
events{
use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能;除此之外还有select、poll、kqueue、rtsig和/dev/poll模式
worker_connetctions 1024;#单个后台worker process进程的最大并发连接数
#multi_accept on;
}
#设置http服务器,利用它反向代理功能提供负载均衡实现
http{
#设定mime类型,类型有mime.type文件定义
include /etc/nginx/mime.types;
default_type application/octet-stream;
#设定日志格式
access_log /var/nginx/access.log;
#sendfile指令指定nginx是否调用sendfile函数(zero copy)来输出文件,对于普通的应用。
#必须设置为on,如果用来进行下载等应用磁盘IO负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的uptime。
sendfile on;
# tcp_nopush on;
# 连接超时时间
#Keepalive_timeout 0;
Keepalive_timeout 65;
tcp_nodelay on;
#开启gzip压缩
gzip on;
gzip_disable "MSIE[1-6]\.(?!.*SV1)";
#设定请求缓冲
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
# 设定负载均衡的服务器列表
upstream myServer{
#weight参数表示权值,权值越高被分配到的几率就越大
#本机上开启80端口
server 192.168.74.2:80 weight=5;
server 192.168.74.3:80 weight=1;
server 192.168.74.4:80 weight=8;
}
server{
#侦听81端口
listen 81;
#定义使用www.kiwis.com访问
server_name www.kiwis.com;
#设定本虚拟机访问的日志
access_log logs/www.kiwis.com.access.log main;
#默认请求
location / {
root /root/www; #定义服务器的默认网站根目录位置
index index.php index.html index.htm;# 定义首页索引文件的名称
fastcgi_pass www.kiwis.com;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
#定义错误提示页面
error_page 500 502 503 504 /50.x.html;
location =/50x.html{
root /root/www;
}
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/{
root /var/www/virtual/htdocs/public;
#过期20天,静态文件更新频率低,过期可以根据需要设置
expires 20d;
}
#PHP脚本请求全部转发到FASTCGI处理,使用FastCGI默认设置
location ~ \.php$ {
root /root/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
include fastcgi_params;
}
#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpassword;
}
#禁止访问 .js文件
location ~ /\.js {
deny all;
}
}
}
nginx的基本配置参数大概如上所示,安装Nginx实现负载均衡参见另外一篇文章。