1. 引言
1.1 背景介绍
起因是想要利用阿里云的解析设置子域名my.XXX.space解析到www.XXX.space:58090端口,然而由于阿里云的限制,未备案的地址无法被重定向,只能寻求用nginx反向代理完成以上操作.


1.2 文章目标
利用nginx反向代理重定向,完成子网站解析到ip:端口工作,达到隐藏端口并简化访问的功能.
2. 核心概念
2.1 基础概念
反向代理(Reverse Proxy) 是一种位于客户端与后端服务器之间的中间服务器。与正向代理(为客户端服务)不同,反向代理代表后端服务器接收客户端的请求,并将请求转发到内部的一个或多个服务器,然后将服务器的响应返回给客户端。
核心功能:
- 负载均衡:将客户端请求分发到多个后端服务器,避免单点过载。
- 安全防护:隐藏后端服务器的真实IP地址和端口,提供额外的安全层。
- SSL终止:在反向代理处处理HTTPS加密/解密,减轻后端服务器负担。
- 缓存加速:缓存静态内容,减少后端服务器的重复计算和网络传输。
- URL重写:修改请求的URL路径,实现路由转发和路径映射。
反向代理工作原理示意图:
#mermaid-svg-urHCcupkroTJAkDk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-urHCcupkroTJAkDk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-urHCcupkroTJAkDk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-urHCcupkroTJAkDk .error-icon{fill:#552222;}#mermaid-svg-urHCcupkroTJAkDk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-urHCcupkroTJAkDk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-urHCcupkroTJAkDk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-urHCcupkroTJAkDk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-urHCcupkroTJAkDk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-urHCcupkroTJAkDk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-urHCcupkroTJAkDk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-urHCcupkroTJAkDk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-urHCcupkroTJAkDk .marker.cross{stroke:#333333;}#mermaid-svg-urHCcupkroTJAkDk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-urHCcupkroTJAkDk p{margin:0;}#mermaid-svg-urHCcupkroTJAkDk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-urHCcupkroTJAkDk .cluster-label text{fill:#333;}#mermaid-svg-urHCcupkroTJAkDk .cluster-label span{color:#333;}#mermaid-svg-urHCcupkroTJAkDk .cluster-label span p{background-color:transparent;}#mermaid-svg-urHCcupkroTJAkDk .label text,#mermaid-svg-urHCcupkroTJAkDk span{fill:#333;color:#333;}#mermaid-svg-urHCcupkroTJAkDk .node rect,#mermaid-svg-urHCcupkroTJAkDk .node circle,#mermaid-svg-urHCcupkroTJAkDk .node ellipse,#mermaid-svg-urHCcupkroTJAkDk .node polygon,#mermaid-svg-urHCcupkroTJAkDk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-urHCcupkroTJAkDk .rough-node .label text,#mermaid-svg-urHCcupkroTJAkDk .node .label text,#mermaid-svg-urHCcupkroTJAkDk .image-shape .label,#mermaid-svg-urHCcupkroTJAkDk .icon-shape .label{text-anchor:middle;}#mermaid-svg-urHCcupkroTJAkDk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-urHCcupkroTJAkDk .rough-node .label,#mermaid-svg-urHCcupkroTJAkDk .node .label,#mermaid-svg-urHCcupkroTJAkDk .image-shape .label,#mermaid-svg-urHCcupkroTJAkDk .icon-shape .label{text-align:center;}#mermaid-svg-urHCcupkroTJAkDk .node.clickable{cursor:pointer;}#mermaid-svg-urHCcupkroTJAkDk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-urHCcupkroTJAkDk .arrowheadPath{fill:#333333;}#mermaid-svg-urHCcupkroTJAkDk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-urHCcupkroTJAkDk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-urHCcupkroTJAkDk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-urHCcupkroTJAkDk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-urHCcupkroTJAkDk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-urHCcupkroTJAkDk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-urHCcupkroTJAkDk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-urHCcupkroTJAkDk .cluster text{fill:#333;}#mermaid-svg-urHCcupkroTJAkDk .cluster span{color:#333;}#mermaid-svg-urHCcupkroTJAkDk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-urHCcupkroTJAkDk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-urHCcupkroTJAkDk rect.text{fill:none;stroke-width:0;}#mermaid-svg-urHCcupkroTJAkDk .icon-shape,#mermaid-svg-urHCcupkroTJAkDk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-urHCcupkroTJAkDk .icon-shape p,#mermaid-svg-urHCcupkroTJAkDk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-urHCcupkroTJAkDk .icon-shape .label rect,#mermaid-svg-urHCcupkroTJAkDk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-urHCcupkroTJAkDk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-urHCcupkroTJAkDk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-urHCcupkroTJAkDk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} /api/*
/static/*
/admin/*
返回响应给客户端
反向代理服务器
(如 Nginx)
请求路由决策
后端应用服务器 A
(192.168.1.10:8080)
静态文件服务器 B
(192.168.1.11:80)
管理后台服务器 C
(192.168.1.12:3000)
流程说明:
- 客户端向反向代理(如Nginx)发送请求。
- 反向代理根据预设规则(如URL路径、域名)进行路由决策。
- 请求被转发到对应的后端服务器。
- 后端服务器处理请求并返回响应给反向代理。
- 反向代理将响应返回给客户端,客户端感知不到后端服务器的存在。
2.2 技术原理
反向代理的技术实现基于HTTP/HTTPS协议,主要通过以下机制工作:
1. 请求转发机制
当反向代理(如Nginx)接收到客户端请求时:
- 解析请求头:提取Host、URL路径、HTTP方法等信息
- 匹配配置规则 :根据
server_name(域名)和location(路径)规则确定转发目标 - 建立后端连接:使用负载均衡算法选择后端服务器,建立TCP连接
- 转发请求:将原始请求(或修改后的请求)发送到后端服务器
2. 负载均衡策略
反向代理支持多种负载均衡算法:
- 轮询(Round Robin):按顺序将请求分发到各服务器
- 加权轮询(Weighted Round Robin):根据服务器性能分配不同权重
- 最少连接(Least Connections):将请求发送到当前连接数最少的服务器
- IP哈希(IP Hash):根据客户端IP计算哈希值,固定分配到某服务器
3. 连接管理
- 连接池:维护与后端服务器的持久连接,减少TCP握手开销
- 超时控制:设置连接超时、读取超时、发送超时等参数
- 失败重试:当后端服务器无响应时,自动重试其他可用服务器
4. 安全与性能优化
- SSL/TLS终止:在反向代理处完成HTTPS解密,后端使用HTTP通信
- 缓冲区优化:调整请求/响应缓冲区大小,提高吞吐量
- 压缩传输:启用Gzip/Brotli压缩,减少网络传输量
- 头部修改:添加、删除或修改HTTP请求/响应头
5. 在本文场景中的应用
针对"my.XXX.space解析到www.XXX.space:58090"的需求:
- 域名解析 :将
my.XXX.space的DNS解析指向Nginx服务器IP - 端口隐藏:Nginx监听80/443端口,对外提供标准Web服务
- 路径转发 :Nginx将请求转发到
www.XXX.space:58090后端服务 - 协议转换:可支持HTTP到HTTPS的自动跳转
技术架构对比:
传统直接访问:
客户端 → www.XXX.space:58090(暴露端口)
反向代理访问:
客户端 → my.XXX.space → Nginx → www.XXX.space:58090(隐藏端口)
通过反向代理,实现了:
- ✅ 对外统一使用标准端口(80/443)
- ✅ 隐藏后端服务的真实端口和IP
- ✅ 支持多个子域名共用同一IP
- ✅ 便于后续扩展负载均衡和缓存功能
3. 环境准备
3.1 系统要求
- 操作系统:ubuntu
- 环境:1Panel,Nginx,halo
4. 实践步骤
一开始考虑用1panel的OpenResy组件的nginx反向代理功能,但是由于涉及到公司内部防火墙,虚拟机,1panel等多个层级关系,导致排查问题困难重重,且修改docker配置文件麻烦,我使用了本地的ngixn服务.
4.1 步骤一:错误跳转防火墙
首先在阿里云创建了子域名love.域名占位符.space,访问时候会跳转到交换机默认端口8443,说明子域名是创建成功了.
访问love.域名占位符.space:58090成功,直接访问80端口,被防火墙拦截,找到问题根源了。访问 公网IP 跳转到 8443,说明 80 端口被你的路由器管理界面占用了,请求根本没到达 Nginx Proxy Manager.
python
用户访问 my.[域名占位符].space:80
↓
DNS 解析到 [公网IP](路由器公网 IP)
↓
路由器 80 端口被【路由器自己的管理后台】占用
↓
路由器自动 301 跳转到 https://[公网IP]:8443(管理后台 HTTPS 端口)
↓
NPM 完全没收到请求,自然不会转发到 58090
登录路由器后台,找到 系统设置 / 管理设置 ,把公网的ip的远程管理关闭即可.
4.2 步骤二:设置nginx.conf
将80端口重定位到love.域名占位符.space```javascript
server {
listen 80;
server_name love.域名占位符.space;
location / {
proxy_pass http://[域名占位符].space:58090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
取消防火墙外网访问后,成功跳转到nginx代理服务,但是没有正确跳转到设置地址,重新加载一下配置文件即可.


5. 常见问题与解决方案
5.1 问题一:缓存
现象 :及时改了配置,访问网页还是会跳转到源页面
原因 :浏览器缓存
解决方案: 使用无痕页面打开,并删除最近的浏览器记录
5.2 问题一:80端口无法访问
现象 :公司内网可以直接访问,但是家庭网络无法直接访问love.XXX.XXX
原因 : 运营商封为防止个人私自搭建网站,封禁80端口
解决方案:找运营商开通 80 端口,在中国大陆用 80 端口对外提供 Web 服务,域名必须完成 ICP 备案,否则运营商会拦截未备案域名的 80 端口访问。或者使用云服务器备案.
6.完成结果
www.XXX.XXX:端口和love.XXX.XXX访问结果一致


参考资料
- https://blog.csdn.net/weixin_42269472/article/details/155355894?spm=1001.2014.3001.5501 nginx拼接问题