对于实际的业务来说,随着业务量的增大,对于服务器端的压力也会越来越大,那么通常可以通过服务器端集群的方式来减缓每台服务器的压力。
在这个过程中每台服务器都希望对外提供服务,防止某一台负载过高而其他没有负载的情况,达到资源利用的最大化。nginx的负载均衡就能很好的解决这个问题。
1. 负载均衡的定义
负载均衡(Load Balancing)是将传入的请求流量分发到多个后端服务器的技术,以达到消除单点故障、提高可用性、增加扩展性等目的。
2. nginx如何实现负载均衡
`11.0.1.50`和`11.0.1.51`模拟应用服务端集群,里面部署了后端程序,不对外暴露。`11.0.1.10`是反向代理和负载均衡服务器,对外暴露。为了能演示效果,tomcat安装了不同版本。
现在修改nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
本机对外暴露的主机或域名,监听的依然是80端口,但却被同时代理到了`11.0.1.50`和`11.0.1.51`的8080端口。
http{
upstream fzjh{
server 11.0.1.50:8080;
server 11.0.1.51:8080;
}
server {
listen 80;
server_name www.jiangnan.com;
location / {
proxy_pass http://fzjh;
}
}
}
3. 再次访问
虽然访问了`11.0.1.10`,但是流量被分配到了`11.0.1.50`和`11.0.1.51`。
4. 负载均衡算法
轮询(Round Robin)
轮询算法是最简单的负载均衡算法之一,也是nginx默认算法。它按照顺序将请求依次分发给每个后端服务器。
示例:
http {
upstream fzjh{
server www.fzjh1.com;
server www.fzjh2.com;
}
server {
location / {
proxy_pass http://fzjh;
}
}
}
最少连接数(Least Connections)
最少连接数算法将请求分配给当前活动连接数最少的后端服务器。这种算法适用于长连接的场景。
示例:
http {
upstream fzjh{
least_conn;
server www.fzjh1.com;
server www.fzjh2.com;
}
server {
location / {
proxy_pass http://fzjh;
}
}
}
IP哈希(IP Hash)
IP哈希算法根据客户端IP地址的哈希值将请求分配给后端服务器。这样,同一个客户端的请求总是被分配到同一台后端服务器。
示例:
http {
upstream fzjh{
ip_hash;
server www.fzjh1.com;
server www.fzjh2.com;
}
server {
location / {
proxy_pass http://fzjh;
}
}
}
URL哈希(URL Hash)
URL哈希算法根据请求URL的哈希值将请求分配给后端服务器。这样,相同URL的请求总是被分配到同一台后端服务器。
示例:
http {
upstream fzjh{
hash $request_uri;
server www.fzjh1.com;
server www.fzjh2.com;
}
server {
location / {
proxy_pass http://fzjh;
}
}
}
加权轮询(Weight Round Robin)
加权轮询算法在轮询的基础上,为每台后端服务器分配一个权重。权重越高,分配到的请求越多。适用于后端服务器性能差异较大的情况。
示例:
http {
upstream fzjh{
server www.fzjh1.com weight=3;
server www.fzjh2.com weight=1;
}
server {
location / {
proxy_pass http://fzjh;
}
}
}
不同的算法适用于不同的场景,可以根据实际需求选择合适的算法。通过合理配置Nginx的负载均衡,可以提高系统的性能和可靠性,确保服务的高可用性和稳定性。
5. upstream模块参数解析
示例:
http{
upstream fzjh{
server 11.0.1.50:8080 weight=3 max_fails=3 fail_timeout=10;
server 11.0.1.51:8080 weight=1;
}
server {
listen 80;
server_name www.jiangnan.com;
location / {
proxy_pass http://fzjh;
}
}
}