
阿里云服务器部署全流程:从零到上线
从 ECS 选型与 SSH 加固,到 Nginx、HTTPS、PM2 和自动部署,记录个人项目上云的完整流程。
文章目录
最近把自己的几个项目迁到了阿里云 ECS 上,包括这个 Hexo 博客和一个 FastAPI 后端服务。趁整个流程还热乎,整理一份完整的部署指南,适合有小项目想上线的开发者参考。
前期准备
购买与选型
新手入门推荐 ECS 经济型 e 实例(2 核 2G,40G 系统盘),一年几百块钱,跑个人博客和轻量 API 完全够用。
几个选型建议:
- 操作系统:选 Ubuntu 22.04 LTS,社区资料最多,遇到问题容易搜
- 网络:按量计费改成按带宽计费(1~3M 够用了),不然流量费是个无底洞
- 安全组:默认只开了 22(SSH)和 3389,后面要手动加 80/443
域名与备案
如果面向国内用户,域名备案是绕不过去的坎。流程:买域名 → 实名认证 → 提交管局审核(一般 7-15 个工作日)。
小技巧:在备案审核期间就可以开始搭建环境、写部署脚本,审核通过后直接解析域名即可。
服务器初始化
SSH 登录后第一件事——创建非 root 用户:
# 新建用户
adduser deploy
usermod -aG sudo deploy
# 配置 SSH 密钥登录
mkdir -p /home/deploy/.ssh
vim /home/deploy/.ssh/authorized_keys # 粘贴你的公钥
chown -R deploy:deploy /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys
然后加固一下 SSH 配置 /etc/ssh/sshd_config:
# sudo vim /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
最后 sudo systemctl restart sshd 生效。从现在开始只能密钥登录,安全性大幅提升。
环境搭建
安装基础依赖
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential curl git nginx certbot python3-certbot-nginx
安装 Node.js(通过 nvm)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 20
nvm alias default 20
安装 Python(通过 pyenv)
curl https://pyenv.run | bash
# 添加到 ~/.bashrc
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
pyenv install 3.12.3
pyenv global 3.12.3
安装 PM2
不管 Node.js 项目还是 Python 项目,我都用 PM2 管理进程:
npm install -g pm2
部署实战:Hexo 博客
以我这个博客为例,完整的部署流程:
1. 安装 Hexo 并拉取项目
npm install -g hexo-cli
git clone https://github.com/yourname/blog.git /home/deploy/blog
cd /home/deploy/blog
npm install
hexo generate
2. 用 PM2 托管静态文件
Hexo 生成的静态文件在 public/ 目录。用 pm2 serve 简单粗暴:
pm2 serve /home/deploy/blog/public 4000 --name blog --spa
pm2 save
pm2 startup # 设置开机自启
3. Nginx 反向代理
创建 /etc/nginx/sites-available/blog:
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://127.0.0.1:4000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
4. 配置 HTTPS
sudo certbot --nginx -d your-domain.com
Let’s Encrypt 证书 90 天过期,Certbot 会自动续签。
部署实战:FastAPI 后端
1. 项目结构
~/projects/api/
├── main.py
├── requirements.txt
├── .env
└── ecosystem.config.js
2. PM2 配置文件
ecosystem.config.js:
module.exports = {
apps: [{
name: 'api',
script: 'uvicorn',
args: 'main:app --host 127.0.0.1 --port 8000',
interpreter: '/home/deploy/.pyenv/versions/3.12.3/bin/python',
env: {
NODE_ENV: 'production'
},
max_memory_restart: '300M',
error_file: '/home/deploy/logs/api-error.log',
out_file: '/home/deploy/logs/api-out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss'
}]
}
pm2 start ecosystem.config.js
pm2 save
3. Nginx 配置
server {
listen 80;
server_name api.your-domain.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 120s;
}
}
同样执行 certbot --nginx 加上 HTTPS。
自动化部署脚本
每次本地写完代码、推 GitHub,然后 SSH 上服务器手动拉 + 重启实在太麻了。写个 shell 脚本挂在项目的 deploy.sh 里:
#!/bin/bash
set -e
cd /home/deploy/blog
git pull origin main
npm install --production
hexo generate
# PM2 会自动检测文件变化并重启(serve 模式)
pm2 restart blog
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 博客部署成功"
然后配一个 GitHub Actions,push 到 main 分支自动触发:
# .github/workflows/deploy.yml
name: Deploy to Aliyun ECS
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.ECS_HOST }}
username: deploy
key: ${{ secrets.ECS_SSH_KEY }}
script: cd /home/deploy/blog && bash deploy.sh
GitHub 仓库 Settings → Secrets 里配好 ECS_HOST 和 ECS_SSH_KEY。从此以后 git push 即上线。
一些踩坑经验
1. 内存不够导致 OOM
2G 内存跑 Node.js + Python + Nginx 其实挺紧的。定期 htop 检查内存使用,给 PM2 配 max_memory_restart 防止某个进程泄漏后拖垮整个机器。
2. 日志管理
PM2 日志默认不限制大小,跑几个月能吃掉几个 G:
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 7
3. 自动安全更新
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
选择 Yes,服务器会自动安装安全补丁,不用手动盯着。
4. 端口放行不要忘
安全组默认不开 80/443,每次配完 Nginx 发现访问不了才想起来——在阿里云控制台的「安全组」里添加入方向规则:80 和 443 端口,源地址 0.0.0.0/0。
成本参考
| 项目 | 费用 |
|---|---|
| ECS 经济型 e(2C2G) | 约 400~500 元/年 |
| 域名 | 约 60 元/年 |
| SSL 证书 | 免费(Let’s Encrypt) |
| 备案 | 免费 |
| 合计 | 约 500 元/年 |
花一顿火锅的钱,拥有一个全年运行的服务器——对于喜欢折腾的开发者来说,这笔投入相当划算。


