《阿里云服务器部署全流程:从零到上线》文章封面
技术笔记约 13 分钟

阿里云服务器部署全流程:从零到上线

从 ECS 选型与 SSH 加固,到 Nginx、HTTPS、PM2 和自动部署,记录个人项目上云的完整流程。

#阿里云#Nginx#部署
文章目录0%
  1. 01前期准备
  2. 02购买与选型
  3. 03域名与备案
  4. 04服务器初始化
  5. 05环境搭建
  6. 06安装基础依赖
  7. 07安装 Node.js(通过 nvm)
  8. 08安装 Python(通过 pyenv)
  9. 09安装 PM2
  10. 10部署实战:Hexo 博客
  11. 111. 安装 Hexo 并拉取项目
  12. 122. 用 PM2 托管静态文件
  13. 133. Nginx 反向代理
  14. 144. 配置 HTTPS
  15. 15部署实战:FastAPI 后端
  16. 161. 项目结构
  17. 172. PM2 配置文件
  18. 183. Nginx 配置
  19. 19自动化部署脚本
  20. 20一些踩坑经验
  21. 21成本参考

最近把自己的几个项目迁到了阿里云 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 元/年

花一顿火锅的钱,拥有一个全年运行的服务器——对于喜欢折腾的开发者来说,这笔投入相当划算。