📖 文章摘要
韩国服务器 + Nginx 反代 + Let's Encrypt + systemd 服务管理。本文详解从安全组配置到一键部署脚本的完整流程。
部署架构
博客部署在韩国首尔服务器,域名vue2.xyz
服务器配置
- 机房: 韩国首尔
- OS: Ubuntu
- SSH 端口: 2894(非默认 22,降低扫描攻击)
- 认证: SSH 密钥免密登录(禁止密码登录)
- 安全组: 仅放行 80(HTTP)和 443(HTTPS)
Nginx 反向代理
Nginx 是所有请求的唯一入口,按路径分发到后端服务:
server {
listen 443 ssl;
server_name blog.vue2.xyz;
# API 请求 → FastAPI 后端
location /api/ {
proxy_pass http://127.0.0.1:8001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 上传文件 → Nginx 直出(不走 Python)
location /uploads/ {
alias /root/blog/data/uploads/;
expires 3d;
add_header Cache-Control "public, immutable";
}
# Nuxt 构建资源 → Nuxt SSR
location /_nuxt/ {
proxy_pass http://127.0.0.1:3000;
}
# 其余页面 → Nuxt SSR
location / {
proxy_pass http://127.0.0.1:3000;
}
}
关键设计:后端服务绑定 127.0.0.1,外部无法直接访问 API,所有流量经过 Nginx 统一管控。
端口策略
之前踩过一个坑——用冷门端口(比如 2893)容易被 GFW 特征识别。坚持只用 80/443 看起来像正常网站。
SSL 证书
通过 Let's Encrypt + Certbot 自动管理 HTTPS:
certbot --nginx -d blog.vue2.xyz
证书每 90 天自动续期,certbot 注册了 systemd timer,无需手动维护。
systemd 服务管理
两个系统服务分别管理前后端:
blog-api.service(后端)
[Service]
User=root
WorkingDirectory=/root/blog/backend
ExecStart=/root/blog/backend/venv/bin/uvicorn main:app --host 127.0.0.1 --port 8001
Restart=always
blog-web.service(前端 SSR)
[Service]
User=root
WorkingDirectory=/root/blog/frontend
ExecStart=/usr/bin/node /root/blog/frontend/.output/server/index.mjs
Restart=always
一键部署脚本
deploy/deploy.py 自动化部署流程:
1. npm run build (本地构建前端)
2. Python tarfile 打包(后端代码 + 前端 .output)
3. SCP 上传到服务器
4. SSH 远程解压 + systemctl restart 两个服务
部署脚本排除了 venv、__pycache__、node_modules 等不必要的目录,打包体积在 5-10MB 之间。
数据库同步
deploy/deploy.py 的第二个功能是数据库同步:
- 下载 — 服务器先停 API → SCP 下载 db 和 uploads → 启动 API
- 上传 — SCP 上传本地 db → 重启 API
这样可以在本地修改数据后推送到生产环境。
最后更新:2026年6月29日CC BY-NC-SA 4.0
评论
暂无评论,来写第一条吧
