nginx+tomcat负载均衡(ubuntu)废弃

介绍

nginx 通过 反向代理将请求转发给tomcat,并实现 负载均衡,如下图:

负载均衡策略

  1. 轮询(round robin),默认
  2. weight权重
  3. IP_hash
  4. url_hash(第三方)
  5. fair(第三方)

负载均衡-轮询

依次将请求分配到各个后台服务器中,默认的负载均衡方式。
挂掉的服务器可以自动从服务列表中剔除。

适用于后台机器性能一致的情况。

修改nginx.conf文件,截图如下:

代码如下:

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;
    }
}

第三方负载均衡处理模块

  1. fair
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似
  2. url_hash
    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效

session共享

  1. 参见 https://www.malaoshi.top/show_1EF5vjGrvRhL.html

  2. 根据客户端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/


原文出处:/show_1EF21bT8qTqN.html