Django项目Nginx+Gunicorn生产环境部署全攻略 1. Django项目远程服务器部署全景解析当你在本地开发环境完成了一个Django项目后如何将它安全、高效地部署到远程服务器并投入生产使用这可能是许多开发者面临的第一个真正挑战。我经历过无数次从开发到生产的部署过程也踩过几乎所有能踩的坑——从数据库连接失败到静态文件404从权限问题到性能瓶颈。本文将分享一套经过实战检验的完整部署流程涵盖从服务器准备到生产优化的全链路实践。部署Django项目远不止是简单地上传代码。它涉及服务器环境配置、WSGI服务器选择、静态文件处理、数据库迁移、安全加固等多个关键环节。我们将使用NginxGunicorn的经典组合作为生产环境方案这种搭配既保证了性能又易于维护。对于刚接触部署的开发者理解每个步骤背后的原理比记住命令更重要——这能帮助你在遇到问题时快速定位原因。2. 部署前准备构建坚如磐石的基础环境2.1 服务器选购与基础配置选择服务器时需要考虑几个关键因素地理位置尽量靠近你的用户群体、配置小型项目2核4G起步、操作系统推荐Ubuntu 20.04/22.04 LTS。我强烈建议使用云服务商提供的服务器它们通常自带备份和监控功能。首次登录服务器后第一件事应该是创建专用部署用户adduser deployer # 创建部署专用用户 usermod -aG sudo deployer # 授予sudo权限重要提示永远不要直接使用root用户部署应用这会导致严重的安全隐患。接下来配置SSH密钥登录禁用密码认证。编辑/etc/ssh/sshd_config文件确保以下配置PasswordAuthentication no PermitRootLogin no然后重启SSH服务sudo systemctl restart sshd2.2 Python环境隔离与管理不同项目可能需要不同版本的Python和依赖包使用虚拟环境是必须的。我推荐使用pyenv结合virtualenv# 安装pyenv curl https://pyenv.run | bash echo export PATH$HOME/.pyenv/bin:$PATH ~/.bashrc echo eval $(pyenv init -) ~/.bashrc echo eval $(pyenv virtualenv-init -) ~/.bashrc source ~/.bashrc # 安装指定Python版本 pyenv install 3.10.6 # 创建项目专用虚拟环境 pyenv virtualenv 3.10.6 myproject_env虚拟环境创建后在任何项目目录下执行pyenv activate myproject_env即可激活。2.3 数据库选型与配置虽然Django自带SQLite但生产环境强烈建议使用PostgreSQL或MySQL。以下是PostgreSQL的安装配置sudo apt install postgresql postgresql-contrib sudo -u postgres createuser --pwprompt deployer sudo -u postgres createdb myproject_db --ownerdeployer然后在Django的settings.py中配置DATABASES { default: { ENGINE: django.db.backends.postgresql, NAME: myproject_db, USER: deployer, PASSWORD: your_strong_password, HOST: localhost, PORT: , } }3. 核心部署流程从代码到生产3.1 项目代码传输与依赖安装有多种方式可以将本地代码传输到服务器我推荐使用Git进行版本控制同步。在服务器上mkdir ~/projects cd ~/projects git clone https://github.com/yourname/myproject.git cd myproject pyenv activate myproject_env pip install -r requirements.txt对于包含敏感信息的配置如SECRET_KEY、数据库密码等应该使用环境变量而非直接写在代码中。安装python-dotenv管理环境变量pip install python-dotenv然后在项目根目录创建.env文件SECRET_KEYyour_production_secret_key DEBUGFalse DB_PASSWORDyour_db_password在settings.py中读取from dotenv import load_dotenv load_dotenv() SECRET_KEY os.getenv(SECRET_KEY) DEBUG os.getenv(DEBUG) True3.2 Gunicorn配置与系统服务化Gunicorn是Python WSGI HTTP服务器比Django自带的开发服务器更适合生产环境。安装并创建配置文件pip install gunicorn创建gunicorn_config.pybind 127.0.0.1:8000 workers 3 worker_class gevent max_requests 1000 max_requests_jitter 50 timeout 30 keepalive 2将Gunicorn设为系统服务创建/etc/systemd/system/gunicorn.service[Unit] Descriptiongunicorn daemon Afternetwork.target [Service] Userdeployer Groupwww-data WorkingDirectory/home/deployer/projects/myproject ExecStart/home/deployer/.pyenv/versions/myproject_env/bin/gunicorn -c gunicorn_config.py myproject.wsgi:application [Install] WantedBymulti-user.target启动并启用服务sudo systemctl start gunicorn sudo systemctl enable gunicorn3.3 Nginx配置与静态文件处理Nginx作为反向代理和静态文件服务器安装配置如下sudo apt install nginx创建/etc/nginx/sites-available/myprojectserver { listen 80; server_name yourdomain.com; location /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/deployer/projects/myproject; expires 30d; } location /media/ { root /home/deployer/projects/myproject; expires 30d; } location / { include proxy_params; proxy_pass http://127.0.0.1:8000; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; } }启用配置并测试sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled sudo nginx -t sudo systemctl restart nginx收集静态文件python manage.py collectstatic4. 生产环境关键优化与安全加固4.1 性能调优实战数据库连接池是提高性能的关键安装django-db-geventpoolpip install django-db-geventpool修改DATABASES配置DATABASES { default: { ENGINE: django_db_geventpool.backends.postgresql_psycopg2, NAME: myproject_db, USER: deployer, PASSWORD: os.getenv(DB_PASSWORD), HOST: localhost, PORT: , CONN_MAX_AGE: 0, OPTIONS: { MAX_CONNS: 20, REUSE_CONNS: 10 } } }4.2 安全防护大全首先配置HTTPS使用Lets Encrypt免费证书sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d yourdomain.com自动续期测试sudo certbot renew --dry-runDjango安全设置SECURE_HSTS_SECONDS 31536000 SECURE_HSTS_INCLUDE_SUBDOMAINS True SECURE_HSTS_PRELOAD True SECURE_CONTENT_TYPE_NOSNIFF True SECURE_BROWSER_XSS_FILTER True SECURE_SSL_REDIRECT True SESSION_COOKIE_SECURE True CSRF_COOKIE_SECURE True X_FRAME_OPTIONS DENY4.3 监控与日志管理配置日志轮转创建/etc/logrotate.d/gunicorn/home/deployer/projects/myproject/logs/*.log { daily missingok rotate 14 compress delaycompress notifempty create 640 deployer www-data sharedscripts postrotate systemctl reload gunicorn endscript }安装Prometheus和Grafana进行监控或使用更简单的方案pip install django-prometheus在INSTALLED_APPS中添加django_prometheus并在urls.py中添加urlpatterns [ path(metrics/, include(django_prometheus.urls)), ]5. 高级部署策略与持续集成5.1 Docker化部署方案对于更复杂的项目可以考虑使用Docker。创建DockerfileFROM python:3.10-slim ENV PYTHONUNBUFFERED1 \ PYTHONDONTWRITEBYTECODE1 WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . RUN python manage.py collectstatic --noinput EXPOSE 8000 CMD [gunicorn, --bind, 0.0.0.0:8000, myproject.wsgi:application]创建docker-compose.ymlversion: 3.8 services: web: build: . ports: - 8000:8000 env_file: - .env depends_on: - db command: bash -c python manage.py migrate gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application db: image: postgres:13 volumes: - postgres_data:/var/lib/postgresql/data/ environment: POSTGRES_DB: myproject_db POSTGRES_USER: deployer POSTGRES_PASSWORD: your_db_password nginx: image: nginx:latest ports: - 80:80 - 443:443 volumes: - ./static:/app/static - ./nginx.conf:/etc/nginx/conf.d/default.conf depends_on: - web volumes: postgres_data:5.2 CI/CD自动化流程使用GitHub Actions实现自动化部署创建.github/workflows/deploy.ymlname: Deploy on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkoutv2 - name: Install SSH key uses: webfactory/ssh-agentv0.5.0 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - name: Run deployment script run: | ssh -o StrictHostKeyCheckingno deployeryourserver.com cd ~/projects/myproject git pull origin main source ~/.pyenv/versions/myproject_env/bin/activate pip install -r requirements.txt python manage.py migrate python manage.py collectstatic --noinput sudo systemctl restart gunicorn 6. 故障排查与日常维护6.1 常见问题速查表问题现象可能原因解决方案502 Bad GatewayGunicorn未运行或崩溃sudo systemctl status gunicorn检查状态查看日志/var/log/gunicorn/error.log静态文件404Nginx配置错误或权限问题检查Nginx配置中的root路径确保collectstatic已执行检查文件权限数据库连接失败密码错误或pg_hba.conf配置问题检查settings.py配置查看PostgreSQL日志/var/log/postgresql/迁移失败模型与数据库不匹配尝试python manage.py migrate --fake或回滚迁移6.2 性能瓶颈诊断安装django-debug-toolbar仅开发环境pip install django-debug-toolbar配置settings.pyif DEBUG: INSTALLED_APPS [debug_toolbar] MIDDLEWARE [debug_toolbar.middleware.DebugToolbarMiddleware] INTERNAL_IPS [127.0.0.1]对于生产环境使用django-silkpip install django-silk配置后访问/silk/界面查看性能分析。6.3 备份与恢复策略数据库自动备份创建/etc/cron.daily/dbbackup#!/bin/bash DATE$(date %Y%m%d) PGPASSWORDyourpassword pg_dump -U deployer -h localhost myproject_db /backups/db_$DATE.sql find /backups/ -type f -mtime 30 -delete设置可执行权限sudo chmod x /etc/cron.daily/dbbackup项目代码备份可以使用简单的rsync脚本rsync -avz --delete /home/deployer/projects/myproject /backups/code/7. 部署后的关键检查清单在完成所有部署步骤后运行以下检查确保一切正常基础功能检查访问网站首页检查是否正常加载测试表单提交和用户登录功能验证静态文件CSS/JS/图片是否正常加载安全配置验证访问http://版本应自动跳转到https://检查/admin/路径是否无法通过HTTP访问运行python manage.py check --deploy检查安全设置性能测试使用ab -n 1000 -c 50 https://yourdomain.com/进行压力测试检查Gunicorn工作进程的CPU和内存使用情况监控数据库连接数是否在合理范围监控报警设置配置UptimeRobot监控网站可用性设置服务器CPU/内存/磁盘的报警阈值监控Django错误日志中的500错误备份验证手动执行备份脚本验证是否正常工作尝试从备份恢复测试数据库检查备份文件是否包含所有关键数据部署Django项目到生产环境是一个系统工程需要开发者具备全栈视角。从我的经验来看90%的问题都出在环境配置和权限设置上。建议在正式部署前先在测试服务器上完整演练整个流程。当遇到问题时学会查看日志是最关键的排错技能——Nginx错误日志(/var/log/nginx/error.log)、Gunicorn日志(通过journalctl -u gunicorn查看)和Django日志是三大信息来源。