目录
[3.IP 哈希](#3.IP 哈希)
一、Nginx概述
1.Nginx应用
Nginx是一款非常优秀的HTTP服务器软件,广泛应用于大型网站的后端,它支持高达50000 个并发连接,并拥有强大的静态资源处理能力
Nginx的运行非常稳定,系统资源(如内存和 CPU)的消耗也非常低。因此,许多大型网站选择 Nginx 作为反向代理服务器和负载均衡器,以提升整个站点的负载并发能力
二、正向代理和反向代理
1.正向代理
正向代理:
是指代理服务器替客户端访问目标服务器,以加快访问速度或突破访问限制。客户端可以访问代理服务器,而代理服务器再去访问目标服务器,并将返回数据传递给客户端。目标服务器只知道请求来自代理服务器,但不清楚实际客户端的地址,因此正向代理可以隐藏客户端的信息
正向代理的工作原理类似于"跳板":当用户无法直接访问某个网站时,用户可以先连接到能够访问该网站的代理服务器,由代理服务器代为获取网站内容,再将内容返回给用户。目标网站只能记录代理服务器的访问,而不一定知道是用户的请求,这取决于代理服务器是否向网站透露用户信息
1.1主要作用
1.隐私保护
隐藏用户 IP 地址:正向代理可以隐藏客户端的真实 IP 地址,对目标服务器只暴露代理服务器的 IP 地址,从而保护用户的隐私
2.绕过地理限制访问受限内容:正向代理可以帮助用户访问被地理位置限制或被网络过滤器屏蔽的网站和服
务。例如,用户可以通过代理服务器访问在其所在国家或地区被禁止的网站
3.内容过滤和监控
访问控制:企业或机构可以通过正向代理实施访问控制,限制员工访问特定网站或内容,或监控用户的上网行为
4.缓存和加速
减少延迟和带宽消耗:正向代理可以缓存请求的内容,减少对原始服务器的重复请求,从而提高访问速度和减少带宽消耗
5.网络安全
安全隔离:通过将客户端请求通过代理服务器转发,可以减少直接暴露到目标服务器的风险,提高网络安全性
6.数据压缩和优化
减小数据量:正向代理可以对传输的数据进行压缩,减少数据传输量,从而提高网络效率
7.绕过审查和防火墙
突破网络限制:在一些网络受限的环境中,如学校或工作场所的防火墙,通过正向代理可以访问被封锁的资源或服务
1.2工作原理
1.客户端请求
客户端(如浏览器)发出请求,目标是访问互联网资源(例如一个网站)
2.请求发送到正向代理客户端将请求发送到正向代理服务器,而不是直接发送到目标服务器。此时,客户端的请求
头中会包含代理服务器的地址,而目标服务器并不会直接接收到请求
3.正向代理处理请求正向代理服务器接收到请求后,会处理请求的相关信息,包括解析目标URL、处理请求头等
4.请求转发到目标服务器正向代理将请求转发到目标服务器。这时,目标服务器只会看到正向代理服务器的IP地址而无法看到客户端的真实 IP 地址
5.目标服务器响应目标服务器处理请求,并生成响应数据,然后将响应发送回正向代理服务器
6.响应转发到客户端正向代理服务器收到来自目标服务器的响应数据,并将其转发给原始的客户端
7.客户端接收响应客户端从正向代理服务器接收响应数据,并对其进行处理和显示
2.反向代理
反向代理:
则是代理服务器替服务器端处理客户端请求,通常用于负载均衡。反向代理屏蔽了后端服务器的信息,常用于多台服务器的分布式部署。对于访问量大的网站,反向代理服务器可以根据一定规则将客户端的请求分发到不同的后端服务器,客户端无需知道具体是哪台服务器处理了请求
2.1主要作用
1.负载均衡
分配请求:反向代理可以将客户端的请求分发到多个后端服务器,从而实现负载均衡。这样可以提高系统的处理能力和响应速度,避免单一服务器的过载
2.缓存加速
提高性能:反向代理可以缓存常见的响应内容,减少对后端服务器的重复请求,从而提高访问速度和降低带宽消耗
3. SSL/TLS 终端
处理加密:反向代理可以处理 SSL/TLS 加密和解密(即 HTTPS 终端),将加密处理从后端服务器中剥离,提高后端服务器的性能和安全性
4.安全性增强
隐藏内部结构:反向代理可以隐藏后端服务器的真实 IP 地址和架构,对外只暴露代理服务器的 IP 地址,从而提高系统的安全性
5.集中管理和监控
统一入口:通过反向代理,可以集中管理和监控所有流量,提供统一的访问日志和流量统计,简化运维和监控工作
6.内容重写和路由
动态路由:反向代理可以根据请求的 URL、主机名或其他请求信息,动态地将请求路由到不同的后端服务器或应用,从而支持复杂的应用场景和需求
7.应用层防火墙
增强防护:反向代理可以充当应用层防火墙,过滤恶意请求和攻击,提供额外的安全防护层
8.跨域支持
解决跨域问题:在某些情况下,反向代理可以帮助解决跨域请求问题,使得不同域名的资源能够在同一个应用中进行交互
2.2工作原理
1.客户端请求发送到反向代理服务器
客户端向某个域名或IP 地址发送请求(例如`www.example.com'),这个地址指向反向代理服务器,而不是实际的后端服务器
2.反向代理服务器接收请求反向代理服务器接收到客户端的请求,解析该请求,确定需要转发给哪个后端服务器。此
时,客户端并不知道实际的后端服务器的地址
3.反向代理转发请求至后端服务器反向代理服务器根据配置,将请求转发到适当的后端服务器进行处理。它可以根据不同的策
略(如负载均衡、内容路由等)选择合适的后端服务器
4.后端服务器处理请求并生成响应后端服务器接收到从反向代理转发的请求后,处理该请求,并生成响应(例如,返回 HTML
页面、API数据等)
5.反向代理接收后端服务器的响应反向代理服务器接收到后端服务器的响应后,它可以选择缓存这些响应以提高后续的请求速
度,或者对响应内容进行处理(如数据压缩、内容修改等)
6.反向代理将响应返回给客户端反向代理服务器将处理后的响应返回给客户端。客户端感知到的服务器就是反向代理服务
器,而不是实际处理请求的后端服务器
三、负载均衡模式
1.轮询
轮询算法:
是 Nginx 的默认分流算法。它按顺序将请求依次分配给每一台后端服务器,直到最后一台服务器,然后重新从第一台服务器开始。这种方法简单且均匀地分配了流量
数据流向:
每个请求依次被分配到下一个服务器。假设有三台服务器(ServerA、ServerB、ServerC)第一个请求被分配到 Server A,第二个请求分配到 Server B,第三个请求分配到 Server C,第四个请求又回到 Server A,依此类推
特点:请求均匀分布,无视服务器的当前负载和响应时间
配置示例
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
2.最少连接数
最少连接数算法:
将请求分配给当前活动连接数最少的服务器。这种算法适用于请求处理时间不均匀的情况,可以有效平衡服务器的负载
数据流向:
每个请求被分配到当前连接数最少的服务器。例如,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 哈希算法:
通过计算客户端 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.加权轮询
加权轮询算法:
允许为每台服务器设置权重,权重越大的服务器将会获得更多的请求。适用于服务器性能不均衡的情况
数据流向:
根据服务器设置的权重值分配请求。假设 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.最少时间算法
最少时间算法:
基于请求的响应时间,将请求分配给响应时间最短的服务器。这种算法适用于需要最大化响应速度的场景,在 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.一致性哈希
一致性哈希算法:
可以保证当集群中某台服务器故障时,只有部分请求会重新分配到其他服务器,而不是全部重新分配。这在缓存等场景中非常有用
数据流向:
根据请求的某个特定参数(如 URL、Cookie 或其他 Header),进行哈希计算,将请求分配到哈希值对应的服务器。假设 Server A 和 Server B,参数 "foo" 的哈希值指向 Server A,参数 "bar" 的哈希值指向 Server B,则 "foo" 请求总是流向 Server A,"bar" 请求总是流向 Server B
特点:适应服务器节点变动,减少请求的重新分配,适合缓存敏感的场景
配置示例
upstream backend {
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
四、规划部署负载均衡和反向代理
1.部署Nginx负载均衡器
关闭防火墙和临时防护
systemctl stop firewalld
setenforce 0
1.1安装所需的依赖包
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
1.2创建Nginx用户
useradd -M -s /sbin/nologin nginx
tail -2 /etc/passwd
1.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-http_ssl_module \
--with-stream
make && make install
1.4创建软链接
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
1.5创建Nginx服务文件
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
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
1.6设置权限并启动Nginx
chmod 777 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
2.部署2台Tomcat应用服务器
停止防火墙并禁用SELinux
systemctl stop firewalld
setenforce 0
2.1安装JDK
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
2.2配置环境变量
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
2.3安装并启动Tomcat
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.动静分离配置
3.1Tomcat1服务器配置
创建JSP页面
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>
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>
修改server.xml
vim /usr/local/tomcat/conf/server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />
</Host>
重启Tomcat服务
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
3.2Tomcat2服务器配置
创建JSP页面
mkdir /usr/local/tomcat/tomcat1/webapps/test
vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>
修改server.xml
vim /usr/local/tomcat/tomcat1/conf/server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host>
重启Tomcat服务
/usr/local/tomcat/tomcat1/bin/shutdown.sh
/usr/local/tomcat/tomcat1/bin/startup.sh
4.Nginx服务器配置
1.准备静态页面和静态图片
echo '<html><body><h1>汪铭是帅哥</h1></body></html>' > /usr/local/nginx/html/index.html
mkdir /usr/local/nginx/html/img
cp /root/game.jpg /usr/local/nginx/html/img
2.修改Nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
http {
...
upstream tomcat_server {
server 172.16.58.10:8080 weight=1;
server 172.16.58.20:8080 weight=1;
server 172.16.58.30:8080 weight=1;
}
server {
listen 80;
server_name www.kgc.com;
charset utf-8;
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;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
root /usr/local/nginx/html/img;
expires 10d;
}
location / {
root html;
index index.html index.htm;
}
}
...
}
3.测试
测试静态页面
浏览器访问:http://172.16.58.40
浏览器访问:http://172.16.58.40/game.jpg
测试负载均衡效果