目录
一、准备服务器
准备1台Nginx服务器和3台Tomcat服务器,并修改3台服务器中Tomcat的默认访问页面,用数字标记页面所处的服务器。
vim /usr/local/tomcat-api/webapps/ROOT/index.jsp
二、配置上游服务器
在nginx.conf文件中配置上游服务器
# 配置上游服务器,每一个IP都对应一台服务器
upstream tomcats {
server 192.168.72.132:8080;
server 192.168.72.133:8080;
server 192.168.72.134:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcats;
}
}
注:proxy_pass为代理转发配置。
三、负载均衡策略-轮训
完成上述配置后,启动Nginx,用浏览器访问Nginx服务器的80端口,反复刷新页面,会发现请求依次被转发到了不同的服务器。这其实是Nginx负载均衡默认的策略:轮训,通过轮训策略,可以将请求平均分配给各个服务器处理。
四、负载均衡策略-加权轮训
根据不同服务器的性能,给各个服务器增加权重,比如某个服务器硬件配置比较好,就可以给该服务器分配更多的请求,同理分配比较少的请求给硬件配置较差的服务器。
配置如下:
upstream tomcats {
# weight的值越大,分配到的请求就会越多
server 192.168.72.132:8080 weight=1;
server 192.168.72.133:8080 weight=2;
server 192.168.72.134:8080 weight=5;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcats;
}
}
五、负载均衡策略-ip_hash
ip_hash是根据用户请求过来的ip,映射成hash值,然后分配到一个特定的服务器里面。使用ip_hash这种负载均衡以后,可以保证用户的每一次会话都只会发送到同一台特定的Tomcat里面,它的session不会跨到其他的tomcat里面去的。
upstream tomcats {
ip_hash;
server 192.168.72.132:8080;
server 192.168.72.133:8080 down;
server 192.168.72.134:8080;
}
注意事项:
一旦使用了ip_hash,当我们需要移除一台服务器的时候,不能直接删除这个配置项,而是需要在这台服务器配置后面加上关键字down,表示不可用。因为如果直接移除配置项,会导致hash算法发生更改,后续所有的请求都会发生混乱。
六、负载均衡策略-hash
服务端映射是基于散列key值的负载均衡策略,其中key值可以是文本、变量以及文本变量的组合。如果从一组上游服务器中添加或者删除服务器,将导致大部分key重新映射到不同的服务器。
hash key [consistent]
举例:根据url计算hash值,然后分配到特定的服务器里。具体配置如下:
upstream tomcats {
# $request_uri是从客户端发送过来的原生请求URI,包括参数
hash $request_uri;
server 192.168.72.132:8080;
server 192.168.72.133:8080;
server 192.168.72.134:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcats;
}
}
注意:基于hash(url)的负载均衡策略,如果同一时间有大量的相同url请求过来,那么一台服务器也可能支撑不住,这个时候我们可以再做一层负载均衡,通俗来说,就是在nginx的上游服务器安装nginx再做一层转发。
七、负载均衡策略-最少连接(least_conn)
最少连接算法是指将请求传递到具有最少活动连接数的服务器,同时考虑服务器的权重。如果有多个上游服务器的连接数/权重同为最小,那么会采用加权轮训算法依次访问它们。
采用轮训的负载均衡策略,前提是每个请求所占用的后端时间要差不多,如果一些请求占用的时间较长,就会导致其所在的后端负载较高(由于请求占用的时间较长,连接数会因此不断累积),在这种场景下,把请求转发给连接数较少的服务器,能够达到更好的负载均衡的效果,这就是最少连接算法(least_conn)。
具体案例如下:
upstream tomcats {
# 最少连接
least_conn;
server 192.168.72.132:8080;
server 192.168.72.133:8080;
server 192.168.72.134:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcats;
}
}