在华为云 ECS 上用 Python 部署 Flask 服务:步骤与注意事项
前言
Flask 是 Python 里最轻量的 Web 框架之一,很适合用来快速搭一个接口服务或内部小工具。本文记录在华为云 ECS(弹性云服务器)上,从零部署一个简单 Flask 服务的完整步骤,并总结几个我认为最容易踩的坑,适合刚接触云服务器的开发者参考。
一、准备 ECS 实例
- 在华为云控制台购买或使用已有的 ECS,操作系统可选 Ubuntu 22.04 或 EulerOS。学习用途选最低规格即可,注意按自己的需求选择计费方式。
- 在安全组入站规则里放行 22 端口(SSH)和你打算对外提供服务的端口,例如 5000 或 80。安全组没放行是“本机能访问、外网打不开”的头号原因。
- 使用 SSH 登录实例:ssh root@弹性公网IP。生产环境建议创建普通用户并禁用 root 密码登录。
二、安装 Python 与虚拟环境
sudo apt update
sudo apt install -y python3 python3-venv python3-pip
mkdir -p ~/flask-demo && cd ~/flask-demo
python3 -m venv venv
source venv/bin/activate
pip install flask gunicorn
使用虚拟环境可以避免污染系统 Python,也方便以后迁移依赖。
三、编写最小 Flask 应用
在 app.py 中写入:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/")
def index():
return "Hello, Huawei Cloud ECS!"
@app.route("/health")
def health():
return jsonify(status="ok")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
注意 host 要设置为 0.0.0.0,默认的 127.0.0.1 只允许本机访问,外网无法连通。
四、用 Gunicorn 运行
Flask 自带的开发服务器不适合生产环境。使用 Gunicorn:
gunicorn -w 2 -b 0.0.0.0:5000 app:app
worker 数量一般取 CPU 核数的 1 到 2 倍,小规格实例 2 个就够了。
五、使用 systemd 守护进程
为避免关闭 SSH 后服务退出,可以写一个 systemd 服务文件 /etc/systemd/system/flask-demo.service:
[Unit]
Description=Flask Demo
After=network.target
[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/flask-demo
ExecStart=/home/ubuntu/flask-demo/venv/bin/gunicorn -w 2 -b 0.0.0.0:5000 app:app
Restart=always
[Install]
WantedBy=multi-user.target
然后执行 sudo systemctl daemon-reload && sudo systemctl enable --now flask-demo,用 systemctl status flask-demo 查看状态,用 journalctl -u flask-demo -f 查看日志。
六、常见问题与注意事项
- 外网访问不了:依次检查 ① 服务是否监听 0.0.0.0;② 安全组入站规则;③ 系统防火墙(ufw/firewalld);④ 是否绑定了弹性公网 IP。
- 端口被占用:用 ss -lntp | grep 5000 找到占用进程。
- 不要开启 debug 模式:debug=True 会暴露交互式调试器,存在远程代码执行风险。
- 敏感信息不要写进代码:数据库密码等放到环境变量或配置文件,并且不要提交到代码仓库。
- 建议前置 Nginx:由 Nginx 监听 80/443,做反向代理、HTTPS 和静态资源处理,再转发给 Gunicorn。
- 注意成本:不用的实例及时关机或释放,避免产生不必要的费用。
总结
整个流程可以概括为:放行安全组 → 安装 Python 环境 → 编写应用 → Gunicorn 运行 → systemd 守护 →(可选)Nginx 反向代理。掌握这套流程后,部署其他 Python Web 项目也是类似的思路。希望这篇笔记对你有帮助,欢迎交流指正。
- 点赞
- 收藏
- 关注作者
评论(0)