nginx 静态部署与 HTTPS 配置指南:把站点安全地上线
作者:夸父
用 nginx 托管逐日 AI 静态导出站点并配置 HTTPS 证书的完整流程:反代 /api、SSE 支持、强制 HTTPS、证书自动续期,以及上线前的检查清单。
前置条件
一台有公网 IP 的服务器、一个已解析到该 IP 的域名、apps/web/out/ 静态导出产物(构建方式见静态部署文档)、服务器上已运行的 API(默认 3011 端口)。
nginx 配置
server {
listen 80;
server_name www.zhuri.com.cn;
# 80 端口全部 301 到 https(certbot 会自动改写这段)
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
http2 on;
server_name www.zhuri.com.cn;
root /srv/www.zhuri.com.cn; # out/ 目录内容
index index.html;
# TLS 证书(certbot 申请后路径如下)
ssl_certificate /etc/letsencrypt/live/www.zhuri.com.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.zhuri.com.cn/privkey.pem;
# API 反代:同域 + SSE 支持
location /api/ {
proxy_pass http://127.0.0.1:3011;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_buffering off; # SSE 必须关缓冲
proxy_read_timeout 300s;
}
# 静态文件:无扩展名路径映射到同名 .html
location / {
try_files $uri $uri.html $uri/ =404;
}
# 静态资源长缓存
location /_next/static/ {
add_header Cache-Control "public, max-age=31536000, immutable";
}
}
HTTPS 证书申请与续期
sudo certbot --nginx -d www.zhuri.com.cn # 申请并自动改写 nginx 配置
sudo certbot renew --dry-run # 验证自动续期
certbot 的续期定时任务安装时自带,无需额外配置。
上线前检查清单
按顺序过一遍:HTTPS 小锁正常 → 首页与任一内容页 200 → 登录/注册可用(Cookie 正常)→ 工作台跑一镜生成(SSE 进度正常走动)→ 404 页生效 → sitemap.xml / robots.txt 可访问 → 页面源码里有百度统计代码 → HSTS 建议在 nginx 加一行 add_header Strict-Transport-Security "max-age=31536000" always;。
性能与安全的小加强
静态资源已带长缓存;内容页是纯静态 HTML,TTFB 由 nginx 直接决定,无需额外优化。安全方面建议:nginx 屏蔽 /api 以外的直接端口暴露、服务器防火墙只开 80/443/SSH、定期系统补丁——这些是所有自部署服务的通用底线。
常见问题
为什么要强制 HTTPS?
登录 Cookie 的 Secure 属性、浏览器的混合内容拦截、以及搜索引擎对 HTTPS 的偏好,三条理由都指向必须上。Let Encrypt 免费证书 + 自动续期后,HTTPS 没有维护成本。
静态站和 API 必须同域吗?
推荐同域(www 域名下反代 /api):Cookie 直通、无需 CORS、SSE 实时进度正常。完全分域(CDN + 独立 API 域名)需要 CORS 与 SameSite=None 配置,且 SSE 跨域受限——不是首选。
证书多久续一次?
Let Encrypt 证书 90 天有效期,用 certbot 的自动续期定时任务后无需人工干预,建议每季度手动跑一次 `certbot renew --dry-run` 验证。


