在 Ubuntu 服务器上配置 Python + Django 网站环境,通常采用 Nginx + Gunicorn + Systemd 的生产级架构。这种组合性能稳定、易于维护且安全性高。
以下是详细的操作步骤(以 Ubuntu 22.04/24.04 为例):
1. 系统更新与基础依赖安装
首先更新软件源并安装必要的工具包。
sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip python3-venv nginx curl git -y
2. 创建项目目录与虚拟环境
为了避免污染系统全局 Python 环境,建议为每个项目创建独立的虚拟环境。
# 创建项目目录
sudo mkdir -p /var/www/myproject
cd /var/www/myproject
# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate
# 升级 pip 并安装 Django (假设版本为 5.x)
pip install --upgrade pip
pip install django gunicorn psycopg2-binary # 如果数据库是 PostgreSQL,需安装 psycopg2;MySQL 则用 mysqlclient
注意:
psycopg2-binary仅用于开发或快速部署,生产环境建议使用psycopg2配合系统库编译。
3. 初始化 Django 项目
在虚拟环境中创建 Django 项目。
django-admin startproject myproject .
# 注意最后的点 "." 表示在当前目录创建项目,而不是在子目录
配置 settings.py
编辑 myproject/settings.py 文件 (nano settings.py):
-
允许跨域域名:将你的服务器 IP 或域名添加到
ALLOWED_HOSTS。ALLOWED_HOSTS = ['your_domain.com', 'www.your_domain.com', 'YOUR_SERVER_IP'] -
数据库配置:根据你的数据库类型配置
DATABASES。 -
静态文件配置:确保
STATIC_ROOT指向一个绝对路径。import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # 如果是生产环境,建议关闭调试模式 DEBUG = False -
收集静态文件:
python manage.py collectstatic -
迁移数据库并创建超级用户:
python manage.py migrate python manage.py createsuperuser
4. 启动 Gunicorn 测试服务
在正式配置 Nginx 之前,先手动启动 Gunicorn 验证配置是否正确。
gunicorn myproject.wsgi:application --bind 127.0.0.1:8000
--bind 127.0.0.1:8000表示监听本地端口 8000(Nginx 将通过此端口转发请求)。- 如果看到
Starting gunicorn...且无报错,说明配置成功。按Ctrl+C停止它。
5. 配置 Systemd 服务
为了让 Gunicorn 在后台运行并在开机时自动启动,需要创建一个 systemd 服务文件。
sudo nano /etc/systemd/system/gunicorn.service
写入以下内容(请根据实际情况修改路径和用户名):
[Unit]
Description=gunicorn daemon for myproject
After=network.target
[Service]
User=ubuntu # 替换为你的服务器登录用户名
Group=www-data # 替换为 www-data 或 root
WorkingDirectory=/var/www/myproject
ExecStart=/var/www/myproject/venv/bin/gunicorn
--access-logfile -
--workers 3
--bind unix:/var/www/myproject/gunicorn.sock
myproject.wsgi:application
[Install]
WantedBy=multi-user.target
保存后,启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable gunicorn
sudo systemctl start gunicorn
sudo systemctl status gunicorn
6. 配置 Nginx 反向X_X
Nginx 负责接收外部 HTTP 请求并将其转发给 Gunicorn。
sudo nano /etc/nginx/sites-available/myproject
写入以下配置:
server {
listen 80;
server_name your_domain.com www.your_domain.com;
location = /favicon.ico { access_log off; log_not_found off; }
# 处理静态文件 (可选,Gunicorn 不处理 static,由 Nginx 直接提供)
location /static/ {
alias /var/www/myproject/staticfiles/;
}
location / {
include proxy_params;
proxy_pass http://unix:/var/www/myproject/gunicorn.sock;
}
}
启用站点并重启 Nginx:
# 创建软链接启用站点
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
# 移除默认站点(防止冲突)
sudo rm /etc/nginx/sites-enabled/default
# 测试配置
sudo nginx -t
# 重载 Nginx
sudo systemctl restart nginx
7. 配置防火墙与 SSL (HTTPS)
Ubuntu 默认可能未开启防火墙,且生产环境强烈建议使用 HTTPS。
开放防火墙
sudo ufw allow 'Nginx Full'
sudo ufw allow OpenSSH
sudo ufw enable
申请 SSL 证书 (Let’s Encrypt)
安装 Certbot:
sudo apt install certbot python3-certbot-nginx -y
申请证书(替换域名):
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
Certbot 会自动修改 Nginx 配置并设置自动续期。
8. 常见问题排查
- 权限问题:如果 Nginx 无法读取静态文件或日志,检查
/var/www/myproject的属主是否为当前用户。sudo chown -R ubuntu:www-data /var/www/myproject sudo chmod -R 755 /var/www/myproject - 数据库连接失败:确保
settings.py中的数据库密码正确,且数据库服务(如 PostgreSQL/MySQL)已启动并允许远程或本地 socket 连接。 - 查看日志:
- Gunicorn 日志:通常在
/var/log/gunicorn.log或通过journalctl -u gunicorn查看。 - Nginx 错误日志:
/var/log/nginx/error.log。
- Gunicorn 日志:通常在
完成以上步骤后,访问 https://your_domain.com 即可看到你的 Django 网站。
CLOUD技术博