在阿里云 ECS 上部署 Python,核心原则就一条:隔离、轻量、可维护。
别搞那些花里胡哨的“全局安装”或者直接在 /usr/bin/python3 下面改来改去,那是给自己挖坑。以下是几种主流且稳妥的方案,按推荐程度排序:
1. 首选方案:Docker + venv/poetry(生产环境最稳)
如果你追求稳定性、版本隔离和一键迁移,Docker 是必选项。
-
为什么选它?
- 环境纯净:容器内装什么就是什么,不会污染宿主机。
- 依赖锁定:配合
requirements.txt或poetry.lock,保证开发环境和生产环境一致。 - 回滚方便:镜像打错了?删掉重建就行,不用清理残留文件。
-
怎么做?
- 本地写好
Dockerfile。 - 使用
pipenv或poetry管理依赖(比 pip 更现代,自动处理虚拟环境)。 - 构建镜像推送到阿里云 ACR(容器镜像服务),或者直接 docker build 后运行。
- 用
docker-compose编排服务(比如加上 Nginx、Redis、Postgres)。
- 本地写好
注意:如果不想折腾 Docker,至少也要用
venv。
2. 次选方案:系统自带 Python + venv(轻量级项目)
如果你的项目很小,或者不想引入 Docker 的复杂度,直接用阿里云 Ubuntu/CentOS 自带的 Python 3.x,然后创建虚拟环境。
-
操作步骤:
# 1. 更新包管理器 sudo apt update # Ubuntu/Debian # 或 sudo yum install epel-release -y sudo yum install python3-pip -y # CentOS/RHEL # 2. 创建项目目录并进入 mkdir /opt/myproject && cd /opt/myproject # 3. 创建虚拟环境(关键!不要在全局装包) python3 -m venv venv # 4. 激活虚拟环境 source venv/bin/activate # 5. 安装依赖 pip install -r requirements.txt -
优点:资源占用极低,启动快,适合小流量应用。
-
缺点:需要手动管理进程(如用 systemd 守护),多版本共存麻烦。
3. 不推荐但常见的方案:Anaconda/Miniconda
除非你的项目重度依赖科学计算库(NumPy, Pandas, PyTorch 等),否则不要在生产服务器上用 Conda。
- 理由:
- 体积大,占用磁盘和内存。
- 路径复杂,容易和其他软件冲突。
- 对于 Web 后端服务,标准库 + pip 完全够用。
关键避坑指南(血泪教训)
-
绝对不要直接
pip install到系统 Python 环境
阿里云镜像本身可能带了某些系统工具依赖特定版本的库,你一旦覆盖,可能导致apt命令都跑不起来。 -
权限问题:不要用 root 运行你的 Python 应用
- 创建一个普通用户,比如
www-data或appuser。 - 设置好目录权限,确保该用户能读写日志和项目文件。
- 安全底线:即使被攻破,攻击者拿到的也是低权限账户。
- 创建一个普通用户,比如
-
使用 Gunicorn/Uvicorn + Nginx 反向X_X
- Python 自带的
runserver只能用于开发,严禁用于生产。 - Nginx 负责静态资源、SSL 终止、负载均衡。
- Gunicorn (WSGI) 或 Uvicorn (ASGI) 负责实际运行 Python 代码。
- 配置示例(Gunicorn):
gunicorn -w 4 -b 0.0.0.0:8000 app:app
- Python 自带的
-
日志与监控
- 把日志输出到
/var/log/myapp/,而不是打印到控制台。 - 利用阿里云云监控 Agent,监控 CPU、内存、网络 IO。
- 设置日志轮转(logrotate),防止日志文件撑爆磁盘。
- 把日志输出到
-
安全组配置
- 只开放 80/443 端口给公网。
- 数据库端口(3306/5432/6379)绝对不要对公网开放,只在 VPC 内部网段互通。
总结建议
| 场景 | 推荐方案 |
|---|---|
| 正式生产环境、团队协作、微服务 | Docker + Compose |
| 个人博客、小型 API、资源紧张 | System Python + venv + Gunicorn + Systemd |
| AI/数据科学模型推理 | Conda 环境 + Docker(隔离重依赖) |
最后提醒:定期备份数据库和代码。再好的环境,也怕手滑误删。
CLOUD云计算