Nginx + HTTPS:给 Python 和 Java 服务统一加入口
无论后端是 Python 还是 Java,线上入口都不建议直接暴露应用端口。Nginx 负责门面,应用服务只监听 127.0.0.1。
一、端口规划
- Python FastAPI: 127.0.0.1:8000
- Java Spring Boot: 127.0.0.1:8080
- Nginx: 对外 80 / 443
这样防火墙只需要开放 Web 端口。
二、申请证书
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d api.example.com
如果你有多个服务,可以分别配置不同子域名。
三、Python API 代理配置
server {
listen 443 ssl http2;
server_name api.example.com;
client_max_body_size 50m;
location / {
proxy_pass http://127.0.0.1:8000;
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;
}
}
四、Java API 代理配置
server {
listen 443 ssl http2;
server_name java.example.com;
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;
}
}
五、上线检查清单
- sudo nginx -t 必须通过
- curl -I https://api.example.com 返回 200 或 404 都可以,不能连接失败
- 应用日志不能出现数据库连接错误
- 证书自动续期要确认
sudo certbot renew --dry-run
sudo systemctl reload nginx
六、常见问题
上传失败 413
说明 Nginx 限制太小,调大 client_max_body_size。
应用拿到的是 http 不是 https
确认代理头里有:
proxy_set_header X-Forwarded-Proto $scheme;
刷新前端 404
如果是前端 SPA,需要给静态站点加 `try_files $uri $uri/ /index.html;`。后端 API 站点不要这样配。
Nginx 是生产环境的第一层秩序:证书、域名、代理头、上传限制和日志都应该在这里明确下来。