Nginx
前言
Nginx是一个高性能的反向代理服务器,可以将流量均衡分配到后端服务器上。
安装和下载
下载地址是http://nginx.org/en/download.html,因为是在windows平台上测试的,所以这里要下载nginx/Windows-1.14.2 的包,下载后解压,运行cmd,定位到Nginx的路径下,需要执行以下命令
cd C:\Users\czl\Desktop\nginx-1.14.2
启动Nginx
start nginx
关闭Nginx
nginx -s quit
修改配置后,不用重启直接加载修改后的配置
nginx -s reload
在启动后,浏览器输入localhost,如果成功会出现以下网页
负载均衡
首先,我在本机上启动了两个Tomcat服务器,访问路径分别为localhost:8080,localhost:8081。
接下来,需要修改Nginx的配置,在conf\nginx.conf,修改为以下内容
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; #keepalive_timeout 0; keepalive_timeout 65; upstream myproject { server localhost:8080; server localhost:8081; } server { listen 80; server_name localhost; location / { proxy_pass http://myproject; } } }
启动Nginx后,在浏览器输入http://localhost/,不断刷新,会发现8080端口和8081端口返回的内容会依次循环出现,这是因为默认的负载均衡策略就是轮询。
健康检查
上面的配置正常情况下会运行良好的,这个时候我把8081的Tomcat关掉,继续刷新地址会出现什么?
第一次的时候能正常出现8080内容,第二次的时候应该会请求8081的,但是服务没了,所以会卡很久最终失败的。
所以为了处理这种情况需要增加一个健康检查的机制,如下
upstream myproject { server localhost:8080 max_fails=1 fail_timeout=60s; server localhost:8081 max_fails=1 fail_timeout=60s; }
这里的配置表示在fail_timeout定义的时间段内失败次数达到max_fails次的话,就会在接下来的fail_timeout时间段内不再请求当前地址,也就是说在前60秒内失败了一次的话,就会在接下来的60秒到120秒之间不再请求8081的地址,120秒后可以继续请求8081。
但是这种健康检查是不够完美的。因为这是被动检查的,如果前60秒内有大量请求过来,将全部失败了。而且接下来还可能继续重复这种情况。
现在是有两种反向代理可以提供主动健康检查。
1.用淘宝开源的tengine 官网是http://tengine.taobao.org/
2.还有可以用Nginx plus,不过要收费的,官网是https://www.nginx.com/
小结
最后还得说一下,如果只用单机部署nginx不能实现高可用的,还要配合Keepalived实现主备切换,不过复杂性高很多了。另外也有比较现成的方案,例如阿里云的负载均衡SLB,虽然要给钱就是了。