Nginx负载均衡
最近项目要设计到并发,所以设计项目架构时考虑到用Nginx搭建Tomcat集群,再用Redis搭建分布式Session,下面将一步步分享我摸索的过程。
Nginx虽然小,但是功能方面确实非常的强大,支持反向代理,负载平衡,数据缓存,URL重写,读写分离,动静分离等方面。下面最要说一下负载均衡的配置,下一篇将试验与Redis的结合。
Nginx负载均衡调度的方法
Nginx的负载均衡模块upstream模块主要支持如下4中调度算法:
1、服务器轮询(默认方式):每个请求访问按照时间顺序逐一分配到不同的服务器端,如果后端某台服务器宕机时,故障系统会被自动的剔除,使用户访问不受 影响。Weight(权重)指定轮询的权值,Weight值越大,分配到的访问几率越高,主要用于服务器端性能不均的情况下。
2、ip_hash:每个请求按照访问的IP的Hash值进行分配,这行来自同一个IP的用户将会固定到后端的一个服务器,固定服务器后可以有效的解决网页存在的 session共享的问题。
3、fair:该算法可以根据页面大小和加载时间长短智能的进行决策负载均衡,即根据后端服务器的响应时间来分配请求,响应时间段的优先分配。Nginx本身未集 成fair模块,如果需要该调度算法,必须下载Nginx的upstream_fair模块,然后在config中配置加载。
4、url_hash:此调度算法是根据访问的url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步的提高后端服务器的效率。Nginx本身未集成 该模块,如果使用需安装Nginx的hash包,并编译加载到nginx。
Nginx的upstream模块支持的状态参数
在http的upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。通常设置的状态参数如下:
1、down:表示当前的server暂时不参与负载均衡。
2、backup:预留的备份服务器。当其他的所有非backup机器出现故障或者忙的时间,才会请求backup服务器,因此这台服务器的压力最轻。
3、max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
4、fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
注:当负载均衡调度算法使用ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
Nginx的参数配置以及说明
#user nobody; worker_processes 2; error_log logs/error.log; error_log logs/error.log notice; error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_vary on; upstream andy { server 192.168.1.110:8080 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.111:8080 weight=1 max_fails=2 fail_timeout=30s; ip_hash; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location /andy_server { proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://andy; #此处proxy_pass定义的name需要跟upstream 里面定义的name一致 expires 3d; #以下配置可省略 client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
注释:详细的配置解释查看上一篇。
Nginx负载均衡测试
现在在192.168.1.110上部署的是Nginx,192.168.1.110和192.168.111上部署的tomcat服务器。
1、当打开http://192.168.1.110/andy_server/ 时,Nginx负载集群采用默认方式时,每次都会轮询服务器。
如下:
此种方法不能够解决集群的session问题。
2、当采用ip_hash时,刷新一直是固定的服务器
这种方式解决了session问题,如果192.168.1.110服务器宕机掉的话,Nginx会将请求转到未宕机的服务器上面(经测试,将192.168.1.110服务器shutdown,再此请求会跳转 到192.168.1.111服务器)。但是也存在个问题,当hash到的服务器宕机,Nginx调到另一个服务器,自然session会丢失。
3、剩余的两种安装Nginx所需对应的模块,和上面同理就不在测试。
总结
无论是采用哪种负载均衡方式,都会出现session丢失问题。要解决该问题,要对session单另存放,无论是存库,文件,还是分布式内存服务器存放,是集群搭建必不可少的。下篇将测试并解决session问题
版权声明:本文为博主原创文章,未经博主允许不得转载。
以上就介绍了Nginx+Tomcat做负载平衡,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。