一、Nginx​​实现负载均衡原理

Nginx实现负载均衡是通过反向代理实现
在这里插入图片描述
Nginx服务器作为前端,Tomcat服务器作为后端,web页面请求由Nginx服务来进行转发。​​

​​但是不是把所有的web请求转发,而是将静态页面请求Nginx服务器自己来处理,动态页面请求,转发给后端的Tomcat服务器来处理。​​

​​据我们所知,Tomcat是属于轻量级的应用服务器,可接受访问量可能会不足,所以我们需要多台Tomcat服务器,然后通过Nginx配置权重来进行挑选Tomcat服务器去进行处理,负载均衡的一种策略

Nginx配置反向代理的主要参数

upstream 服务池名 { }
 
配置后端服务器池,以提供响应数据
 
proxy_pass http://服务池名
 
配置将访问请求转发给后端服务器池的服务器处理

1.正向代理和反向代理

① 正向代理
正向代理 : 代理的是客户端 去访问 服务器 加快访问速度
② 反向代理
反向代理: 代理的是服务端 负载均衡

2.负载均衡模式

1. 轮询(Round Robin):

轮询算法是 Nginx 的默认分流算法。它按顺序将请求依次分配给每一台后端服务器,直到最后一台服务器,然后重新从第一台服务器开始。这种方法简单且均匀地分配了流量。

数据流向:每个请求依次被分配到下一个服务器。假设有三台服务器(Server A、Server B、Server C),第一个请求被分配到 Server A,第二个请求分配到 Server B,第三个请求分配到 Server C,第四个请求又回到 Server A,依此类推。
特点:请求均匀分布,无视服务器的当前负载和响应时间。

配置示例:

upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}

2. 最少连接数(Least Connections):

最少连接数算法将请求分配给当前活动连接数最少的服务器。这种算法适用于请求处理时间不均匀的情况,可以有效平衡服务器的负载。

数据流向:每个请求被分配到当前连接数最少的服务器。例如,Server A 有 2 个连接,Server B 有 5 个连接,新的请求会被分配到 Server A。
特点:动态均衡负载,适用于请求处理时间不一的场景。

配置示例:

upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}

3. IP 哈希(IP Hash):

IP 哈希算法通过计算客户端 IP 地址的哈希值,将请求始终分配给同一台服务器。适用于需要将特定客户端的请求固定在同一台服务器上的场景。

数据流向:每个客户端的 IP 地址被哈希计算,然后根据哈希值将请求固定分配到某一台服务器。假设客户端 X 的哈希值指向 Server A,客户端 Y 的哈希值指向 Server B,则无论多少次请求,X 的请求总是流向 Server A,Y 的请求总是流向 Server B。
特点:同一个客户端总是被分配到同一台服务器,有助于会话保持。

配置示例:

upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}

4. 加权轮询(Weighted Round Robin):

加权轮询算法允许为每台服务器设置权重,权重越大的服务器将会获得更多的请求。适用于服务器性能不均衡的情况。

数据流向:根据服务器设置的权重值分配请求。假设 Server A 权重为 3,Server B 权重为 1,则 4 个请求中,3 个会被分配到 Server A,1 个会被分配到 Server B。
特点:高权重服务器接收更多的请求,适用于服务器性能差异较大的场景。

配置示例:

upstream backend {
server backend1.example.com weight=3;
server backend2.example.com weight=1;
server backend3.example.com weight=2;
}

5. 最少时间算法(Least Time):

最少时间算法基于请求的响应时间,将请求分配给响应时间最短的服务器。这种算法在 Nginx 1.15.3 及以后版本中可用,适用于需要最大化响应速度的场景。

数据流向:每个请求分配到响应时间最短或平均连接时间最短的服务器。假设 Server A 的响应时间较快,Server B 较慢,则新的请求更可能流向 Server A。
特点:进一步优化了最少连接算法,适用于高负载环境下的动态负载均衡。

配置示例:

upstream backend {
least_time header;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}

6. 一致性哈希(Consistent Hashing):

一致性哈希算法可以保证当集群中某台服务器故障时,只有部分请求会重新分配到其他服务器,而不是全部重新分配。这在缓存等场景中非常有用。

数据流向:根据请求的某个特定参数(如 URL、Cookie 或其他 Header),进行哈希计算,将请求分配到哈希值对应的服务器。假设 Server A 和 Server B,参数 “foo” 的哈希值指向 Server A,参数 “bar” 的哈希值指向 Server B,则 “foo” 请求总是流向 Server A,“bar” 请求总是流向 Server B。
特点:适应服务器节点变动,减少请求的重新分配,适合缓存敏感的场景。

配置示例(需要第三方模块如 ngx_http_upstream_hash_module):

upstream backend {
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}

二、Nginx+Tomcat负载均衡、动静分离实验

Nginx 服务器:192.168.44.10:8080
Tomcat服务器1:192.168.44.30:8080
Tomcat服务器2:192.168.44.40:8080

1.实验占用内存,内存最好4G以上

在这里插入图片描述

2.关闭所有实验机器的防火墙

systemctl stop firewalld
setenforce 0

在这里插入图片描述

3.配置nginx服务器

3.1安装所需开发包和编译环境、编译器

yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

3.2创建程序用户,便于准确控制访问

useradd -M -s /sbin/nologin nginx

3.3编译安装nginx

cd /opt
tar zxvf nginx-1.20.2.tar.gz -C /opt/

cd nginx-1.20.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-stream  --with-http_ssl_module

make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service


------------------------------------------------------------------------------------------------------
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \			 	 #启用文件修改支持
--with-http_stub_status_module \ #启用状态统计
--with-http_gzip_static_module \ #启用 gzip静态压缩
--with-http_flv_module \		 #启用 flv模块,提供对 flv 视频的伪流支持
--with-http_ssl_module			 #启用 SSL模块,提供SSL加密功能
--with-stream					 #启用 stream模块,提供4层调度

在这里插入图片描述

4.部署2台Tomcat 应用服务器

systemctl stop firewalld
setenforce 0

cd /opt
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/

vim /etc/profile
#添加至末尾
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

source /etc/profile

tar zxvf apache-tomcat-8.5.16.tar.gz

mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat

/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh

netstat -ntap | grep 8080

在这里插入图片描述

3.动静分离配置

Tomcat server 配置

mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>   #指定为 test1 页面
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>


cd /usr/local/tomcat/conf/
cp server.xml{,_bak}
vim /usr/local/tomcat/conf/server.xml
#由于主机名 name 配置都为 localhost,需要删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true">
	</Context>
</Host>

/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 

在这里插入图片描述

4.Nginx server 配置

echo '<html><body><h1>这是静态页面</h1></body></html>' > /usr/local/nginx/html/index.html
mkdir /usr/local/nginx/html/img
#放入图片
cd /usr/local/nginx/html/img

vim /usr/local/nginx/conf/nginx.conf

http {
......
	#gzip on;
	
	#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
	upstream tomcat_server {
		server 192.168.44.30:8080 weight=1;
		server 192.168.44.40:8080 weight=1;
	}
	
	server {
		listen 80;
		server_name www.kgc.com;
	
		charset utf-8;
	
		#access_log logs/host.access.log main;
		
		#配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理
		location ~ .*\.jsp$ {
			proxy_pass http://tomcat_server;
			proxy_set_header HOST $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		}
		
		#配置Nginx处理静态图片请求
		location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
			root /usr/local/nginx/html/img;
			expires 10d;
		}
		
		location / {
			root html;
			index index.html index.htm;
		}
......
	}
......
}


nginx -s reload       #不关闭服务器的情况下,重新加载配置文件


-------------------------------------------------------------------------------------------------------------------
proxy_pass http://tomcat_server;
##它告诉 Nginx 将该位置匹配到的请求转发到指定的后端服务器


proxy_set_header X-Real-IP $remote_addr;
##将原始请求中的客户端IP地址存储在X-Real-IP请求头中,然后将这个请求头发送到后端服务器。


proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
##将原始请求中的客户端 IP 地址添加到 X-Forwarded-For 请求头中,并将这个请求头发送到后端服务器。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、Nginx四层代理配置

Nginx 四层代理配置

./configure --with-stream

和http同等级:所以一般只在http上面一段设置,
stream {
	
    upstream appserver {
		server 192.168.80.100:8080 weight=1;
		server 192.168.80.101:8080 weight=1;
		server 192.168.80.101:8081 weight=1;
    }
    server {
        listen 8080;
        proxy_pass appserver;
    }
}

http {
......

}

nginx -s reload
Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐