← 返回文章列表

Deployment

一个 Node.js 服务的稳定部署:Nginx、HTTPS 与 systemd

把职责拆开

小型服务不需要复杂的平台,但需要清楚的边界。Node.js 只处理业务和 API;Nginx 负责公网 HTTPS、证书、静态文件与反向代理;systemd 负责进程存活与开机启动。任何一层出问题时,排查范围都会更小。

应用不直接暴露公网端口

应用应该监听本机地址,例如 127.0.0.1:8100。Nginx 再将 443 的请求转发给它。这样既不需要让用户看到端口,也减少了应用直接面对扫描流量的机会。

server {
  listen 443 ssl;
  server_name example.com;

  location / {
    proxy_pass http://127.0.0.1:8100;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

让进程在异常后自行恢复

手工在终端启动服务很容易在 SSH 断开或服务器重启后失效。systemd 的价值不在于命令多,而在于让启动方式可重复、可检查。

[Service]
WorkingDirectory=/opt/app
ExecStart=/usr/bin/node server.js
Restart=on-failure
RestartSec=3
Environment=NODE_ENV=production

上线后检查什么

稳定上线不是一次成功访问,而是在重启、证书续期和偶发网络问题之后仍能按预期恢复。