首页/新闻资讯/正文详情

Nginx + HTTPS 部署问题分析与解决

发布时间:2026/9/27 23:21:40 来源:云帆数科 栏目:资讯中心
Nginx + HTTPS 部署问题分析与解决
记录时间2026-09-06 涉及环境阿里云 ECSUbuntu/ nginx 1.24.0 / Spring Boot:8080/ Vite 前端---## 1. 问题现象本次一共经历了两个阶段的问题表象不同但根子都在服务器上的 nginx 配置/文件与预期不一致1. **前端改动部署后页面无变化**- 本地已重新构建 dist上传后浏览器刷新仍是旧页面。2. **配置 SSL443后后端接口不加载**- 按模板新增 hpxwind.top 站点并启用 HTTPS 后网页静态资源正常但所有 /api/** 请求返回 404 Not Foundnginx 报错页后台数据全部加载不出来。---## 2. 排查过程### 2.1 阶段一部署后无变化的定位| 步骤 | 操作 | 结论 ||---|---|---|| 1 | 对比本地 dist 产物与 src 源码的修改时间 | dist 构建时间晚于源码改动本地产物是新的 || 2 | npm run build 重新构建 | 产物 hash 与上次**完全相同**index-QZznvyml.js说明此前删除的孤儿组件从未进过 bundle本地产物确实已包含全部 UI 改动 → **问题不在本地代码** || 3 | 服务器 curl -s http://127.0.0.1/ 抓首页引用的资源名 | 返回 index-s5MNAjZ0.js旧 hash本地最新为 index-QZznvyml.js → **服务器上的文件是旧的** || 4 | nginx -T 查看生效配置 | root /var/www/hpxblog指向旧目录 |**关键结论**本地构建产物正确问题出在服务器端nginx root 指向的目录内容过期/被删未指向最新上传的 dist。### 2.2 阶段二配置 SSL 后后端不加载的定位新增的 SSL 站点配置模板得来包含以下致命缺陷1. root /var/www/hpxwind; —— 是模板遗留路径注释写招新网页存放路径并非真实前端目录。2. **缺失 /api 反向代理** —— 前端所有请求都走 /api/**没有反代时 nginx 把它当静态文件查找必然 404。3. try_files $uri $uri/ 404; —— 没有 SPA 回退 /index.html深层路由直接访问会 404。随后验证到的实际报错与事实bash# nginx -t 报错当前 nginx 不支持新语法nginx: [emerg] unknown directive http2 in /etc/nginx/sites-enabled/hpxwind.top:11nginx: configuration file /etc/nginx/nginx.conf test failedbash# 后端本身是正常的直连 :8080 返回 JSONcurl -s http://127.0.0.1:8080/api/public/settings# {siteTitle:我的博客, ...}# HTTPS 页面正常接口 404curl -sk https://127.0.0.1/ | grep -o assets/index-[^]* # index-QZznvyml.js ✓curl -sk https://127.0.0.1/api/public/settings # nginx 404 ✗ 注意nginx -t 失败时 systemctl reload nginx 不会生效服务器仍跑着**旧配置**会加剧排查困扰。---## 3. 根因汇总| # | 根因 | 说明 ||---|---|---|| 1 | root 指错目录 | 指向模板遗留的 /var/www/hpxwind真实前端产物在 /home/ubuntu/hpxblog/frontend || 2 | 缺少 /api 反代 | nginx 未把 /api/** 转发到 Spring Boot 127.0.0.1:8080接口全部 404 || 3 | http2 语法不兼容 | 本机 nginx 为 **1.24.0**不支持 http2 on;≥1.25.1 才支持需用 listen 443 ssl http2; || 4 | 无 SPA 回退 | try_files ... 404 使前端路由直接访问 404 || 5 | reload 未生效的假象 | nginx -t 失败后 reload 静默无效运行中的仍是旧配置 |---## 4. 解决方案最终生效配置完整替换 /etc/nginx/sites-available/hpxwind.topnginx# ---------- HTTP 80 → HTTPS ----------server {listen 80;server_name hpxwind.top www.hpxwind.top;return 301 https://$host$request_uri;}# ---------- HTTPS 443 主站 ----------server {listen 443 ssl http2; # nginx 1.25.1 用此写法 1.25.1 可拆成 listen 443 ssl; http2 on;server_name hpxwind.top www.hpxwind.top;ssl_certificate /etc/nginx/cert/hpxwind.top.pem;ssl_certificate_key /etc/nginx/cert/hpxwind.top.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;ssl_prefer_server_ciphers on;# 前端静态产物根目录里面必须直接有 index.html 和 assets/root /home/ubuntu/hpxblog/frontend;index index.html;# -------- 后端 API / 上传文件反代到 Spring Boot :8080 --------location /api/ {proxy_pass http://127.0.0.1:8080; # 不带 URI无尾斜杠保留 /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;proxy_read_timeout 60s;}location /avatars/ {proxy_pass http://127.0.0.1:8080;proxy_set_header Host $host;}location /images/ {proxy_pass http://127.0.0.1:8080;proxy_set_header Host $host;}# 缓存策略index.html 不强缓存hash 资源可长缓存location /index.html { add_header Cache-Control no-cache, no-store, must-revalidate; }location /assets/ { expires 30d; add_header Cache-Control public, immutable; }# SPA 路由回退重要location / {try_files $uri $uri/ /index.html;}}启用并重载bashln -sf /etc/nginx/sites-available/hpxwind.top /etc/nginx/sites-enabled/hpxwind.topnginx -t systemctl reload nginx若报 duplicate server_name说明旧的 80 站点配置仍在 sites-enabled停用旧文件后再重载。---## 5. 验证清单全部通过即部署成功bash# 1) 后端在跑ss -lntp | grep 8080# 2) HTTPS 页面返回最新产物hash 与本地 dist 一致curl -sk https://127.0.0.1/ | grep -o assets/index-[^]*# assets/index-QZznvyml.js / index-DYj3IfB2.css# 3) HTTPS 下 API 可达返回 JSON而非 nginx 404curl -sk https://127.0.0.1/api/public/settings | head -c 200# 4) HTTP 80 强制跳转 HTTPScurl -sI http://127.0.0.1/ | head -1浏览器侧无痕窗口 / CtrlShiftR 强刷验证最终效果。---## 6. 经验与教训下次部署可对照1. **改了没变化先看服务器实际返回了什么**不要只看浏览器curl 域名/ | grep -o assets/index-[^]* 一条命令即可区分文件没传上去与浏览器缓存。2. **root 必须指向目录里直接有 index.html assets/的那一层**dist 目录或解压后的产物目录指向含 src/ 的源码根会导致白屏。3. **前端以 /api 为前缀时nginx 配置必须有对应的 location /api/ 反代**且 proxy_pass 不要带尾斜杠否则会丢失 /api 前缀。4. **语法版本差异**http2 on; 需要 nginx ≥ 1.25.1老版本用 listen 443 ssl http2;。配置前先 nginx -v 确认。5. **nginx -t 失败后 reload 不生效**服务器跑的是旧配置——每次改完务必 nginx -t 确认 OK 再 reload并以 curl 实测为准。6. **SSL 证书路径**放在 /etc/nginx/cert/nginx -t 会直接校验 pem/key 是否可读证书缺失时会在语法检查阶段报错。7. **SPA 项目必须配 try_files $uri $uri/ /index.html;** 否则深层路由 404观感上像后端挂了。8. **/home/ubuntu 等用户目录默认权限 750**nginxwww-data无权限访问会 403需 chmod 755 /home/ubuntu 并 chmod -R orX 站点目录。

相关推荐

会议纪要哪个软件总结精准?我用30场实测告诉你真相
会议纪要哪个软件总结精准?我用30场实测告诉你真相

不知道你有没有经历过这样的崩溃时刻:一场3小时的跨部门会议开完,脑子里塞满了各种信息,但打开空白文档准备写会议纪要时,却发现——待办事项记不全、决策点想不起来、谁说了什么完全对不上号。更绝望的是,你明明用手机… · 2026/9/27 23:21:33

VoLTE质差优化实战:从上行丢包定位到RF与参数调整的完整拆解
VoLTE质差优化实战:从上行丢包定位到RF与参数调整的完整拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 23:21:27

网站需要的栏目和内容怎么定才不踩坑?最佳实践指南
网站需要的栏目和内容怎么定才不踩坑?最佳实践指南

网站需要的栏目和内容怎么定才不踩坑?最佳实践指南 刚入行做网站,或者自己不懂代码想搭个站,最怕的就是对着空白页发呆。不知道放什么,怕放多了乱,怕放少了没东西看。其实,网站需要的栏目和内容规划,核心就两个字:清晰。别整那些花里胡哨的,遵循最佳… · 2026/9/27 23:21:27

建设旅游服务类网站的可行性报告避坑指南
建设旅游服务类网站的可行性报告避坑指南

建设旅游服务类网站的可行性报告避坑指南 网站做好了没人访问,这几乎是所有旅游类项目上线后最真实的噩梦。你花了大几十万做品牌,页面美得像杂志,结果后台流量惨淡,转化率更是惨不忍睹。这不只是设计的问题,更是底层技术选型没做好导致的“先天不足”。… · 2026/9/27 23:54:49

Keil uVision5中文注释乱码终极解决方案
Keil uVision5中文注释乱码终极解决方案

1. 问题本质与真实场景还原:这不是“显示异常”,而是编码链路断裂Keil uVision5 中中文注释显示为方块、问号、或一堆乱七八糟的符号——这几乎是每个刚接触嵌入式开发的工程师,在Windows环境下写第一个带中文注释的STM32工程时,必… · 2026/9/27 23:54:43

python的智能制造导论工业场景模拟第一百二十二篇:仿真产线换型过程,模拟产品切换带来的停机耗时,优化工单投产顺序,降低换型损失。
python的智能制造导论工业场景模拟第一百二十二篇:仿真产线换型过程,模拟产品切换带来的停机耗时,优化工单投产顺序,降低换型损失。

仿真产线换型过程:模拟产品切换带来的停机耗时,优化工单投产顺序,降低换型损失周一早晨7点半,我刚走进车间办公室,生产主管老郑就拉着我往电子看板前走。屏幕上,一条混线装配线正停在"换型中"的状… · 2026/9/27 23:54:36

鸿蒙Unity射击游戏跨设备存档同步实战
鸿蒙Unity射击游戏跨设备存档同步实战

1. 项目概述:为什么一个2D射击游戏的存档同步,值得花两周时间重写三次网络层?我去年在华为开发者大会现场,看到一位独立开发者用平板打开自己刚在手机上打到第三关的《弹幕突围》——角色等级、武器配件、成就进度全数还原&#x… · 2026/9/27 23:54:36

Superpowers:AI编程工具链的可信执行范式
Superpowers:AI编程工具链的可信执行范式

1. “Superpowers”不是超能力,而是开发者工具链的终极形态最近在好几个技术社区里,看到“superpowers”这个词高频出现,不是漫威电影里的变种人设定,也不是什么玄学概念——它正迅速成为新一代AI编程工具生态的代名词。我第一次在… · 2026/9/27 23:54:36

PyQt5+SQLite3打造Windows原生便签工具实践
PyQt5+SQLite3打造Windows原生便签工具实践

1. 项目概述:为什么一个“放弃式”命名的便签,反而成了我每天打开三次的桌面刚需 “abandon便签”这个名字刚看到时,我下意识皱了眉——谁会把日常高频使用的工具起名叫“放弃”?但点开 GitHub 仓库、编译运行、拖拽新建三张便签… · 2026/9/27 23:54:30

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码