下面以 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.pymyproject/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
九、常见检查点
- Gunicorn 日志
journalctl -u gunicorn -f - Nginx 错误日志
sudo tail -f /var/log/nginx/error.log - 权限问题
确保www-data或对应用户对staticfiles、media、日志目录有读写权限。 - 防火墙
只开放 80/443,SSH 端口 22(如需要)。
如果你能提供:
- 使用的数据库类型(MySQL/PostgreSQL/SQLite)
- 是否有自定义静态/媒体目录
- 是否已有域名和 SSL
我可以帮你写一份更贴合你项目的具体配置文件(settings.py、gunicorn.service、example.com 的 Nginx 配置)。
PHPWP博客