1. 环境准备:从零搭建Ubuntu 20.04服务器
第一次部署Django项目时,我踩过的第一个坑就是服务器环境配置。Ubuntu 20.04虽然预装了Python 3.8,但直接使用系统自带的Python可能会导致后续依赖冲突。这里推荐用pyenv管理多版本Python环境,实测能避开90%的依赖问题。
先更新系统基础包:
sudo apt update && sudo apt upgrade -y sudo apt install -y make build-essential libssl-dev zlib1g-dev \ libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \ libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev安装pyenv(不要用root用户操作):
curl https://pyenv.run | bash echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init -)"' >> ~/.bashrc exec $SHELL安装特定Python版本(以3.8.12为例):
pyenv install 3.8.12 pyenv global 3.8.12验证安装:
python -V # 应显示Python 3.8.12 pip -V # 应显示对应pip版本提示:如果遇到SSL相关错误,可能是系统OpenSSL版本不兼容,可尝试
PYTHON_CONFIGURE_OPTS="--with-openssl=/usr/include/openssl" pyenv install 3.8.12
2. 项目依赖与虚拟环境配置
很多教程会推荐直接全局安装依赖,但实际项目中这会导致严重的环境污染。我的血泪教训是:必须为每个项目创建独立虚拟环境!
创建项目目录并初始化虚拟环境:
mkdir ~/myproject && cd ~/myproject python -m venv venv source venv/bin/activate安装基础依赖(注意版本号):
pip install django==4.2 uwsgi==2.0.21这里有个隐藏大坑:uWSGI必须用pip安装,如果用apt安装会出现Python插件缺失。我曾因此浪费三小时排查502错误。
验证uWSGI是否正常:
uwsgi --version # 应显示2.0.21项目依赖建议保存到requirements.txt:
pip freeze > requirements.txt3. Nginx配置的七个关键细节
Nginx配置不当会导致静态文件404、API请求超时等问题。这是我的生产级配置模板:
server { listen 80; server_name yourdomain.com; # 静态文件配置(必须放在location / 前面!) location /static/ { alias /home/user/myproject/static/; expires 30d; access_log off; } # 媒体文件配置 location /media/ { alias /home/user/myproject/media/; expires 7d; } # 主应用配置 location / { include uwsgi_params; uwsgi_pass unix:///tmp/myproject.sock; uwsgi_read_timeout 300s; # 解决413 Request Entity Too Large client_max_body_size 100M; # 重要头信息传递 uwsgi_param Host $host; uwsgi_param X-Real-IP $remote_addr; uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for; } # 禁止访问.git等隐藏文件 location ~ /\. { deny all; } }关键注意事项:
- 静态文件alias路径必须以
/结尾 - uWSGI socket文件权限要设为www-data用户可读写
- 超时时间根据业务需求调整,API接口建议300秒以上
- 生产环境务必配置SSL证书
4. uWSGI的魔鬼细节配置
uWSGI的配置直接影响服务稳定性。这是我的优化配置(uwsgi.ini):
[uwsgi] chdir = /home/user/myproject module = myproject.wsgi:application # 使用unix socket比TCP性能更好 socket = /tmp/myproject.sock chmod-socket = 666 vacuum = true # 进程数 = CPU核心数*2+1 processes = 5 threads = 2 # 优雅的重启配置 max-requests = 1000 harakiri = 30 reload-on-as = 512 reload-on-rss = 256 # 日志记录 daemonize = /var/log/uwsgi/myproject.log disable-logging = true常见问题解决方案:
- socket权限问题:执行
sudo chown www-data:www-data /tmp/myproject.sock - 内存泄漏:设置
max-requests定期重启worker - Django静态文件收集:先执行
python manage.py collectstatic
5. 部署后的必备调优
部署完成后还有几个关键检查点:
- 防火墙配置:
sudo ufw allow 80 sudo ufw allow 443 sudo ufw enable- 服务自启动(使用systemd): 创建
/etc/systemd/system/myproject.service:
[Unit] Description=MyProject uWSGI Service After=network.target [Service] User=user Group=www-data WorkingDirectory=/home/user/myproject Environment="PATH=/home/user/myproject/venv/bin" ExecStart=/home/user/myproject/venv/bin/uwsgi --ini uwsgi.ini [Install] WantedBy=multi-user.target启用服务:
sudo systemctl daemon-reload sudo systemctl start myproject sudo systemctl enable myproject- 性能监控: 安装
uwsgitop实时监控:
pip install uwsgitop uwsgitop /tmp/myproject.sock6. 故障排查指南
当出现502错误时,按这个顺序排查:
- 检查uWSGI日志:
tail -f /var/log/uwsgi/myproject.log - 检查Nginx错误日志:
tail -f /var/log/nginx/error.log - 手动启动uWSGI测试:
uwsgi --ini uwsgi.ini --http :8000 - 检查socket文件权限:
ls -l /tmp/myproject.sock
数据库连接问题特别常见,在settings.py中增加:
DATABASES = { 'default': { 'CONN_MAX_AGE': 600, # 连接池保持时间 'OPTIONS': { 'connect_timeout': 5, # 连接超时设置 } } }7. 安全加固措施
生产环境必须做的安全配置:
- 关闭DEBUG模式:
DEBUG = False ALLOWED_HOSTS = ['yourdomain.com', 'IP地址']- 配置CSRF_TRUSTED_ORIGINS:
CSRF_TRUSTED_ORIGINS = ['https://yourdomain.com']- 自动备份方案(每日凌晨执行):
# 备份数据库 pg_dump -U username dbname > db_backup.sql # 备份代码和媒体文件 tar -czvf project_backup_$(date +%F).tar.gz /home/user/myproject这套配置经过多个百万PV项目验证,最久稳定运行超过400天。记得定期更新依赖包版本,我习惯每月第一个周一执行pip list --outdated检查更新。