NGINX-多服务分流与HTTPS 支持
本笔记总结了如何使用 NGINX 作为反向代理服务器,针对多个后端服务(如 Spring Boot 与其他服务),实现基于域名或路径的流量分流,并启用 HTTPS 支持。
📌 场景说明
服务器中部署了多个服务:
- Spring Boot 启动于
8080
端口 - 后台管理系统监听
80
端口 - 希望通过 NGINX 实现:
- 将不同的流量路由到对应服务
- 启用统一的 HTTPS 证书
- 支持通过不同子域名或路径访问
📁 方案一:基于域名分流(推荐)
🧱 架构示意
api.example.com ─┬─> NGINX 443 ──> Spring Boot (127.0.0.1:8080) admin.example.com ─┘ └─> 后台服务 (127.0.0.1:80)
🛠️ 配置步骤
1. 配置 DNS
在域名服务商控制台设置:
api.example.com → 服务器IP admin.example.com → 服务器IP
2. 申请 SSL 证书
推荐使用 Let's Encrypt。可以通过 certbot
工具快速申请泛域名或多域名证书。
3. NGINX 配置示例
# HTTP 自动跳转 HTTPS
server {
listen 80;
server_name api.example.com admin.example.com;
return 301 https://$host$request_uri;
}
# Spring Boot 服务(api 子域名)
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
}
# 后台服务(admin 子域名)
server {
listen 443 ssl http2;
server_name admin.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:80;
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;
}
}
📁 方案二:基于路径分流(同域名)
🧱 架构示意
https://app.example.com/api/* ──> Spring Boot (127.0.0.1:8080)
https://app.example.com/admin/* ──> 后台服务 (127.0.0.1:80)
🛠️ NGINX 配置
server {
listen 80;
server_name app.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name app.example.com;
ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
location /admin/ {
proxy_pass http://127.0.0.1:80;
proxy_set_header Host $host;
}
# 其他请求默认转发
location / {
proxy_pass http://127.0.0.1:80;
}
}
⚙️ Spring Boot 额外配置(真实 IP 支持)
如果需要在 Spring Boot 获取客户端真实 IP,需配置:
server.use-forward-headers=true
并在日志打印、业务逻辑中使用 X-Forwarded-For
获取 IP。
🛡️ 证书自动续期
使用 certbot
自动续期:
sudo certbot renew --dry-run
建议将其加入 crontab 实现定期自动续期。
🧠 常见问题
Q: 为什么微信小程序访问不了后端?
A: 小程序要求合法 HTTPS 域名,需配置:
- 通过微信公众平台配置
request合法域名
(如https://api.example.com
) - 后端必须启用 HTTPS(443),并返回正确的 CORS 头(如
Access-Control-Allow-Origin
)
✅ 总结
项目 | 多域名分流 | 路径分流 |
---|---|---|
配置复杂度 | 中等 | 较低 |
URL 结构 | 清晰(api/admin 分开) | 路径区分略冗长 |
HTTPS 支持 | 每个域名配置一次即可 | 同一个 server 配置 |
推荐适用场景 | 中大型项目、微信小程序 | 小项目或调试阶段 |
📎 参考文档
- NGINX 官方文档:https://nginx.org/en/docs/
- Certbot 使用指南:https://certbot.eff.org/
- 微信小程序域名配置说明:https://developers.weixin.qq.com/
---
如你需要,我可以将此笔记导出为 `.md` 文件或继续添加如 `proxy_cache`、WebSocket支持等高级配置。是否需要我导出或细化?