目录
https://blog.csdn.net/Lzcsfg/article/details/139781909
一. 实验准备
二. 配置反向代理
三. 配置二层代理
解释流程
一. 实验准备
关闭防火墙和selinux,准备三台同一网段的虚拟机
localhost | Roucky_linux9.4 | 192.168.226.20 |
localhost | Roucky_linux9.4 | 192.168.226.21 |
localhost | Roucky_linux9.4 | 192.168.226.22 |
三台服务器都配置官方的nginx源并下载和启动
sudo tee /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=https://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=https://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF
yum install -y nginx
systemctl enable --now nginx
此时三台服务器都可以正常开启
二. 配置反向代理
正向代理和反向代理对比示意图
两者的区别在于代理的对象不一样:
正向代理中代理的对象是客户端,proxy和client同属一个LAN,对server透明;
反向代理中代理的对象是服务端,proxy和server同属一个LAN,对client透明。
现让192.168.226.20做客户端 ,192.168.226.21做代理服务器
对192.168.226.20做如下配置:
编辑配置文件/etc/nginx/conf.d/default.conf
vim /etc/nginx/conf.d/default.conf
#修改配置文件为如下:
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://192.168.226.21; # 设置代理目标的地址
proxy_redirect default; # 开启默认的代理重定向
proxy_set_header Host $http_host; # 设置代理请求中的 Host 头部
proxy_set_header X-Real-IP $remote_addr; # 设置真实客户端 IP 地址的头部
proxy_set_header REMOTE-HOST $remote_addr; # 设置远程主机的头部,此处与 X-Real-IP 重复了
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置经过的代理 IP 地址的头部
proxy_connect_timeout 30; # 设置与后端服务器建立连接的超时时间为30秒
proxy_send_timeout 60; # 设置向后端服务器发送请求的超时时间为60秒
proxy_read_timeout 60; # 设置从后端服务器读取响应的超时时间为60秒
proxy_buffering on; # 开启代理缓冲
proxy_buffer_size 32k; # 设置单个缓冲区的大小为32KB
proxy_buffers 4 128k; # 设置用于存储响应数据的缓冲区的数量和大小
proxy_busy_buffers_size 256k; # 设置活跃缓冲区的最大大小为256KB
proxy_max_temp_file_size 256k; # 设置临时文件的最大大小为256KB
}
error_page 500 502 503 504 /50x.html; # 定义处理5xx错误的页面
location = /50x.html {
root /usr/share/nginx/html; # 指定50x错误页面的根目录
}
}
测试Nginx配置文件
nginx -t
重新加载Nginx配置
nginx -s reload
现在在代理服务器192.168.226.21上查看Nginx访问日志
tail -f /var/log/nginx/access.log
整体解释
日志条目显示了来自IP地址 192.168.226.20
的客户端在2024年6月18日19:11:57(+0800时区)发起的多个HTTP请求。这些请求都是对服务器根路径 /
使用HTTP/1.0方法发起的 GET
请求。服务器返回的HTTP状态码是 304
,表示资源未修改,客户端可以使用缓存的版本,因此响应大小为 0
字节。客户端的用户代理字符串表明它使用的是Chrome浏览器。X-Forwarded-For
字段显示客户端的真实IP地址为 192.168.226.1
。
简单讲记录了来自192.168.226.20的客户端的IP的记录,但是真实请求的IP是192.168.226.1
三. 配置二层代理
在之前的实验里,我用windows客户端访问192.168.226.20,对192.168.226.20作量一层代理,一层代理服务器为192.168.226.21,现在我要讲192.168.226.21的下一层代理设置为192.168.226.22,即实现二层代理。
对192.168.226.22编辑配置文件
vim /etc/nginx/conf.d/default.conf
#修改配置文件为如下:
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://192.168.226.22;
proxy_redirect default;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
测试Nginx配置文件
nginx -t
重新加载Nginx配置
nginx -s reload
现在在代理服务器192.168.226.22上查看Nginx访问日志
tail -f /var/log/nginx/access.log
查看192.168.226.21的日志:
查看192.168.226.20的日志:
修改默认发布页面用来辨别
#对192.168.226.20修改
echo "webserver1" > /usr/share/nginx/html/index.html
systemctl restart nginx
#对192.168.226.21修改
echo "webserver2" > /usr/share/nginx/html/index.html
systemctl restart nginx
#对192.168.226.22修改
echo "webserver3" > /usr/share/nginx/html/index.html
systemctl restart nginx
浏览器刷新页面访问
实际上访问192.168.226.20是192.168.226.22提供的服务。
解释流程
- Windows客户端 发送请求到
http://192.168.226.20/
。 - Nginx 1 (在192.168.226.21) 接收到请求,根据配置将其转发到目标服务器 192.168.226.22。
- Nginx 2 (在192.168.226.22) 接收从Nginx 1转发的请求,并根据其配置将请求转发到最终的应用服务器,即也是192.168.226.22。
同理,三层nginx的代理也是往上叠加。