当前位置: 首页 > news >正文

nginx反向代理测试搭建

一、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. 环境初始化

    # 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
    
  2. 代理服务器安装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安装稳定版

  3. web服务器安装tomcat和jdk

    版本apache-tomcat-9.0.111.tar.gz,jdk-17.0.12_linux-x64_bin.tar.gz

    采用解压缩方式安装

    jdk安装完要配置环境变量

3. 修改配置文件

  1. 修改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
    
  2. 配置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

  3. 测试

    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

  1. 在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;#这行要放最后
    }
    
  2. 修改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 &quot;%r&quot; %s %b" /></Host>
    

    [!CAUTION]

    改完记得重启tomcat

    ./shutdown.sh ./startup.sh

  3. 测试

    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. 正向代理与反向代理的区别

  1. 正向代理

    用户访问的是目标服务器的地址

    用户明确知道代理服务器的存在

  2. 反向代理

    用户访问的是代理服务器的地址

    用户不知道代理服务器的存在

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/地址后面带/与不带/是否区别

  1. notice1:

    带/:地址匹配成功后,直接从webapps/ROOT下寻找资源。location /user/ /user/不会拼接到转发的地址中

    不带/:表示通过匹配的地址去寻找资源,/user/会拼接到转到的地址中

  2. notice2:

    /user/的含义是:http://192.168.217.143/user/a.html 出去协议,IP,端口之后,以/user/开头的请求

http://www.hskmm.com/?act=detail&tid=37604

相关文章:

  • 基础概念
  • .NET Core报错克服【无废话上操作】
  • 题解:P11831 [省选联考 2025] 追忆
  • 2025-10-23 MX-S 模拟赛 赛后总结【MX】
  • PCL1.12 解决memory.h中EIGEN处中断问题
  • 完整教程:状态管理库 Zustand 的接入流程与注意点
  • 20251023
  • Java常用机制 - SPI机制详解
  • 塔吊施工环境与附属设施监测!思通数科 AI 卫士筑牢全场景安全防线
  • 采用opencv来识别信用卡的号码
  • 网络设备
  • 第二十二篇
  • 《程序员修炼之道:从小工到专家》阅读笔记1
  • 负载均衡及三种软件负载
  • 在 GEO / AIO 角度:如何优化 SEO 内容?
  • 多级多卡训练模型时有些参数没有参与loss计算和梯度更新的解决办法
  • 无题
  • Idea提高制作效率的快捷键最佳学习方式
  • rocky10自己手动换源
  • ski 和 db 模块的通信
  • 完整教程:ImmuCellAI 免疫浸润分析
  • 4.6.2版本来了!快来看看新版本有哪些改动
  • 2025-10-22 ZR-J 模拟赛 赛后总结【ZR】
  • P5285 [十二省联考 2019] 骗分过样例
  • Liferay Portal与DXP集合提供程序存在授权缺失漏洞分析
  • MapGIS Objects Java计算一条三维线段与一个三角形所在的平面的交点 - 教程
  • layui时间与日期选择器,时间范围查询数据,后端springboot
  • 读书笔记:OpenPBR 规范(2)
  • 轻量级图片信息解析程序
  • 2025.10.23 闲话-全局位运算 max 的解法