个人博客的部署:Nginx、PM2 与 HTTPS | 拾音
目标架构
浏览器 → Nginx(443)→ 静态文件 / Node 服务(3000)→ PostgreSQL(5432,仅本机监听)。Nginx 负责 TLS、压缩、缓存与 SPA 路由回退,Node 只处理 API。
进程守护
使用 PM2 启动并设置开机自启:
pm2 start ecosystem.config.cjs --env production
pm2 save
pm2 startup
module.exports = {
apps: [{
name: 'blog-api',
script: 'src/index.js',
instances: 1,
env_production: { NODE_ENV: 'production', PORT: 3000 },
}],
};
单实例足够支撑个人站点,同时避免了内存缓存在多进程间不一致的问题。
Nginx 配置要点
server {
listen 443 ssl http2;
server_name jyyyyy.com;
root /var/www/blog/client/dist;
index index.html;
location /api/ { proxy_pass http://127.0.0.1:3000; }
location /uploads/ {
alias /var/www/blog/server/uploads/;
expires 30d;
}
location /assets/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
location / {
try_files $uri $uri/ /index.html;
}
}
三条关键规则:
try_files ... /index.html 保证前端路由刷新不 404;
- 带哈希的
/assets/ 设置一年强缓存;
/uploads/ 单独映射,避免走后端。
HTTPS
用 Certbot 申请 Let's Encrypt 证书并自动续期:
certbot --nginx -d jyyyyy.com -d www.jyyyyy.com
certbot renew --dry-run
同时开启 HSTS,并把 HTTP 全部 301 到 HTTPS。
数据库与备份
PostgreSQL 仅监听 127.0.0.1,通过 pg_dump 每日备份并保留 14 天:
pg_dump -Fc blog > /backup/blog-$(date +%F).dump
find /backup -name 'blog-*.dump' -mtime +14 -delete
备份文件应同步到另一台机器或对象存储,本地备份无法应对磁盘故障。
监控
最基础的监控是"能不能打开":用 cron 每 5 分钟请求健康检查接口,失败时发送邮件。日志用 pm2 logs 与 Nginx access log,定期清理避免占满磁盘。
小结
个人站点的部署不需要 Kubernetes。Nginx + PM2 + Certbot + pg_dump 这套组合足够稳定,且每一层都容易理解和排查。