Nginx 作为反向代理终止 SSL,将 HTTPS 请求转发至后端 Java 应用(如 Spring Boot),Java 端通过 X-Forwarded-Proto 等头识别 HTTPS 并正确生成安全链接。

Nginx 本身不直接运行 Java 应用,而是作为反向代理将 HTTPS 请求转发给后端 Java 服务(如 Spring Boot 内嵌 Tomcat)。SSL 证书由 Nginx 终止(即 HTTPS 在 Nginx 层解密),Java 应用仍走普通 HTTP(如 http://localhost:8080),这样既安全又轻量。关键在于:SSL 配置全在 Nginx,Java 端只需信任 Nginx 的转发头。
Nginx 配置 SSL 并代理 Java 服务
确保你已准备好证书文件(如 fullchain.pem 和 privkey.pem),通常由 Let’s Encrypt 或商业 CA 提供。把它们放到安全目录,例如 /etc/nginx/ssl/myapp/。
在 Nginx 站点配置中(如 /etc/nginx/conf.d/myapp.conf)写入:
server {
listen 443 ssl http2;
server_name example.com;
# SSL 证书路径(必须正确)
ssl_certificate /etc/nginx/ssl/myapp/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/myapp/privkey.pem;
# 推荐的安全协议与加密套件(兼容主流浏览器)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# 启用 OCSP Stapling(提升验证效率)
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 1.1.1.1 valid=300s;
resolver_timeout 5s;
# 反向代理到 Java 应用(假设运行在 8080 端口)
location / {
proxy_pass http://localhost: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; # 关键:告诉 Java 当前是 HTTPS
proxy_set_header X-Forwarded-Port 443;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}✅ 注意:
X-Forwarded-Proto $scheme这一行必不可少——它让 Java 应用知道原始请求是 HTTPS,否则重定向、生成绝对 URL 时可能错误拼成http://。立即学习“Java免费学习笔记(深入)”;
Java(Spring Boot)端配合配置
Spring Boot 默认不识别反向代理头,需显式启用。在 application.yml 中添加:
server: forward-headers-strategy: native # Spring Boot 2.6+ # 或旧版本用: # use-forward-headers: true # 如果使用内嵌 Tomcat(默认),还需额外配置 tomcat: protocol-header: x-forwarded-proto remote-ip-header: x-forwarded-for internal-proxies: 127\.0\.0\.1 # 允许来自本机的代理头
这样,HttpServletRequest.isSecure() 就会返回 true,request.getRequestURL() 生成的链接也会是 https:// 开头。
强制 HTTP 自动跳转 HTTPS(可选但推荐)
再加一个仅监听 80 端口的 server 块:
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}验证与生效
- 检查语法:
sudo nginx -t - 重载配置:
sudo systemctl reload nginx - 浏览器访问
https://example.com,确认锁图标正常、无证书警告 - 在 Java 日志或接口响应中检查
X-Forwarded-Proto是否为https,以及生成的跳转链接是否含https
不复杂但容易忽略


















