同一Ubuntu VPS上Angular与Spring Boot的SSL配置方案求助
解决方案:修复SSL配置与Nginx转发问题
核心问题分析
你遇到的400错误是因为Nginx用HTTP协议转发请求到Spring Boot的HTTPS端口(8443),而Spring Boot在该端口仅接受HTTPS请求,导致协议不匹配。同时需确保前端接口请求的是Cloudflare提供的HTTPS域名,而非直接指向服务器IP或HTTP地址。
以下提供两种可行方案,优先推荐方案一(Nginx终止SSL,后端用HTTP),配置更简单且适配Cloudflare的使用场景。
方案一:Nginx处理SSL,Spring Boot监听HTTP
1. 调整Spring Boot配置
让Spring Boot放弃HTTPS监听,转而使用HTTP端口(示例用8080):
- 打开
application.properties或application.yml,修改配置:server.port=8080 # 删除所有server.ssl开头的配置项(如证书路径、密码等) - 重启Spring Boot服务,确认服务在
localhost:8080正常运行。
2. 配置Nginx(适配Cloudflare SSL)
使用Cloudflare提供的Origin证书(可从Cloudflare后台下载),配置Nginx反向代理:
- 创建/修改站点配置文件(如
/etc/nginx/sites-available/your-domain.conf):server { listen 80; server_name your-domain.com www.your-domain.com; # 强制HTTP跳转HTTPS return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name your-domain.com www.your-domain.com; # 配置Cloudflare Origin证书 ssl_certificate /path/to/cloudflare-origin-cert.pem; ssl_certificate_key /path/to/cloudflare-origin-key.pem; # SSL优化配置(可选) ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 托管Angular前端静态文件 location / { root /var/www/your-angular-dist; try_files $uri $uri/ /index.html; } # 转发API请求到Spring Boot的HTTP端口 location /api/ { proxy_pass http://localhost:8080/api/; 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; # 告知Spring Boot请求来自HTTPS } } - 验证Nginx配置语法:
sudo nginx -t - 重启Nginx生效:
sudo systemctl restart nginx
3. 修正前端API地址
确保Angular项目的API请求指向HTTPS域名:
- 修改
environment.prod.ts:export const environment = { production: true, apiUrl: 'https://your-domain.com/api/' }; - 重新构建前端:
ng build --prod,将dist目录内容同步到/var/www/your-angular-dist。
方案二:Spring Boot启用SSL,Nginx转发HTTPS请求
若需保留Spring Boot的SSL配置,需调整Nginx转发逻辑:
1. 确认Spring Boot SSL配置
确保application.properties中的SSL配置正确:
server.port=8443 server.ssl.key-store=classpath:keystore.p12 server.ssl.key-store-password=your-password server.ssl.key-store-type=PKCS12 server.ssl.key-alias=your-alias
2. 修改Nginx的API转发规则
将转发协议改为HTTPS,并跳过本地证书验证:
location /api/ { proxy_pass https://localhost:8443/api/; 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; # 跳过本地SSL证书验证(内部证书无需公开验证) proxy_ssl_verify off; }
3. 其他步骤同方案一的前端配置与Nginx SSL基础配置
验证步骤
- 访问
https://your-domain.com,确认前端页面正常加载。 - 打开浏览器开发者工具(F12),在Network标签下检查API请求的地址与状态码。
- 直接测试API:
curl https://your-domain.com/api/your-endpoint,确认返回正常。
内容的提问来源于stack exchange,提问作者Srinivas K
相关产品推荐
相关产品推荐

