Nginx Stream + SSL Preread 自动分流方案 - 多子域名端口映射配置
|
|
hace 4 días | |
|---|---|---|
| CHANGELOG.md | hace 4 días | |
| QA_ARCHIVE.md | hace 4 días | |
| RASPBERRYPI_SETUP.md | hace 4 días | |
| README.md | hace 4 días | |
| TECH_DOC.md | hace 4 días | |
| git_push.sh | hace 4 días | |
| nginx.conf | hace 4 días | |
| zhonjin.com.conf | hace 4 días | |
| zhonjin_http.conf | hace 4 días | |
| zhonjin_stream.conf | hace 4 días |
基于 Nginx stream 模块 + ssl_preread 的 TCP 层协议检测自动分流,支持多子域名、多端口,HTTP 自动跳转 HTTPS。
本方案使用 Nginx 的 stream 模块配合 ssl_preread 功能,在 TCP 层(OSI 第 4 层)检测入站流量类型并自动分流:
用户无论输入 http:// 还是 https://,均可自动获得 HTTPS 加密访问。
| 域名 | 外网端口 | 后端服务 | HTTPS 内部端口 | HTTP 跳转端口 | 用途 |
|---|---|---|---|---|---|
| chanking.zhonjin.com | 40130 | 127.0.0.1:5004 | 5005 | 5006 | 主 Web 服务 |
| mqtt.zhonjin.com | 40715 | 127.0.0.1:8085 | 5007 | 5008 | MQTT 服务 |
| baolin.zhonjin.com | 40716 | 127.0.0.1:5000 | 5009 | 5010 | 宝林服务 A |
| baolin.zhonjin.com | 40719 | 127.0.0.1:5001 | 5011 | 5012 | 宝林服务 B |
外网请求 (HTTP/HTTPS)
│
▼
stream 端口监听 (40130/40715/40716/40719)
│
├─ ssl_preread 检测协议
│
├─ TLS 流量 ──→ HTTPS server (SSL 终结) ──→ proxy_pass 后端 HTTP 服务
│
└─ 明文 HTTP ──→ HTTP server ──→ 301 重定向到 HTTPS
/etc/nginx/
├── nginx.conf # 主配置(40130 + 全局参数 + include)
├── conf.d/
│ └── zhonjin_http.conf # 子域名 HTTP 服务(mqtt/baolin)
└── stream.d/
└── zhonjin_stream.conf # 子域名 Stream 分流(mqtt/baolin)
sudo apt update
sudo apt install -y nginx-full certbot python3-certbot-nginx
sudo certbot certonly --manual --preferred-challenges dns \
-d zhonjin.com -d "*.zhonjin.com"
sudo mkdir -p /etc/nginx/conf.d /etc/nginx/stream.d
sudo cp nginx.conf /etc/nginx/nginx.conf
sudo cp zhonjin_http.conf /etc/nginx/conf.d/zhonjin_http.conf
sudo cp zhonjin_stream.conf /etc/nginx/stream.d/zhonjin_stream.conf
sudo nginx -t && sudo systemctl reload nginx
sudo ufw allow 40130/tcp
sudo ufw allow 40715/tcp
sudo ufw allow 40716/tcp
sudo ufw allow 40719/tcp
# HTTPS 访问
curl -I https://chanking.zhonjin.com:40130
curl -I https://mqtt.zhonjin.com:40715
curl -I https://baolin.zhonjin.com:40716
curl -I https://baolin.zhonjin.com:40719
# HTTP 跳转(应返回 301)
curl -I http://chanking.zhonjin.com:40130
curl -I http://mqtt.zhonjin.com:40715
curl -I http://baolin.zhonjin.com:40716
curl -I http://baolin.zhonjin.com:40719
| 文件 | 说明 |
|---|---|
| nginx.conf | 主配置文件(全局参数 + 40130 端口 + include 指令) |
| zhonjin_http.conf | 子域名 HTTP 服务配置(include 到 http 块) |
| zhonjin_stream.conf | 子域名 Stream 分流配置(include 到 stream 块) |
| zhonjin.com.conf | 配置总览说明文档 |
| CHANGELOG.md | 变更日志(持续更新) |
| TECH_DOC.md | 完整技术方案文档(持续更新) |
| RASPBERRYPI_SETUP.md | 树莓派 5 部署指南 |
| QA_ARCHIVE.md | 技术问答归档(持续更新) |
| git_push.sh | Git 仓库初始化与推送脚本 |
| 组件 | 最低版本 | 推荐版本 |
|---|---|---|
| Nginx | 1.11.5+ | 1.26+ |
| 操作系统 | Ubuntu 22.04 | Ubuntu 24.04 / 树莓派 5 |
| SSL 证书 | Let's Encrypt 通配符 | Let's Encrypt + 自动续期 |
ngx_stream_module — TCP/UDP 代理ngx_stream_ssl_preread_module — TLS ClientHello 预读ngx_http_ssl_module — HTTP SSL 终结ngx_http_v2_module — HTTP/2 支持server_tokens off*.zhonjin.com 覆盖所有子域名简要步骤:
zhonjin_http.conf 中添加 HTTPS server + HTTP 跳转 serverzhonjin_stream.conf 中添加 map + stream serversudo nginx -t && sudo systemctl reload nginx# 克隆仓库
git clone https://git.zhonjin.com:40717/steven_roc/nginx-stream-ssl-preread.git
# 首次推送(使用 git_push.sh)
chmod +x git_push.sh
./git_push.sh
MIT License
https://git.zhonjin.com:40717/steven_roc本项目文档持续更新,详见各文档说明。