逐日 AI

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` 验证。

三步,出你的第一条片

套用一个案例模板,替换成你的内容——注册后即可进入工作台逐段生成、合成导出。

反馈建议