一、nginx反向代理模拟搭建
[!IMPORTANT]
步骤:
1.准备三台服务器,一台装nginx,配置两个网卡,一个有网一个无网;两台装jdk和tomecat,无网(仅主机模式)
2.两台被访问的服务器,进入tomcat中的webapps中,删除所有文件,创建ROOT文件夹,创建index.html文件随便写点东西
3.nginx服务器,配置两个location访问,用proxy_pass(指定请求应被转发到的后端服务器)指定要转发到的服务器,注意区分结尾加不加/的区别。
4.重新启动nginx,启动两台tomcat。
5.访问http://192.168.*.*/user/时访问user,admin则访问admin
1. 服务器准备
准备三台服务器,一台装nginx,配置两个网卡,一个外网nat模式一个内网仅主机模式;两台装jdk和tomecat,内网(仅主机模式),但为了实验操作方便,也配置个外网。
2. 服务器环境搭建
-
环境初始化
# 1. 设置主机名 hostnamectl set-hostname $1# 2. 关闭防火墙 systemctl stop firewalld && systemctl disable firewalld setenforce 0 sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config # 3. 配置yum源 cd /etc/yum.repos.d mkdir bak mv *.repo bak curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo yum clean all yum makecache yum install epel-release -y
-
代理服务器安装nginx
采用配置yum源方式安装
vim /etc/yum.repos.d/nginx.repo
写入下面内容:
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true[nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
yum install nginx -y
安装稳定版 -
web服务器安装tomcat和jdk
版本apache-tomcat-9.0.111.tar.gz,jdk-17.0.12_linux-x64_bin.tar.gz
采用解压缩方式安装
jdk安装完要配置环境变量
3. 修改配置文件
-
修改tomcat
vim /usr/local/apache-tomcat-9.0.111/webapps rm -rf * mkdir ROOT cd ROOT#在web服务器1中创建并添加内容 echo user1 > index.html #在web服务器2中创建并添加内容 echo user2 > index.html#重启tomcat cd /usr/local/apache-tomcat-9.0.111/bin ./startup.sh cd
-
配置nginx子配置文件
vim /etc/nginx/conf.d/default.conf#在内部server块内添加 #user1|user2是测试阶段ip后面跟的字段 location /user1/{proxy_pass http://web服务器1的内网ip:8080/; } #注意要加http:// location /user2/{proxy_pass http://web服务器2的内网ip:8080/; }
重启nginx
systemctl restart nginx
-
测试
http://代理服务器外网ip/user1
显示web服务器1的index.html内容http://代理服务器外网ip/user2
显示web服务器2的index.html内容
4. tomcat日志获取真实IP
进入 /usr/local/apache-tomcat-9.0.111/logs/localhost_access_log.2025-10-20.txt可以看到登录日志
192.168.. - - [20/Oct/2025:08:38:30 -0400] "GET / HTTP/1.0" 200 6
这个ip是nginx服务器的IP,这个IP并不是我们想要的结果,而是想要的真实的客户端的IP
-
在nginx的子配置文件,刚添加的两个location的基础上加上如下内容
location /user1/{proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://web服务器1的内网ip:8080/;proxy_redirect default;#这行要放最后 }location /user2/{proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://web服务器2的内网ip:8080/;proxy_redirect default;#这行要放最后 }
-
修改tomcat日志格式文件
vim /usr/local/apache-tomcat-9.0.111/conf/server.xml
#找到 <Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Real-IP" /><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"#在这边加入%{X-Real-IP}ipattern="%{X-Real-IP}i %h %l %u %t "%r" %s %b" /></Host>
[!CAUTION]
改完记得重启tomcat
./shutdown.sh
./startup.sh
-
测试
tail -f /usr/local/apache-tomcat-9.0.111/logs/localhost_access_log.2025-10-20.txt
访问
http://代理服务器外网ip/user1
在虚拟机中可以看到:
192.168.*.* 192.168.*.* - - [20/Oct/2025:08:57:08 -0400] "GET / HTTP/1.0" 304 - 前面多了一个ip,这个ip就是真实的访问ip
二、补充
1. 正向代理与反向代理的区别
-
正向代理
用户访问的是目标服务器的地址
用户明确知道代理服务器的存在
-
反向代理
用户访问的是代理服务器的地址
用户不知道代理服务器的存在
2. 代理基本配置及语法
模块: ngx_http_proxy_module
指令: proxy_pass
位置: location、
作用: 设置代理服务器将请求转发到的协议(http或https)、地址(主机名或IP)以及可选的URI。此指令是proxy模块的核心,用于指定请求应被转发到的后端服务器
常见配置:
proxy_set_header: 设置真实客户端地址# 设置 Host 头部proxy_set_header Host $http_host; # 设置客户端真实 IP 地址(请求的客户机的真实ip)proxy_set_header X-Real-IP $remote_addr; # 设置请求的来源 IP 地址链(转发服务器的ip)proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect: 转发时是否使用默认端口proxy_redirect [ default|off|redirect replacement ];
proxy_connect_timeout: Nginx与后端服务器建立连接的超时时间
proxy_read_timeout: Nginx从后端服务器读取响应的超时时间
proxy_send_timeout: Nginx向后端服务器发送的请求超时时间proxy_connect_timeout 5s;proxy_read_timeout 60s;proxy_send_timeout 10s;
proxy_buffering: 缓冲开关
proxy_buffer_size: 缓冲区大小
proxy_buffers: 缓冲区数量
proxy_busy_buffers _size: 忙碌的缓冲区大小proxy_buffering [ on | off ]; proxy_buffer_size 4k|8k;proxy_busy_buffers 8 4k|8k;proxy_busy_buffers_size 8k|16k;
3. proxy_passhttp://tomcat-user:8080/地址后面带/与不带/是否区别
-
notice1:
带/:地址匹配成功后,直接从webapps/ROOT下寻找资源。location /user/ /user/不会拼接到转发的地址中
不带/:表示通过匹配的地址去寻找资源,/user/会拼接到转到的地址中
-
notice2:
/user/的含义是:http://192.168.217.143/user/a.html 出去协议,IP,端口之后,以/user/开头的请求