Django + uWSGI 部署至 Ubuntu 完整指南
📋 部署架构
用户 → Nginx → uWSGI → Django
↓
静态文件
🔧 一、系统环境准备
1.1 安装 Ubuntu 22.04 Server
- 下载官方镜像(推荐国内镜像站)
- 制作启动盘(如 BalenaEtcher)
- 安装过程选择默认配置,开启 SSH 服务
1.2 基础系统配置
设置 root 密码
bash
sudo passwd root
su root
开启 root 远程登录(生产环境慎用)
bash
vim /etc/ssh/sshd_config
# 修改:PermitRootLogin yes
service sshd restart
配置固定 IP
bash
# 安装网络工具
sudo apt install net-tools
# 编辑网络配置
sudo vim /etc/netplan/00-installer-config.yaml
示例配置:
yaml
network:
ethernets:
ens33:
dhcp4: false
addresses: [192.168.1.100/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
version: 2
应用配置:
bash
sudo netplan apply
🚀 二、安装基础软件
2.1 系统更新
bash
sudo apt update
sudo apt upgrade -y
2.2 安装必要软件
bash
# SSH
sudo apt install ssh
# Python 相关
sudo apt install python3 python3-pip python3-venv
# 数据库(如需)
sudo apt install postgresql postgresql-contrib
# 缓存服务(如需)
sudo apt install redis-server
# Web 服务器
sudo apt install nginx
2.3 配置 pip 国内源
bash
mkdir ~/.pip
vim ~/.pip/pip.conf
内容:
ini
[global]
index-url=https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
🐍 三、Python 环境与 Django
3.1 创建虚拟环境
bash
cd /var/www
sudo mkdir myproject
cd myproject
python3 -m venv venv
source venv/bin/activate
3.2 安装 Django 及依赖
bash
pip install django==4.0.0
pip install uwsgi==2.0.20
pip install psycopg2-binary # PostgreSQL 驱动
pip install redis
3.3 创建 Django 项目
bash
django-admin startproject myproject .
python manage.py startapp myapp
3.4 配置 settings.py
python
DEBUG = False
ALLOWED_HOSTS = ['your-domain.com', 'your-server-ip', '*']
# 静态文件配置
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles/')
# 数据库配置(示例 PostgreSQL)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myproject',
'USER': 'postgres',
'PASSWORD': 'your-password',
'HOST': 'localhost',
'PORT': '5432',
}
}
3.5 数据库迁移与静态文件收集
bash
python manage.py migrate
python manage.py collectstatic --noinput
python manage.py createsuperuser
⚙️ 四、uWSGI 配置
4.1 安装 uWSGI 插件
bash
sudo apt install uwsgi-plugin-python3
4.2 创建 uWSGI 配置文件
在项目根目录创建 uwsgi.ini:
ini
[uwsgi]
# 使用 socket 与 nginx 通信
socket = 127.0.0.1:8001
# 项目目录
chdir = /var/www/myproject
# WSGI 文件
module = myproject.wsgi:application
# 进程配置
master = true
processes = 4
threads = 2
# 权限
uid = www-data
gid = www-data
# 日志
daemonize = /var/log/uwsgi.log
pidfile = /tmp/uwsgi.pid
# 插件
plugin = python3
# 性能优化
harakiri = 60
max-requests = 5000
vacuum = true
4.3 测试 uWSGI
bash
# 直接测试
uwsgi --http-socket :9000 --plugin python3 --wsgi-file myproject/wsgi.py
# 使用配置文件测试
uwsgi --ini uwsgi.ini
🌐 五、Nginx 配置
5.1 创建站点配置文件
bash
sudo vim /etc/nginx/sites-available/myproject
配置内容:
nginx
server {
listen 80;
server_name your-domain.com your-server-ip;
# 字符编码
charset utf-8;
# 客户端上传大小限制
client_max_body_size 75M;
# 静态文件处理
location /static/ {
alias /var/www/myproject/staticfiles/;
expires 30d;
add_header Cache-Control "public, immutable";
}
# 媒体文件处理
location /media/ {
alias /var/www/myproject/media/;
expires 30d;
}
# 主应用处理
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass 127.0.0.1:8001;
uwsgi_read_timeout 60;
uwsgi_send_timeout 60;
}
# 错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
5.2 启用站点
bash
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
🔄 六、服务管理
6.1 创建 uWSGI 系统服务
bash
sudo vim /etc/systemd/system/uwsgi.service
服务配置:
ini
[Unit]
Description=uWSGI Emperor Service
After=syslog.target
[Service]
User=www-data
Group=www-data
ExecStart=/usr/bin/uwsgi --ini /var/www/myproject/uwsgi.ini
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
StandardError=syslog
[Install]
WantedBy=multi-user.target
6.2 启动和管理服务
bash
# 重新加载 systemd
sudo systemctl daemon-reload
# 启动 uWSGI 服务
sudo systemctl start uwsgi
# 设置开机自启
sudo systemctl enable uwsgi
# 管理命令
sudo systemctl status uwsgi
sudo systemctl restart uwsgi
sudo systemctl stop uwsgi
🔍 七、部署验证
7.1 检查服务状态
bash
# 检查 uWSGI 进程
ps aux | grep uwsgi
# 检查 Nginx 状态
sudo systemctl status nginx
# 检查端口监听
sudo netstat -tlnp | grep :8001
7.2 测试网站访问
bash
# 本地测试
curl http://localhost
# 远程测试
curl http://your-domain.com
⚠️ 八、常见问题解决
8.1 uWSGI 插件问题
bash
# 如果出现 plugin 相关错误
sudo apt install uwsgi-plugin-python3
8.2 权限问题
bash
# 设置正确的文件权限
sudo chown -R www-data:www-data /var/www/myproject
sudo chmod -R 755 /var/www/myproject
8.3 Nginx 端口占用
bash
# 检查端口占用
sudo lsof -i :80
# 杀死占用进程
sudo kill -9 PID
8.4 静态文件 404
bash
# 重新收集静态文件
python manage.py collectstatic --noinput
# 检查 Nginx 配置中的路径
📊 九、性能优化
9.1 uWSGI 优化
ini
# 在 uwsgi.ini 中添加
enable-threads = true
single-interpreter = true
die-on-term = true
memory-report = true
lazy-apps = true
9.2 Nginx 优化
nginx
# 在 server 块中添加
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript;
🔒 十、安全配置
10.1 防火墙设置
bash
sudo ufw enable
sudo ufw allow 'Nginx Full'
sudo ufw allow ssh
10.2 HTTPS 配置(Let's Encrypt)
bash
# 安装 Certbot
sudo apt install certbot python3-certbot-nginx
# 获取证书
sudo certbot --nginx -d your-domain.com
📋 部署检查清单
- Ubuntu 系统安装完成
- 网络配置正确
- Python 虚拟环境创建
- Django 项目配置完成
- 数据库迁移完成
- 静态文件收集完成
- uWSGI 配置正确
- Nginx 配置正确
- 服务自启动设置完成
- 防火墙配置完成
- HTTPS 证书配置(如需要)
- 日志轮转配置完成
- 备份策略制定
🎯 总结
通过以上步骤,你可以在 Ubuntu 22.04 上成功部署 Django + uWSGI + Nginx 的生产环境。关键点包括:
- 环境隔离:使用 Python 虚拟环境
- 进程管理:uWSGI 处理 Django 应用
- Web 服务:Nginx 处理静态文件和反向代理
- 服务管理:systemd 管理服务自启动
- 安全配置 :防火墙和 HTTPS 保护
记得定期检查日志、更新系统和备份数据,确保服务的稳定运行。
以上内容由AI生成,仅供参考和借鉴