反向代理
正向代理服务器

反向代理服务器

## 反向代理
location {
proxy_pass http://192.168.221.20;
# 反向代理优化
proxy_set_header Host $host; # 修改请求头,添加Host字段
proxy_set_header X-Real-IP $remote_addr; # 修改请求头,添加X-Real-IP字段
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 修改请求头,添加X-Forwarded-For字段
client_max_body_size 10m; # 允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; # 缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; # nginx跟后端服务器连接超时时间\(代理连接超时\)
proxy_send_timeout 90; # 后端服务器数据回传时间\(代理发送超时\)
proxy_read_timeout 90; # 连接成功后,后端服务器响应时间\(代理接收超时\)
proxy_buffer_size 4k; # 设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; # proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; # 高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; # 设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
proxy_pass: nginx反向代理指令
在本机服务器(192.168.221.129)上编辑nginx.conf文件
vim /usr/local/nginx/conf/nginx.conf
+++++++++++++++++++++++++++++++++++++
# 把最后一个location的root和index注释掉
## 反向代理
proxy_pass http://192.168.221.20;
+++++++++++++++++++++++++++++++++++++
# 检测语法
/usr/local/nginx/sbin/nginx -t
# 重启Nginx
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx
## 此时用浏览器输入192.168.221.129就会自动跳转到代理的Apache页面
## 在代理服务器(192.168.221.20)上下载httpd——Centos7版本
systemctl start httpd
# 如果上面这步有问题,可以检查端口80是否被占用,比如之前被Nginx占用,就关闭它,然后继续
netstat -tulpn | grep :80
# 编辑一个新的首页
vim /var/www/html/index.html(如果原本有首页就mv到bak再vim)
# 随便写点html内容,保存退出,重启
systemctl restart httpd
## 此时再刷新浏览器就会变成刚设置的html首页了
## 在代理服务器(192.168.221.131)上下载apache2——Ubuntu版本
# 下载apache2
apt install apache2
systemctl restart apache2
# 删除首页,编辑配置文件
vim /var/www/html/index.html
systemctl restart apache2
负载均衡upstream
在本机服务器(192.168.221.129)上编辑nginx.conf文件
## 在proxy后面补充以下内容
-----------------------------
# 保留原始Host头
proxy_set_header Host $host;
# 传递真实客户端IP
proxy_set_header X-Real-IP $remote_addr;
# 传递经过代理链的客户端IP列表
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 传递请求协议(http/https)
proxy_set_header X-Forwarded-Proto $scheme;
在代理服务器Ubuntu(192.168.221.131)上操作
# 下载Apache2
apt install apache2
systemctl restart apache2
# 删除首页,编辑配置文件
vim /var/www/html/index.html
systemctl restart apache2
# 然后打开浏览器刷新就可以来回打开这两个网站
在本机服务器(192.168.221.129)上编辑nginx.conf文件
## 编辑配置文件,可以在gzip on下面添加两个代理ip
vim /usr/local/nginx/conf/nginx.conf
upstream web1 {
server 192.168.221.20;
server 192.168.221.131;
}
proxy_pass http://web1;
保存重启nginx后,就可以刷新浏览器查看这两个网站的内容了
-
负载均衡
-
模式(算法)
-
轮询(默认,RR,Round Robin):将请求按顺序平均分配给所有服务器,适合服务器性能相似的场景;
-
最小连接数(Least Connections):负载均衡服务器会记录每台后端服务器的连接数,它会智能地将最新请求发送给连接数最少的服务器,适合连接数波动较大的场景,如长连接服务;
-
IP哈希(IP Hash):通过请求的客户端IP进行哈希运算,将来自同一IP地址的请求分发到同一台服务器上,适合有会话保持需求的场景。
-
权重(Weight):为不同的服务器分配权重,Nginx 将根据设置的权重值来分发请求,权重越高的服务器将承担更多的流量,适合服务器性能不均衡的场景。“权重+轮询=加权轮询”
-
-
# 设置集群分组
upstream web1 {
server 192.168.221.11; #轮询——按顺序平均分配
server 192.168.221.12;
server 192.168.221.13;
server 192.168.221.14;
...
}
upstream web2 {
least_conn; #最小连接数
server 192.168.221.11;
server 192.168.221.12;
server 192.168.221.13;
server 192.168.221.14;
...
}
upstream web3 {
ip_hash; #IP哈希模式,算出来一个IP地址固定
server 192.168.221.11;
server 192.168.221.12;
server 192.168.221.13;
server 192.168.221.14;
...
}
upstream web4 {
server 192.168.221.11 weight=3; #权重
server 192.168.221.12;
server 192.168.221.13;
server 192.168.221.14 weight=5;
...
}
### 其他配置
weight=number: 设置向这台上游服务器转发的权重,默认为1。
max_fails=number: 该选项与 fail_timeout 配合使用,指在 fail_timeout 时间段内,如果
向当前的上游服务器转发失败次数超过 number,则认为在当前的 fail_timeout 时间段内这台
上游服务器不可用。max fails 默认为1,如果设置为 0,则表示不检查失败次数。
fail_timeout=time: fail_timeout 表示该时间段内转发失败多少次后就认为上游服务器暂时
不可用,用于优化反向代理功能。它与向上游服务器建立连接的超时时间、读取上游服务器的
响应超时时间等完全无关。fail_timeout 默认为10秒。
down: 表示所在的上游服务器永久下线,只在使用ip_hash 配置项时才有用
backup: 在使用 ip_hash 配置项时它是无效的。它表示所在的上游服务器只是备份服务器,
只有在所有的非备份上游服务器都失效后,才会向所在的上游服务器转发请求。
优化配置
灰度发布
-
灰度发布:增量发布,逐步用新版本替换旧版本,实现平稳过渡;新版本出现问题时,方便及时回滚;
-
降低风险:
-
通过逐步部署,可以及时发现和修复新版本中的问题,避免大规模故障。
-
-
快速反馈:
-
可以在真实环境中快速获得用户反馈,帮助改进新版本。
-
-
灵活回滚:
-
如果发现问题,可以快速回滚到旧版本,减少对用户的影响。
-
-
数据驱动决策:
-
可以根据监控数据和用户反馈做出部署决策,提高发布的可靠性。
-
-
灰度发布的策略:
-
基于权重的灰度发布:
-
在Nginx配置中,通过为不同版本的服务设置不同的权重,来控制请求被分配到各个版本的比例。例如,初始阶段可以将新版本的权重设置为20%,旧版本的权重设置为80%。
-
随着新版本的表现逐渐稳定,可以逐步增加新版本的权重,直到最终将所有请求都切换到新版本。
-
-
基于Cookie的灰度发布:
-
在应用端设置一个标识用户是否参与灰度测试的Cookie,例如
is_gray=1表示参与,is_gray=0表示不参与。 -
在Nginx配置中,通过读取用户请求中的Cookie信息,来决定将请求路由到哪个版本的服务。当用户的请求中带有
is_gray=1的Cookie时,Nginx会将请求路由到新版本的服务;否则,请求将被路由到旧版本的服务。
-
-
基于IP地址的灰度发布:
-
根据用户的IP地址来控制请求的路由。例如,可以指定某个IP段(如192.168.1.0/24)的用户能够访问新版本的服务。
-
在Nginx配置中,使用
geo模块来根据用户的IP地址分配不同的后端服务。
-
平滑升级
-
Nginx平滑升级(了解):在不停止nginx服务的情况下,更新nginx的版本;
具体升级步骤:
-
关闭 Nginx 服务 /usr/local/nginx/sbin/nginx -s stop 或者 kill QUIT PID
-
升级 Nginx 二进制文件
-
启动 Nginx 服务 /usr/local/nginx/sbin/nginx
-
注意,请将Nginx 的路径替换成真实的路径
-
worker进程数量和最大连接数;
#启动工作进程数量 worker_processes 4; #指定运行的核的编号,采用掩码的方式设置编号 worker_cpu_affinity 0001 0010 0100 1000; events { #单个工作进程维护的请求队列长度 worker_connections 1024; } -
gzip on;是否压缩,压缩数据可以节省带宽;
# 开启gzip gzip on; #Nginx做为反向代理的时候启用: off – 关闭所有的代理结果数据压缩 expired – 如果header中包含”Expires”头信息,启用压缩 no-cache – 如果header中包含”Cache-Control:no-cache”头信息,启用压缩 no-store – 如果header中包含”Cache-Control:no-store”头信息,启用压缩 private – 如果header中包含”Cache-Control:private”头信息,启用压缩 no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息,启用压缩 no_etag – 启用压缩,如果header中包含“ETag”头信息,启用压缩 auth – 启用压缩,如果header中包含“Authorization”头信息,启用压缩 any – 无条件压缩所有结果数据 gzip_proxied any; # 启用gzip压缩的最小文件,小于设置值的文件将不会压缩 gzip_min_length 1k; # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明 gzip_comp_level 1; # 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。 gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml; # 增加响应头”Vary: Accept-Encoding” # 是否在http header中添加Vary: Accept-Encoding,建议开启 gzip_vary on; # 禁用IE 6 gzip gzip_disable "MSIE [1-6]\."; # 设置压缩所需要的缓冲区大小 gzip_buffers 32 4k; # 设置gzip压缩针对的HTTP协议版本 gzip_http_version 1.0; -
长连接:减少服务器维护因为与客户端建立http连接产生的大量tcp三次握手四次断开的开销;
keepalive_timeout 0; # 0代表关闭 #keepalive_timeout 100; #keepalive_requests 8192; -
本地缓存静态文件;将部分数据缓存在用户本地磁盘,用户加载时,如果本地和服务器的数据一致,则从本地加载。提升用户访问速度,提升体验度。节省公司带宽成本。
expires指令:开启缓存并指定静态缓存时间 location ~* \.(png|gif)$ { expires 1h; }
858

被折叠的 条评论
为什么被折叠?



