CentOS 上构建与部署 Python 项目的实用流程
一 环境准备与 Python 安装
- 更新系统并安装基础工具与编译依赖(适用于 CentOS 7/8):
- 安装 EPEL 与编译依赖:sudo yum install -y epel-release gcc gcc-c++ make wget zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel libpcap-devel xz-devel libffi-devel
- 安装 Python 3(两种常用方式,二选一或并存):
- 方式 A(系统仓库):sudo yum install -y python3 python3-pip
- 方式 B(SCL 获取新版本,如 Python 3.8):sudo yum install -y centos-release-scl && sudo yum install -y rh-python38 && scl enable rh-python38 bash
- 方式 C(源码编译,指定版本如 3.8.7):
- wget https://www.python.org/ftp/python/3.8.7/Python-3.8.7.tar.xz
- tar -xvJf Python-3.8.7.tar.xz && cd Python-3.8.7
- ./configure --prefix=/usr/local/python3 && make -j$(nproc) && sudo make altinstall
- 建立软链:sudo ln -sfn /usr/local/python3/bin/python3.8 /usr/bin/python3 && sudo ln -sfn /usr/local/python3/bin/pip3.8 /usr/bin/pip3
- 验证:python3 -V 与 pip3 -V 应显示对应版本。
二 项目构建与依赖管理
- 建议使用虚拟环境隔离依赖:
- python3 -m venv venv && source venv/bin/activate
- 使用 requirements.txt 管理依赖:
- pip install -U pip wheel
- pip install -r requirements.txt
- 生成锁定文件:pip freeze > requirements.txt
- 常见问题与处理:
- 编译/安装包时报错缺少头文件(如 zlib、openssl、libffi):安装对应 -devel 包后重试
- CentOS 7 自带 SQLite 版本较旧,若 Django 报 “SQLite 3.8.3 or later is required”,可升级系统 SQLite 或使用外部数据库(如 PostgreSQL/MySQL)。
三 以 WSGI 服务器运行与进程守护
- 选择 Gunicorn(通用 WSGI)或 uWSGI(高并发/与 Nginx 配合佳)运行应用:
- Gunicorn(示例):pip install gunicorn;gunicorn -w 4 -b 127.0.0.1:8000 your_app:app
- uWSGI(示例 ini):在项目根目录创建 uwsgi.ini
- [uwsgi]
- chdir=/path/to/app
- module=your_app.wsgi:application
- master=true
- processes=4
- socket=127.0.0.1:8000
- chmod-socket=666
- vacuum=true
- die-on-term=true
- logto=/var/log/uwsgi/your_app.log
- 启动:uwsgi --ini uwsgi.ini
- 使用 systemd 托管进程(示例服务 /etc/systemd/system/your_app.service):
- [Unit]
- Description=Your Python App
- After=network.target
- [Service]
- User=your_user
- Group=www-data
- WorkingDirectory=/path/to/app
- Environment=“PATH=/path/to/app/venv/bin”
- ExecStart=/path/to/app/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 your_app:app
- Restart=always
- [Install]
- WantedBy=multi-user.target
- 启用:sudo systemctl daemon-reload && sudo systemctl enable --now your_app
- 如需使用 uWSGI 托管,可将 ExecStart 换为:/path/to/app/venv/bin/uwsgi --ini /path/to/app/uwsgi.ini
四 反向代理与防火墙配置
- 使用 Nginx 作为反向代理与静态资源服务:
- 安装:sudo yum install -y nginx && sudo systemctl enable --now nginx
- 站点配置示例(/etc/nginx/conf.d/your_app.conf):
- server {
- listen 80;
- server_name your_domain_or_ip;
- location / {
- proxy_pass http://127.0.0.1:8000;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- }
- location /static/ {
- alias /path/to/app/static/;
- }
- }
- 重载:sudo nginx -s reload
- 防火墙放行(firewalld):
- sudo firewall-cmd --permanent --add-service=http --add-service=https
- 或放行指定端口:sudo firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp
- 重载:sudo firewall-cmd --reload
- 如部署在云厂商,还需在安全组放行对应端口
五 Docker 化构建与运行
- 在项目根目录创建 Dockerfile(基于 CentOS 7 示例):
- FROM centos:7
- RUN yum install -y epel-release && yum install -y python3 python3-pip && yum clean all
- WORKDIR /app
- COPY requirements.txt .
- RUN pip3 install -r requirements.txt
- COPY . .
- CMD [“python3”, “app.py”]
- 构建与运行:
- docker build -t my-python-app .
- docker run --name myapp -p 5000:5000 -d my-python-app
- 生产建议:多阶段构建、非 root 运行、使用 gunicorn/uwsgi 启动、配置 .dockerignore 减少镜像体积。