介绍
nginx 通过 反向代理将请求转发给tomcat,并实现 负载均衡,如下图:
负载均衡策略
- 轮询(round robin),默认
- weight权重
- IP_hash
- url_hash(第三方)
- fair(第三方)
负载均衡-轮询
依次将请求分配到各个后台服务器中,默认的负载均衡方式。
挂掉的服务器可以自动从服务列表中剔除。
适用于后台机器性能一致的情况。
代码如下:
upstream bakend { # bakend是名字,可任意起,一般不要有下划线
server 192.168.0.14:8080 ;
server 192.168.0.15:8080 ;
}
server{
listen 80;
server_name localhost;
location / {
proxy_pass http://bakend;
}
}
注意: 这里如果用localhost,在访问服务器时,一次好使一次不好使,经过百度,改成127.0.0.1了
通过proxy_pass配置请求转发地址。即当访问localhost的8010端口时,请求会跳转至localhost的8080端口处。
重新加载配置文件
修改完Nginx的配置后不需要重启Nginx,输入如下命令即可:
nginx -s reload
测试
在浏览器地址栏输入链接时,需要输入完整的请求地址。
如果地址是http://localhost/
结果如下图:
说明静态页面的请求没有转发给tomcat
负载均衡 - 权重
upstream tomcat1{
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8082 weight=1;
}
server{
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat1;
}
}
weight属性,此属性表示各服务器被访问到的权重,weight越高访问到的几率越高
upstream块 参数解释
https://www.malaoshi.top/show_1EF5xy8hDHHj.html
ip_hash
根据请求者ip的hash值将请求发送到后台服务器中,可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
一般很少用这种方式,失去负载均衡意义
upstream tomcat1{
ip_hash;
server 127.0.0.1:8080; # 有 weight=1 也不受影响
server 127.0.0.1:8082;
}
server{
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat1;
}
}
第三方负载均衡处理模块
- fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似 - url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效
session共享
根据客户端ip固定访问tomcat服务器(不推荐)
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题代码如下:
upstream tomcat1{
ip_hash;
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8082 weight=1;
}
问题
用了nginx负载均衡后,在两台tomcat正常运行的情况下,访问 http://localhost 速度非常迅速,通过测试程序也可以看出是得到的负载均衡的效果,但是我们试验性的把其中一台tomcat(server localhost:8080 )关闭后,再查看http://localhost ,发现反应呈现了一半反映时间快,一半反映时间非常非常慢的情况,但是最后都能得到正确结果.
解决
主要是 proxy_connect_timeout 这个参数, 这个参数是连接的超时时间。 设置成1,表示是1秒后超时会连接到另外一台服务器。
proxy_connect_timeout 2;
具体是1秒还是2秒,根据自己的情况做处理
感谢以下文章:
https://www.cnblogs.com/naaoveGIS/p/5478208.html
https://blog.csdn.net/star950117/article/details/82745281
https://blog.csdn.net/lxb15959168136/article/details/53113996/



