nginx反向代理测试搭建

news/2025/10/23 20:29:47/文章来源:https://www.cnblogs.com/xiaopixiong/p/19161582

一、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.mzph.cn/news/944655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SwiftUI NavigatorStack 导航容器

NavigationStack 是一个用状态驱动、类型安全的声明式导航容器,它通过管理视图堆栈和导航路径来实现 SwiftUI 应用中的页面导航(专注于单栏场景) NavigationStack 需要 iOS 16.0+以上版本支持。 核心要素 Navigatio…

深入解析:【仿生机器人】基于 GPT-SoVITS 的 发声器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

.NET Core报错克服【无废话上操作】

.NET Core报错克服【无废话上操作】pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco…

深入解析:【算法】【数学】 练习题目列表

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

题解:P11831 [省选联考 2025] 追忆

\(\LARGE {P11831 [省选联考 2025] 追忆}\) 题解原出处 请阅读完彼题解再阅读此题解,此题解不对解题思路分析有帮助 仅仅提供代码上的解惑 我只是对他的代码进行了非常详细的注释处理,orz大佬题意: 大哥图,考虑的是…

2025-10-23 MX-S 模拟赛 赛后总结【MX】

赛时 Record14:30 为何 T1 串串。 14:45 摸了字符串哈希。这真的是大洋里吗,为何这么水。 14:58 诶我草原来 T2 的 \(t_i\le 3\) 吗。 15:22 试图推 T2 神秘 dp 式。 16:00 被击败了。 16:09 写出来了,最后发现是忘了…

PCL1.12 解决memory.h中EIGEN处中断问题

PCL1.12 解决memory.h中EIGEN处中断问题在使用PCL1.12时,出现已在 VisionFormatWork.exe 中执行断点指令(__debugbreak () 语句或类似调用) 的提示。 __debugbreak() 是一个由编译器提供的 调试断点指令(类似汇编中…

深入解析:链表的核心思想

深入解析:链表的核心思想pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…

AI元人文构想:参与“自由与责任”哲学思考——岐金兰之实验

AI元人文构想:参与“自由与责任”哲学思考——岐金兰之实验 让我们以“AI元人文”构想为透镜,重新审视“自由与责任”这一古老的哲学谜题。这将不再是一场纯粹的思辨,而是一次为智能行为构建底层架构的思想实验。 基…

20251023

总结 A 预计:100,实际:60 用时:10min思路历程:居然看错题了,以为可以整个一段全部是一个字母,关键是样例刚好全部能过 正解:666 收获:最好多看几遍题和数据范围B 预计:100,实际:100 用时:30min思路历程:…

Java常用机制 - SPI机制详解

目录Java常用机制 - SPI机制详解简单介绍SPI工作流程SPI实现代码示例步骤 1:定义服务接口步骤 2:提供具体实现(由不同厂商提供)步骤 3:创建配置文件步骤 4:使用 ServiceLoader 发现并调用服务输出可能为:需要SP…

实用指南:用户研究:用户研究和数据分析的根本联系与区别

实用指南:用户研究:用户研究和数据分析的根本联系与区别2025-10-23 20:01 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important…

2025.10.23——2绿2蓝

普及+/提高 P2914 [USACO08OCT] Power Failure G 最短路,简单预处理 P9912 [COCI 2023/2024 #2] Zatopljenje T1,离线树状数组 提高+/省选- P9906 [COCI 2023/2024 #1] Kocke T2,没想到的DP P9031 [COCI 2022/2023 …

Anaconda命令大全conda

创建虚拟环境 conda create --name myenvpython37 python=3.7使用该虚拟环境 conda activate myenvpython37退出使用虚拟环境 conda deactivate

完整教程:状态管理库 Zustand 的接入流程与注意点

完整教程:状态管理库 Zustand 的接入流程与注意点pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

采用opencv来识别信用卡的号码

采用opencv来识别信用卡的号码pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

塔吊施工环境与附属设施监测!思通数科 AI 卫士筑牢全场景安全防线

塔吊施工安全不仅依赖核心部件与人员操作合规,周边环境与附属设施的隐患也常成为 “安全盲区”:塔吊周边地面是否存在积水、泥泞,易引发作业人员滑倒,但人工巡检易忽视此类环境细节;有限空间入口处安全标识、警示…

精读《C++20设计模式》:重新理解设计模式系列 - 详解

精读《C++20设计模式》:重新理解设计模式系列 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

网络设备

1. 交换机(缓存接入的所有设备的ip,mac地址等) 2. 路由器(公司级,企业级)

Kafka-保证消息消费的顺序性及高可用机制 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …