阿里云 ECS 部署 Python Flask 项目:从零到上线完整指南

花了一整天踩完所有坑,写了这份指南。面向新手,每一步都有解释,跟着操作就能上线。


一、准备工作

1.1 注册阿里云

打开 aliyun.com,手机号注册。新用户有免费试用额度,可以白嫖一个月。

1.2 创建 ECS 实例

进入控制台 → 云服务器 ECS → 创建实例。我选的配置:

参数 选择 月费
地域 离你最近的(上海/杭州) -
规格 2 vCPU + 2GB 内存 ¥68/月
系统 Ubuntu 22.04 -
带宽 按量计费(1Mbps) ~¥23/月
硬盘 40GB 高效云盘 ~¥14/月

总共约 ¥105/月。新用户首月通常免费,注册的时候注意看优惠活动。

1.3 安全组配置

创建实例后,进入安全组,添加规则:

方向 端口 来源 用途
入方向 22 0.0.0.0/0 SSH 登录
入方向 80 0.0.0.0/0 HTTP 网站
入方向 443 0.0.0.0/0 HTTPS(以后配 SSL)
入方向 5000 0.0.0.0/0 Flask 开发端口

二、连接到服务器

ssh root@你的ECS公网IP

首次登录会提示改密码。建议顺手创建一个非 root 用户:

adduser deploy
usermod -aG sudo deploy

三、部署 Flask 项目

3.1 安装环境

sudo apt update
sudo apt install python3 python3-pip python3-venv nginx -y

3.2 创建 Flask 项目

mkdir ~/myapp && cd ~/myapp
python3 -m venv venv
source venv/bin/activate
pip install flask gunicorn

写一个最简单的 app:

# app.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello from ECS!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

测试一下:

python app.py
# 浏览器访问 http://你的IP:5000,应该看到 "Hello from ECS!"

3.3 用 Gunicorn 运行

Flask 自带的服务器不能用于生产。用 Gunicorn:

gunicorn -w 4 -b 0.0.0.0:5000 app:app

-w 4 表示 4 个 worker 进程,一般设为 CPU 核数 × 2。


四、配置 Nginx 反向代理

Gunicorn 直接对外不太安全,前面加一层 Nginx。

sudo nano /etc/nginx/sites-available/myapp

写入:

server {
    listen 80;
    server_name 你的域名或IP;

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

启用配置:

sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t          # 测试配置
sudo systemctl restart nginx

现在访问 http://你的IP,不用加 5000 端口了。


五、让项目后台运行

写个 systemd 服务:

sudo nano /etc/systemd/system/myapp.service
[Unit]
Description=My Flask App
After=network.target

[Service]
User=deploy
WorkingDirectory=/home/deploy/myapp
ExecStart=/home/deploy/myapp/venv/bin/gunicorn -w 4 -b 127.0.0.1:5000 app:app
Restart=always

[Install]
WantedBy=multi-user.target

启动:

sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp

现在关了 SSH 窗口,服务还在跑。


六、踩坑记录

坑1:安全组忘了开端口

最常犯的错误。确认安全组 80/5000 端口是入方向允许。

坑2:Gunicorn 绑定 0.0.0.0

通过 Nginx 代理时 Gunicorn 绑 127.0.0.1 就够了。绑 0.0.0.0 会让服务直接暴露,不安全。

坑3:虚拟环境路径写错

systemd 里的 ExecStart 要用 venv 里的 gunicorn,不是系统全局的。

坑4:忘记 enable 服务

systemctl start 只管当前,重启后会停。必须 systemctl enable


七、成本与后续

ECS 月费 ~¥105,如果只是个人项目,比 PaaS(Heroku、Railway)便宜。加上域名一年几十块,总成本很低。

下一步计划:加上 SSL 证书(Let’s Encrypt 免费)、配置自动部署(GitHub Actions)、接入数据库(RDS 或自建 MySQL)。

如果有问题,欢迎在评论区交流。阿里云新用户注册有免费试用:aliyun.com

更多推荐