Ubuntu 上部署 Python 环境的完整实战指南

关键词:Ubuntu、Python 部署、虚拟环境、pip、Docker、系统优化、CI/CD

compressed_96204687.jpg

摘要:本文从系统准备、基础依赖、版本管理到生产级部署(systemd、Docker、CI/CD)全链路展开,提供可直接复制的命令和配置示例,并配以对比表格与流程图,帮助读者在 Ubuntu(20.04/22.04/24.04)上快速搭建安全、可靠且易维护的 Python 运行环境。

1. 前置准备

1.1 确认 Ubuntu 版本

Ubuntu 发行版LTS 支持周期推荐 Python 3.x
20.04 Focal20253.8 / 3.10
22.04 Jammy20323.10 / 3.11
24.04 Noble2034(预计)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-dev

1.3 创建普通用户(避免 root 直接运行代码)

sudo adduser pydev   # 按提示设置密码
sudo usermod -aG sudo pydev
# 切换到新用户
su - pydev

2. 系统层面的 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 $SHELL

3.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.7

3.4 为特定项目绑定本地 Python 版本

cd /path/to/your/project
pyenv local 3.10.13   # 会在项目根目录生成 .python-version

4. 创建隔离的虚拟环境(venv / virtualenv)

4.1 使用内置 venv(推荐 Python≥3.8)

cd myproject
python -m venv .venv   # 创建目录 .venv
source .venv/bin/activate
pip install --upgrade pip setuptools wheel

4.2 使用 virtualenv(兼容旧版或需要全局 site‑packages)

pip install virtualenv
virtualenv -p $(pyenv which python) venv-py311
source venv-py311/bin/activate
Tip:在 requirements.txt 中锁定依赖版本,配合 pip-tools 生成 requirements.lock,可提升 reproducibility。

4.3 自动化激活(编辑 .bashrc

# 项目根目录下的 .env 文件存放环境变量
if [ -f "$(pwd)/.venv/bin/activate" ]; then
    source "$(pwd)/.venv/bin/activate"
fi

5. 常用依赖与工具链安装

类别推荐库 / 工具安装命令(在激活的 venv 中)
Web 框架Flask、FastAPI、Djangopip install flask fastapi uvicorn django
数据库驱动psycopg2‑binary、mysqlclient、redis-pypip install psycopg2-binary mysqlclient redis
科学计算numpy、pandas、scipy、matplotlibpip install numpy pandas scipy matplotlib
异步 & 并发aiohttp、celery、dramatiqpip install aiohttp celery dramatiq
测试 & CIpytest、coverage、toxpip install pytest coverage tox
打包与发布build、twine、poetrypip 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:app

chmod +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.target
sudo 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:latest

6.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、数据库密码放入 VaultGitHub Secrets,容器使用 --env-file
防止代码注入使用 pylint/bandit 静态检查;CI 中加入安全扫描步骤

7.2 性能调优要点

  • Gunicorn workersworkers = (CPU cores * 2) + 1
  • Uvicorn workers:使用 --workers N,配合 --loop uvloop 提升异步性能
  • Cache:在热点查询前加入 Redis/LRU 缓存
  • Profilingpy-spycProfile 定期分析热点函数

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.tomlRUN 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 🚀!

标签: none

添加新评论