在Linux云服务器上如何部署Django项目并配置Nginx和Gunicorn?

下面以 Ubuntu 20.04/22.04 为例,给出一个完整、可落地的部署流程(假设:

  • 项目根目录:/var/www/myproject
  • 域名:example.com
  • Python 版本:3.x

你可以根据实际情况修改路径和域名。


一、准备服务器环境

1. 更新系统并安装基础工具

sudo apt update && sudo apt upgrade -y

sudo apt install -y 
    python3-pip python3-venv 
    nginx git curl 
    build-essential libpq-dev

如果你的 Django 项目使用 PostgreSQL,请额外安装 postgresql 和客户端;如果使用 MySQL/MariaDB,也需安装对应驱动。


二、创建虚拟环境与安装依赖

1. 创建项目目录

sudo mkdir -p /var/www/myproject
cd /var/www/myproject

2. 创建 Python 虚拟环境

python3 -m venv venv
source venv/bin/activate

3. 安装 Django 及依赖

pip install --upgrade pip
pip install django gunicorn psycopg2-binary  # 若用 PostgreSQL
# 或 mysqlclient 等

将你的代码上传到 /var/www/myproject(例如通过 Git 克隆或 SCP)。

确保项目中有:

  • manage.py
  • myproject/settings.py(主配置)
  • 其他应用模块

三、Django 项目配置(生产环境)

编辑 myproject/settings.py,关键配置如下:

import os
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = "你的强密钥"  # 不要写在代码里,建议从环境变量读取

DEBUG = False  # 生产环境必须为 False

ALLOWED_HOSTS = ["example.com", "www.example.com", "localhost", "127.0.0.1"]

# 数据库(示例:PostgreSQL)
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "db_name",
        "USER": "db_user",
        "PASSWORD": "db_password",
        "HOST": "localhost",
        "PORT": "5432",
    }
}

# 静态文件
STATIC_URL = "/static/"
STATIC_ROOT = BASE_DIR / "staticfiles"

# 媒体文件(可选)
MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / "media"

# 安全设置
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
X_FRAME_OPTIONS = "DENY"

实际部署时,建议把 SECRET_KEY、数据库密码等放在环境变量中,避免硬编码。


四、收集静态文件

source venv/bin/activate
cd /var/www/myproject
python manage.py collectstatic --noinput

这会生成 /var/www/myproject/staticfiles 目录,Nginx 会直接提供这些文件。


五、启动 Gunicorn

1. 测试 Gunicorn 本地运行

gunicorn myproject.wsgi:application 
    --bind 127.0.0.1:8000 
    --workers 4 
    --timeout 30

在浏览器访问 http://<服务器IP>:8000 看是否正常。
如果成功,停止该进程(Ctrl+C)。


六、配置 systemd 服务管理 Gunicorn

1. 创建服务文件

sudo nano /etc/systemd/system/gunicorn.service

内容示例(根据你的项目名调整):

[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

[Service]
User=ubuntu          # 换成你的 Linux 用户
Group=www-data       # 或 root,根据需求
WorkingDirectory=/var/www/myproject
Environment="PATH=/var/www/myproject/venv/bin"
ExecStart=/var/www/myproject/venv/bin/gunicorn 
          --workers 4 
          --bind unix:/var/www/myproject/gunicorn.sock 
          myproject.wsgi:application

Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

这里使用 Unix Socket (gunicorn.sock) 与 Nginx 通信,更安全且性能更好。

2. 启用并启动服务

sudo systemctl daemon-reload
sudo systemctl enable gunicorn
sudo systemctl start gunicorn
sudo systemctl status gunicorn

确认状态为 active (running)。


七、配置 Nginx 作为反向X_X

1. 创建站点配置

sudo nano /etc/nginx/sites-available/example.com

内容示例:

server {
    listen 80;
    server_name example.com www.example.com;

    # 静态文件
    location /static/ {
        alias /var/www/myproject/staticfiles/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # 媒体文件(如有)
    location /media/ {
        alias /var/www/myproject/media/;
        expires 30d;
        add_header Cache-Control "public, max-age=600";
    }

    # 动态请求转发给 Gunicorn
    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/myproject/gunicorn.sock;
        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;
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

2. 启用站点并重启 Nginx

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default  # 如果不需要默认站点的 80 监听

sudo nginx -t
sudo systemctl reload nginx

此时访问 http://example.com 应该能正常看到 Django 页面。


八、HTTPS(可选但推荐)

使用 Let’s Encrypt + Certbot:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

按提示操作即可自动配置 HTTPS 并重定向 HTTP → HTTPS。

之后定期执行:

sudo certbot renew

九、常见检查点

  1. Gunicorn 日志
    journalctl -u gunicorn -f
  2. Nginx 错误日志
    sudo tail -f /var/log/nginx/error.log
  3. 权限问题
    确保 www-data 或对应用户对 staticfiles、media、日志目录有读写权限。
  4. 防火墙
    只开放 80/443,SSH 端口 22(如需要)。

如果你能提供:

  • 使用的数据库类型(MySQL/PostgreSQL/SQLite)
  • 是否有自定义静态/媒体目录
  • 是否已有域名和 SSL

我可以帮你写一份更贴合你项目的具体配置文件(settings.py、gunicorn.service、example.com 的 Nginx 配置)。