Ubuntu 上部署 Python 环境的完整实战指南
Ubuntu 上部署 Python 环境的完整实战指南
关键词:Ubuntu、Python 部署、虚拟环境、pip、Docker、系统优化、CI/CD

摘要:本文从系统准备、基础依赖、版本管理到生产级部署(systemd、Docker、CI/CD)全链路展开,提供可直接复制的命令和配置示例,并配以对比表格与流程图,帮助读者在 Ubuntu(20.04/22.04/24.04)上快速搭建安全、可靠且易维护的 Python 运行环境。
1. 前置准备
1.1 确认 Ubuntu 版本
| Ubuntu 发行版 | LTS 支持周期 | 推荐 Python 3.x |
|---|---|---|
| 20.04 Focal | 2025 | 3.8 / 3.10 |
| 22.04 Jammy | 2032 | 3.10 / 3.11 |
| 24.04 Noble | 2034(预计) | 3.11 / 3.12 |
Tip:生产环境建议使用 LTS 版,确保长期安全更新。
1.2 更新系统并安装必备工具
sudo apt update && sudo apt upgrade -y
# 常用编译依赖(用于后续 pip 编译 C 扩展)
sudo apt install -y build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev1.3 创建普通用户(避免 root 直接运行代码)
sudo adduser pydev # 按提示设置密码
sudo usermod -aG sudo pydev
# 切换到新用户
su - pydev2. 系统层面的 Python 安装方案对比
在 Ubuntu 上部署 Python 常见三大路径:
1️⃣ APT 官方仓库(apt install python3.x)
2️⃣ 源码编译(手动./configure && make && sudo make altinstall)
3️⃣ pyenv 管理器(多版本、灵活切换)
2.1 对比表格
| 方案 | 安装难度 | 多版本支持 | 与系统库冲突风险 | 自动升级 (APT) | 推荐场景 |
|---|---|---|---|---|---|
| APT 官方仓库 | ★☆☆☆☆ | ✖️(仅单一系统默认) | 高(会覆盖系统自带的 python3) | ✅ 自动安全更新 | 快速测试、轻量脚本 |
| 源码编译 | ★★☆☆☆ | ✅(自行管理路径) | 中(需要手动维护 symlink) | ✖️ 手动升级 | 需要特定补丁或最新特性 |
| pyenv | ★★★☆☆ | ✅(无限制) | 低(安装在用户目录) | ✅ 可配合 pyenv-update 自动更新 | 生产、CI/CD、研发多版本共存 |
结论:对于大多数项目,推荐使用 pyenv + venv 的组合;仅在极简容器或系统工具链中才考虑 APT。
3. 使用 pyenv 管理多版本 Python
3.1 安装 pyenv(推荐使用 curl 安装脚本)
curl https://pyenv.run | bash脚本会在~/.bashrc、~/.zshrc中自动添加以下内容:
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv virtualenv-init -)"执行后重新加载 shell:
exec $SHELL3.2 查看可用的 Python 版本列表
pyenv install --list | grep -E "^\s*3\.[89]|^3\.1[0-9]"
# 示例输出:3.8.19, 3.10.13, 3.11.7, 3.12.2 ...3.3 安装目标版本(以 3.11 为例)
pyenv install 3.11.7
pyenv global 3.11.7 # 设置全局默认
python --version # 验证
# 输出:Python 3.11.73.4 为特定项目绑定本地 Python 版本
cd /path/to/your/project
pyenv local 3.10.13 # 会在项目根目录生成 .python-version4. 创建隔离的虚拟环境(venv / virtualenv)
4.1 使用内置 venv(推荐 Python≥3.8)
cd myproject
python -m venv .venv # 创建目录 .venv
source .venv/bin/activate
pip install --upgrade pip setuptools wheel4.2 使用 virtualenv(兼容旧版或需要全局 site‑packages)
pip install virtualenv
virtualenv -p $(pyenv which python) venv-py311
source venv-py311/bin/activateTip:在requirements.txt中锁定依赖版本,配合pip-tools生成requirements.lock,可提升 reproducibility。
4.3 自动化激活(编辑 .bashrc)
# 项目根目录下的 .env 文件存放环境变量
if [ -f "$(pwd)/.venv/bin/activate" ]; then
source "$(pwd)/.venv/bin/activate"
fi5. 常用依赖与工具链安装
| 类别 | 推荐库 / 工具 | 安装命令(在激活的 venv 中) |
|---|---|---|
| Web 框架 | Flask、FastAPI、Django | pip install flask fastapi uvicorn django |
| 数据库驱动 | psycopg2‑binary、mysqlclient、redis-py | pip install psycopg2-binary mysqlclient redis |
| 科学计算 | numpy、pandas、scipy、matplotlib | pip install numpy pandas scipy matplotlib |
| 异步 & 并发 | aiohttp、celery、dramatiq | pip install aiohttp celery dramatiq |
| 测试 & CI | pytest、coverage、tox | pip install pytest coverage tox |
| 打包与发布 | build、twine、poetry | pip install build twine poetry |
最佳实践:使用pyproject.toml(PEP 517/518)统一管理依赖,配合uv pip(更快的解析器)提升安装速度。
6. 生产环境部署方案
6.1 Systemd 服务化运行
6.1.1 编写 gunicorn 启动脚本(以 FastAPI 为例)
# 项目结构
myapp/
├─ app/
│ └─ main.py # FastAPI 实例:app = FastAPI()
├─ .venv/
└─ requirements.txt启动脚本 run.sh
#!/usr/bin/env bash
source /home/pydev/myapp/.venv/bin/activate
exec gunicorn -k uvicorn.workers.UvicornWorker \
--workers 4 --bind 0.0.0.0:8000 app.main:appchmod +x run.sh
6.1.2 Systemd unit 文件 /etc/systemd/system/myapp.service
[Unit]
Description=FastAPI Application Service
After=network.target
[Service]
User=pydev
Group=www-data
WorkingDirectory=/home/pydev/myapp
ExecStart=/home/pydev/myapp/run.sh
Restart=on-failure
Environment="PYTHONUNBUFFERED=1"
# 限制内存(可选)
MemoryLimit=500M
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now myapp.service
sudo journalctl -u myapp -f # 查看日志6.2 Docker 容器化部署
6.2.1 多阶段构建的 Dockerfile
# ---------- Build Stage ----------
FROM python:3.11-slim AS builder
WORKDIR /app
# 安装编译依赖(仅 build 阶段)
RUN apt-get update && apt-get install -y gcc libpq-dev && rm -rf /var/lib/apt/lists/*
COPY pyproject.toml poetry.lock ./
RUN pip install --upgrade pip && \
pip install poetry && \
poetry config virtualenvs.create false && \
poetry install --no-root --only main
# ---------- Runtime Stage ----------
FROM python:3.11-slim
WORKDIR /app
# 仅复制运行时需要的文件
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY . .
EXPOSE 8000
CMD ["gunicorn", "-k", "uvicorn.workers.UvicornWorker", "--workers", "4",
"--bind", "0.0.0.0:8000", "app.main:app"]docker build -t myfastapi:latest .
docker run -d -p 8000:8000 --restart unless-stopped myfastapi:latest6.2.2 Docker Compose(包含数据库)
version: "3.9"
services:
web:
image: myfastapi:latest
build: .
ports:
- "8000:8000"
depends_on:
- db
environment:
DATABASE_URL: postgresql://user:pass@db:5432/mydb
db:
image: postgres:15-alpine
restart: always
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
pgdata:6.3 CI/CD 自动化流水线(GitHub Actions 示例)
name: CI & Deploy
on:
push:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install dependencies
run: |
pip install poetry
poetry install
- name: Run tests
run: |
poetry run pytest --cov
build-and-push:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PASS }}
- name: Build & Push Image
run: |
docker build -t ${{ secrets.DOCKER_USER }}/myfastapi:${{ github.sha }} .
docker push ${{ secrets.DOCKER_USER }}/myfastapi:${{ github.sha }}7. 安全加固与性能调优
7.1 常见安全措施
| 项目 | 操作 |
|---|---|
| 最小权限用户 | 使用 pydev 而非 root,Systemd 中 User=、Group= |
| 文件系统权限 | chmod 750 /home/pydev/myapp && chown -R pydev:www-data |
| 环境变量加密 | 将 SECRET_KEY、数据库密码放入 Vault 或 GitHub Secrets,容器使用 --env-file |
| 防止代码注入 | 使用 pylint/bandit 静态检查;CI 中加入安全扫描步骤 |
7.2 性能调优要点
- Gunicorn workers:
workers = (CPU cores * 2) + 1 - Uvicorn workers:使用
--workers N,配合--loop uvloop提升异步性能 - Cache:在热点查询前加入 Redis/LRU 缓存
- Profiling:
py-spy、cProfile定期分析热点函数
7.2.1 示例响应时间对比(饼图)
pie title 响应时间占比 (优化前 vs 优化后)
"I/O 等待" : 45
"CPU 计算" : 30
"网络延迟" : 15
"缓存命中" : 10结论:开启 uvloop + Redis 缓存后,I/O 等待降至约 20%,整体 RT 提升 35%。8. 故障排查常见问题 & FAQ
8.1 “ImportError: No module named xxx”
原因:激活的虚拟环境不匹配或 PYTHONPATH 被污染。
解决步骤:
which python # 确认指向 ~/.pyenv/versions/.../bin/python
pip list # 检查包是否已安装若路径错误,重新激活对应 venv 或使用 pyenv shell 3.11.7。
8.2 Systemd 启动失败(状态 failed)
常见日志:
journalctl -u myapp.service -p err- 权限错误:确保
User=与文件所有者一致。 - 端口被占用:使用
sudo lsof -i:8000检查冲突。
8.3 Docker 构建慢(尤其是依赖编译)
技巧:
- 在
Dockerfile中先复制pyproject.toml再RUN poetry install --no-dev,利用缓存层。 - 使用
--platform=linux/amd64明确目标平台,避免 QEMU 兼容层。
8.4 pip 安装报错 “Failed building wheel for cryptography”
解决方案:
sudo apt-get install -y libffi-dev libssl-dev rustc cargo
pip install --upgrade pip setuptools
pip install cryptography结语
通过本文的 系统层面对比 → pyenv 多版本管理 → venv 隔离 → 生产化部署(systemd / Docker) → CI/CD 自动化 全链路示例,你已经掌握在 Ubuntu 环境下构建、维护以及安全加固 Python 项目的完整技能。
持续迭代:建议每季度审视依赖版本、系统安全补丁,并结合 pyenv update 与 Docker 镜像的定期重建,保持环境的“可复制 + 可升级”。祝你在 Ubuntu 上玩转 Python 🚀!