Linux下Python3与Django生产环境部署指南
2026/7/22 1:50:49
网站开发
1. Linux环境下Python3与Django部署全攻略作为一个长期在Linux环境下折腾Python项目的开发者我深知从零开始部署Python3Django环境会遇到多少坑。不同于Windows的一键安装体验Linux环境下的部署往往需要处理依赖冲突、权限管理、环境隔离等一系列问题。本文将基于我在CentOS和Ubuntu两大主流Linux发行版上的实战经验手把手带你完成从Python3编译安装到Django项目上线的完整流程。2. 环境准备与Python3安装2.1 系统基础环境配置在开始之前我们需要确保系统具备基本的编译环境。不同Linux发行版的包管理命令略有差异# Ubuntu/Debian系 sudo apt update sudo apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget # CentOS/RHEL系 sudo yum groupinstall -y Development Tools sudo yum install -y openssl-devel bzip2-devel libffi-devel sqlite-devel这些依赖包包含了Python编译所需的头文件和库文件。我曾经因为漏装libffi-dev导致pip安装失败花了两个小时才排查出问题根源。2.2 Python3源码编译安装虽然大多数Linux发行版自带Python2或Python3但版本往往较旧。我推荐手动编译安装最新稳定版Python3wget https://www.python.org/ftp/python/3.9.12/Python-3.9.12.tgz tar -xvf Python-3.9.12.tgz cd Python-3.9.12 ./configure --enable-optimizations make -j$(nproc) sudo make altinstall关键参数说明--enable-optimizations启用优化提升Python运行效率约10%altinstall避免覆盖系统默认Python版本-j$(nproc)使用所有CPU核心并行编译注意不要使用make install这会覆盖系统默认Python链接可能导致yum等系统工具失效。验证安装python3.9 --version pip3.9 --version3. 虚拟环境与Django安装3.1 创建项目专用虚拟环境Python虚拟环境是项目隔离的最佳实践我强烈建议每个Django项目使用独立环境python3.9 -m venv ~/venvs/myproject source ~/venvs/myproject/bin/activate虚拟环境激活后命令行提示符前会出现(myproject)标记。常见问题虚拟环境未激活时安装的包会进入全局site-packagesWindows和Linux的激活命令不同退出虚拟环境使用deactivate命令3.2 Django安装与项目创建在激活的虚拟环境中安装Djangopip install django4.0.4为什么选择4.0.4版本这是当前LTS(Long Term Support)版本官方支持到2023年12月。创建项目django-admin startproject myproject cd myproject python manage.py migrate python manage.py createsuperuser项目结构说明myproject/ ├── manage.py # 项目管理脚本 └── myproject/ ├── __init__.py ├── settings.py # 项目配置 ├── urls.py # URL路由 └── wsgi.py # WSGI入口4. 生产环境部署方案4.1 开发服务器测试Django自带开发服务器适合初期测试python manage.py runserver 0.0.0.0:8000但请注意开发服务器性能差不能用于生产环境默认不处理静态文件没有HTTPS支持4.2 Nginx Gunicorn方案生产环境我推荐NginxGunicorn组合这是目前最稳定的Django部署方案之一。4.2.1 安装Gunicornpip install gunicorn创建Gunicorn启动脚本gunicorn_start.sh#!/bin/bash NAMEmyproject DIR/home/user/myproject USERuser GROUPuser WORKERS3 BINDunix:/run/gunicorn.sock DJANGO_SETTINGS_MODULEmyproject.settings DJANGO_WSGI_MODULEmyproject.wsgi cd $DIR source ~/venvs/myproject/bin/activate exec gunicorn ${DJANGO_WSGI_MODULE}:application \ --name $NAME \ --workers $WORKERS \ --user$USER \ --group$GROUP \ --bind$BIND \ --log-leveldebug \ --log-file-设置可执行权限chmod x gunicorn_start.sh4.2.2 配置Nginx安装Nginx# Ubuntu sudo apt install -y nginx # CentOS sudo yum install -y nginx创建Nginx配置文件/etc/nginx/sites-available/myprojectserver { listen 80; server_name yourdomain.com; location /favicon.ico { access_log off; log_not_found off; } location /static/ { alias /home/user/myproject/static/; } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } }启用配置sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled sudo nginx -t # 测试配置 sudo systemctl restart nginx4.3 静态文件收集Django开发模式下静态文件由开发服务器处理生产环境需要单独配置# settings.py STATIC_URL /static/ STATIC_ROOT os.path.join(BASE_DIR, static)运行收集命令python manage.py collectstatic5. 系统服务与自动化5.1 创建Systemd服务为了让Gunicorn随系统启动创建/etc/systemd/system/gunicorn.service[Unit] Descriptiongunicorn daemon Afternetwork.target [Service] Useruser Groupuser WorkingDirectory/home/user/myproject ExecStart/home/user/myproject/gunicorn_start.sh Restarton-failure [Install] WantedBymulti-user.target启用服务sudo systemctl daemon-reload sudo systemctl start gunicorn sudo systemctl enable gunicorn5.2 日志监控关键日志位置Gunicorn日志/var/log/gunicorn/需自行配置Nginx访问日志/var/log/nginx/access.logNginx错误日志/var/log/nginx/error.log我习惯使用tail -f实时监控日志tail -f /var/log/nginx/error.log6. 安全加固与优化6.1 基础安全配置# settings.py DEBUG False ALLOWED_HOSTS [yourdomain.com, localhost] SECURE_HSTS_SECONDS 3600 SECURE_CONTENT_TYPE_NOSNIFF True SECURE_BROWSER_XSS_FILTER True SESSION_COOKIE_SECURE True CSRF_COOKIE_SECURE True X_FRAME_OPTIONS DENY6.2 性能优化建议数据库连接池pip install django-db-geventpool缓存配置使用RedisCACHES { default: { BACKEND: django_redis.cache.RedisCache, LOCATION: redis://127.0.0.1:6379/1, OPTIONS: { CLIENT_CLASS: django_redis.client.DefaultClient, } } }Gunicorn调优# 根据服务器CPU核心数调整workers WORKERS$((2 * $(nproc) 1))7. 常见问题排查7.1 502 Bad Gateway错误可能原因及解决方案Gunicorn未运行sudo systemctl status gunicornSocket文件权限问题chmod 777 /run/gunicorn.sockNginx配置错误sudo nginx -t7.2 静态文件404检查STATIC_ROOT设置是否正确Nginx配置中的alias路径是否执行了collectstatic7.3 数据库连接问题Django默认使用SQLite如需切换MySQLDATABASES { default: { ENGINE: django.db.backends.mysql, NAME: mydatabase, USER: mydatabaseuser, PASSWORD: mypassword, HOST: localhost, PORT: 3306, } }记得安装MySQL驱动pip install mysqlclient8. 进阶部署方案8.1 Docker化部署创建DockerfileFROM python:3.9 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code COPY requirements.txt /code/ RUN pip install -r requirements.txt COPY . /code/ EXPOSE 8000 CMD [gunicorn, --bind, :8000, myproject.wsgi:application]8.2 CI/CD集成.gitlab-ci.yml示例stages: - test - deploy test: stage: test script: - pip install -r requirements.txt - python manage.py test deploy_prod: stage: deploy script: - scp -r . userserver:/home/user/myproject - ssh userserver cd /home/user/myproject git pull source venv/bin/activate python manage.py migrate sudo systemctl restart gunicorn only: - master经过以上步骤你应该已经拥有了一个稳定运行的Django生产环境。我在实际部署中最常遇到的问题是权限设置和静态文件配置建议在这两个环节多花些时间测试验证。