Linux下Python3与Django生产环境部署全攻略

📅 2026/7/22 2:15:34
Linux下Python3与Django生产环境部署全攻略
1. Linux环境下Python3与Django部署指南在服务器端应用开发领域LinuxPythonDjango的组合堪称黄金三角。最近帮朋友部署线上项目时我重新梳理了这套环境的标准化部署流程。不同于Windows系统的图形化安装Linux环境下需要更多命令行操作但一旦掌握就能获得更高的性能和稳定性。2. 基础环境准备2.1 系统更新与依赖安装在Ubuntu 20.04 LTS上我习惯先执行以下命令确保系统最新sudo apt update sudo apt upgrade -y sudo apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev这些依赖包包含了Python编译需要的工具链和基础库。特别是libssl-dev和libsqlite3-dev它们直接影响Django项目能否正常使用HTTPS和数据库功能。2.2 Python3多版本管理方案虽然系统自带Python3但我推荐使用pyenv进行版本管理curl https://pyenv.run | bash echo export PATH$HOME/.pyenv/bin:$PATH ~/.bashrc echo eval $(pyenv init --path) ~/.bashrc echo eval $(pyenv virtualenv-init -) ~/.bashrc source ~/.bashrc安装完成后可以查看可用版本pyenv install --list | grep 3\.选择最新的稳定版如3.9.7pyenv install 3.9.7 pyenv global 3.9.73. Django项目环境配置3.1 虚拟环境最佳实践我强烈建议为每个项目创建独立虚拟环境python -m venv /opt/myproject_env source /opt/myproject_env/bin/activate虚拟环境激活后提示符前会出现(env)标记。这样不同项目的依赖包就不会互相干扰。3.2 依赖包安装策略在项目目录下创建requirements.txt文件典型内容如下Django3.2.9 psycopg2-binary2.9.1 # PostgreSQL适配 gunicorn20.1.0 # 生产环境WSGI服务器安装时使用pip install --upgrade pip pip install -r requirements.txt重要提示永远不要在生产环境直接使用pip install django这种不带版本号的命令这会导致后续部署版本不一致。4. 生产环境部署方案4.1 Gunicorn配置要点创建/etc/systemd/system/gunicorn.service文件[Unit] Descriptiongunicorn daemon Afternetwork.target [Service] Userwww-data Groupwww-data WorkingDirectory/var/www/myproject ExecStart/opt/myproject_env/bin/gunicorn --access-logfile - --workers 3 --bind unix:/var/www/myproject/myproject.sock myproject.wsgi:application [Install] WantedBymulti-user.target关键参数说明workers数量建议设置为(2 x CPU核心数)1sock文件比TCP端口更安全高效日志文件要明确指定路径方便排查4.2 Nginx反向代理配置在/etc/nginx/sites-available/myproject中添加server { listen 80; server_name yourdomain.com; location /favicon.ico { access_log off; log_not_found off; } location /static/ { root /var/www/myproject; } location / { include proxy_params; proxy_pass http://unix:/var/www/myproject/myproject.sock; } }执行配置测试和重载sudo nginx -t sudo systemctl reload nginx5. 安全加固措施5.1 基础安全配置在settings.py中必须修改DEBUG False ALLOWED_HOSTS [yourdomain.com, localhost] SECURE_HSTS_SECONDS 31536000 SECURE_SSL_REDIRECT True SESSION_COOKIE_SECURE True CSRF_COOKIE_SECURE True5.2 数据库安全建议如果使用PostgreSQL建议创建专属用户CREATE DATABASE myproject_db; CREATE USER myproject_user WITH PASSWORD strongpassword; ALTER ROLE myproject_user SET client_encoding TO utf8; ALTER ROLE myproject_user SET default_transaction_isolation TO read committed; ALTER ROLE myproject_user SET timezone TO UTC; GRANT ALL PRIVILEGES ON DATABASE myproject_db TO myproject_user;6. 运维监控方案6.1 日志管理配置Gunicorn日志建议按天切割在/etc/logrotate.d/gunicorn中添加/var/log/gunicorn/*.log { daily missingok rotate 14 compress delaycompress notifempty create 640 www-data adm sharedscripts postrotate systemctl reload gunicorn endscript }6.2 性能监控方案安装配置Prometheus客户端pip install prometheus-client在Django的urls.py中添加from django.urls import path from prometheus_client import make_wsgi_app from django.core.wsgi import get_wsgi_application application get_wsgi_application() application make_wsgi_app(application) urlpatterns [ # 原有路由... path(metrics/, lambda _: HttpResponse(, status403)), # 禁用默认端点 ]然后在Nginx配置中单独暴露监控端口。7. 疑难问题排查指南7.1 502 Bad Gateway错误常见原因及解决方案sock文件权限问题sudo chown www-data:www-data /var/www/myproject/myproject.sockGunicorn服务未启动sudo systemctl status gunicorn journalctl -u gunicorn -b资源不足导致worker崩溃free -h # 检查内存 df -h # 检查磁盘空间7.2 静态文件加载失败检查步骤确认settings.py中STATIC_ROOT设置执行收集命令python manage.py collectstatic验证Nginx配置中的root路径检查文件权限sudo chown -R www-data:www-data /var/www/myproject/static8. 部署优化技巧8.1 使用异步worker对于I/O密集型应用可以换用uvicornpip install uvicorn启动命令改为uvicorn --workers 4 --host 0.0.0.0 --port 8000 myproject.asgi:application8.2 数据库连接池配置安装django-db-geventpoolpip install django-db-geventpool在settings.py中添加DATABASES { default: { ENGINE: django_db_geventpool.backends.postgresql_psycopg2, HOST: localhost, NAME: myproject_db, POOL: { MAX_CONNS: 20, RECYCLE: 300 } } }9. 自动化部署方案9.1 使用Fabric实现一键部署创建fabfile.pyfrom fabric import task task def deploy(c): with c.cd(/var/www/myproject): c.run(git pull origin main) c.run(/opt/myproject_env/bin/pip install -r requirements.txt) c.run(/opt/myproject_env/bin/python manage.py migrate) c.run(/opt/myproject_env/bin/python manage.py collectstatic --noinput) c.sudo(systemctl restart gunicorn) c.sudo(systemctl reload nginx)9.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 only: - main script: - scp -r . userserver:/var/www/myproject - ssh userserver cd /var/www/myproject ./deploy.sh10. 扩展架构建议当项目规模扩大时可以考虑使用Redis缓存会话和常用数据配置Celery处理异步任务采用Docker容器化部署增加负载均衡和多节点部署每次部署后建议运行python manage.py check --deploy这个命令会检查生产环境配置的完整性。