在 Ubuntu 服务器上配置 Python + Django 网站环境,通常采用 Nginx + Gunicorn + Supervisor 的经典生产级架构。这种组合性能稳定、资源占用低且易于维护。
以下是完整的配置步骤指南:
1. 系统更新与基础依赖安装
首先更新软件源并安装必要的工具包(Python3, pip, Nginx, 编译工具等)。
sudo apt update && sudo apt upgrade -y
# 安装 Python3, pip, 虚拟环境工具,以及编译依赖
sudo apt install python3-pip python3-venv python3-dev nginx supervisor git libpq-dev build-essential -y
# 验证安装版本
python3 --version
pip3 --version
nginx -v
2. 创建项目目录与虚拟环境
建议将项目部署在 /var/www/ 目录下,并使用虚拟环境隔离依赖。
# 创建项目目录
sudo mkdir -p /var/www/myproject
cd /var/www/myproject
# 创建 Python 虚拟环境
python3 -m venv venv
# 激活虚拟环境
source venv/bin/activate
# 升级 pip 并安装 Django (假设使用最新稳定版)
pip install --upgrade pip
pip install django gunicorn psycopg2-binary # psycopg2-binary 用于连接 PostgreSQL
注意:如果你的数据库是 MySQL,请安装
mysqlclient;如果是 SQLite,则无需额外安装驱动。
3. 编写 Django 项目代码
这里以创建一个简单的测试项目为例(如果你已有代码,可跳过此步直接上传):
django-admin startproject mysite .
python manage.py migrate
python manage.py createsuperuser
关键配置:修改 mysite/settings.py,允许本地访问:
ALLOWED_HOSTS = ['your_server_ip', 'localhost', '127.0.0.1']
# 如果使用了域名,记得把域名也加进去
4. 配置 Gunicorn (WSGI 服务器)
Gunicorn 负责将 Django 应用运行起来,供 Nginx 转发请求。
在项目根目录创建配置文件 gunicorn.conf.py:
nano gunicorn.conf.py
填入以下内容(根据实际路径调整):
bind = "127.0.0.1:8000" # 监听本地端口,不直接暴露给公网
workers = 4 # 工作进程数,通常为 CPU 核心数的 2-4 倍
worker_class = 'sync' # 默认同步模式
timeout = 120 # 超时时间
accesslog = "-" # 标准输出日志
errorlog = "-" # 标准错误日志
capture_output = True
5. 配置 Supervisor (进程管理)
Supervisor 用于确保 Gunicorn 服务在服务器重启后自动运行,并在崩溃时自动重启。
创建配置文件:
sudo nano /etc/supervisor/conf.d/django-app.conf
内容如下:
[program:django-app]
command=/var/www/myproject/venv/bin/gunicorn mysite.wsgi:application -c /var/www/myproject/gunicorn.conf.py
directory=/var/www/myproject
user=www-data
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/supervisor/django-app.log
environment=DJANGO_SETTINGS_MODULE="mysite.settings"
注意:user=www-data 是为了让 Nginx 能读取文件权限。如果报错权限问题,可能需要先修改目录所有者。
启动并加载配置:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start django-app
sudo supervisorctl status
6. 配置 Nginx (反向X_X)
Nginx 作为 Web 服务器接收用户请求,并将其转发给 Gunicorn。
编辑 Nginx 站点配置:
sudo nano /etc/nginx/sites-available/default
替换原有内容为(务必将 your_domain.com 和 your_server_ip 替换为实际值):
server {
listen 80;
server_name your_domain.com your_server_ip;
location /static/ {
alias /var/www/myproject/staticfiles/;
}
location /media/ {
alias /var/www/myproject/media/;
}
location / {
proxy_pass http://127.0.0.1:8000;
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;
}
}
收集静态文件(Django 必须先将静态文件收集到指定目录):
# 确保 static 目录存在
mkdir -p /var/www/myproject/staticfiles
# 收集静态文件
python manage.py collectstatic --noinput
测试并重启 Nginx:
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl enable nginx
7. 设置目录权限
确保 Nginx 用户 (www-data) 有权读取项目文件和写入日志。
# 赋予 www-data 对项目的读取执行权限
sudo chown -R www-data:www-data /var/www/myproject
sudo chmod -R 755 /var/www/myproject
# 如果使用了 SQLite 或 Media 目录需要写入权限
sudo chown -R www-data:www-data /var/www/myproject/db.sqlite3
sudo chown -R www-data:www-data /var/www/myproject/media
8. 防火墙与安全 (UFW)
开放必要端口(80 HTTP, 443 HTTPS),关闭其他端口。
sudo ufw allow 'Nginx Full'
sudo ufw allow OpenSSH
sudo ufw enable
9. 进阶:配置 SSL (HTTPS)
生产环境强烈建议使用 HTTPS。推荐使用 Certbot 免费申请 Let’s Encrypt 证书。
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d your_domain.com
Certbot 会自动修改 Nginx 配置并开启 HTTPS,每 90 天自动续期。
常见问题排查
- 502 Bad Gateway:通常是因为 Gunicorn 没启动或端口不对。检查
supervisorctl status和gunicorn.conf.py中的bind地址。 - Permission Denied:通常是
chown权限设置错误,或者settings.py中DEBUG=True导致无法访问静态文件。生产环境请确保DEBUG=False。 - 数据库连接失败:检查
settings.py中的DATABASES配置,确保用户名、密码正确,且数据库服务已启动。
至此,你的 Ubuntu 服务器已经具备了高可用的 Python + Django 生产环境。
云知识CLOUD