1. 问题现象与背景分析
当你在生产环境中使用Nginx+uWSGI部署Django项目时,最常遇到的报错之一就是"Not Found The requested resource was not found on this server"。这个错误通常发生在服务架构各组件间的衔接环节,涉及Nginx配置、uWSGI参数、Django静态文件处理等多个技术点。
我在实际运维工作中处理过数十例此类问题,发现90%的情况都源于三类配置错误:
- Nginx的location规则与uWSGI的socket端口不匹配
- Django的ALLOWED_HOSTS和DEBUG设置不符合生产环境要求
- 静态文件收集路径与Nginx配置的alias路径不一致
2. 完整解决方案实施步骤
2.1 环境检查与准备
首先确认基础环境符合要求:
# 检查Python版本 python3 --version # 需要3.6+ # 检查Nginx状态 systemctl status nginx # 检查uWSGI可执行路径 which uwsgi建议创建专用项目目录结构:
/home/myproject/ ├── django_project/ # Django项目目录 │ ├── manage.py │ └── django_project/ ├── static/ # 静态文件收集目录 ├── media/ # 用户上传文件目录 └── uwsgi.ini # uWSGI配置文件2.2 Django项目配置关键点
修改settings.py时需要特别注意:
# 必须设置允许的域名 ALLOWED_HOSTS = ['yourdomain.com', 'localhost'] # 生产环境必须关闭DEBUG DEBUG = False # 静态文件配置 STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, '../static') # 上级目录的static文件夹 # 媒体文件配置 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, '../media')执行静态文件收集命令:
python manage.py collectstatic --noinput2.3 uWSGI深度配置
创建uwsgi.ini配置文件时应包含以下核心参数:
[uwsgi] chdir = /home/myproject/django_project module = django_project.wsgi:application master = true processes = 4 threads = 2 socket = 127.0.0.1:8001 chmod-socket = 664 vacuum = true die-on-term = true max-requests = 1000 # 日志配置 daemonize = /var/log/uwsgi/myproject.log disable-logging = true关键参数说明:
chmod-socket=664确保Nginx进程有权限访问socketmax-requests定期重启worker防止内存泄漏- 生产环境建议禁用uWSGI的access log以提升性能
2.4 Nginx精准配置
/etc/nginx/sites-available/myproject.conf 典型配置:
upstream django { server 127.0.0.1:8001; } server { listen 80; server_name yourdomain.com; location /static/ { alias /home/myproject/static/; expires 30d; access_log off; } location /media/ { alias /home/myproject/media/; expires 30d; access_log off; } location / { uwsgi_pass django; include /etc/nginx/uwsgi_params; uwsgi_read_timeout 300s; # 解决大文件上传问题 client_max_body_size 100M; # 解决代理头信息丢失 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; } }配置完成后执行:
sudo nginx -t # 测试配置 sudo systemctl restart nginx3. 问题排查与解决方案
3.1 常见错误排查流程
当出现404 Not Found时,建议按以下顺序排查:
检查Nginx错误日志
tail -f /var/log/nginx/error.log验证uWSGI是否正常运行
ps aux | grep uwsgi curl http://localhost:8001 # 测试uWSGI直接响应检查socket文件权限
ls -l /tmp/uwsgi.sock # 确保nginx用户有读写权限验证静态文件路径
ls -l /home/myproject/static/admin/ # 检查Django admin静态文件是否存在
3.2 典型问题解决方案
问题1:静态文件404
- 现象:页面可以访问但CSS/JS加载失败
- 解决方案:
- 确认STATIC_ROOT设置正确
- 检查Nginx配置中的alias路径是否完全匹配
- 确保执行了collectstatic命令
问题2:Django路由失效
- 现象:所有页面都返回404
- 解决方案:
- 检查uWSGI的chdir和module参数
- 确认wsgi.py文件位置正确
- 测试直接通过uWSGI运行项目
问题3:502 Bad Gateway
- 现象:Nginx返回502错误
- 解决方案:
- 检查uWSGI进程是否运行
- 确认socket端口一致
- 查看uWSGI日志中的错误信息
4. 性能优化与安全加固
4.1 性能调优建议
uWSGI参数优化
# 根据服务器配置调整 processes = 2 * CPU核心数 threads = 2 harakiri = 60 # 请求超时时间(秒)Nginx缓存优化
location /static/ { alias /home/myproject/static/; expires 1y; add_header Cache-Control "public"; gzip_static on; }启用HTTP/2
listen 443 ssl http2;
4.2 安全配置要点
禁用服务器信息
server_tokens off;SSL安全配置
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';Django安全设置
SECURE_HSTS_SECONDS = 31536000 SECURE_CONTENT_TYPE_NOSNIFF = True X_FRAME_OPTIONS = 'DENY'
5. 高级调试技巧
5.1 使用curl进行接口测试
# 测试静态文件 curl -I http://localhost/static/admin/css/base.css # 测试动态请求 curl -X GET http://localhost/api/endpoint5.2 实时日志监控方案
创建日志监控脚本:
#!/bin/bash tail -f /var/log/nginx/access.log \ /var/log/nginx/error.log \ /var/log/uwsgi/myproject.log \ | grep -E '404|500|502'5.3 压力测试方法
使用ab工具进行基准测试:
ab -n 1000 -c 100 http://localhost/关键指标分析:
- Requests per second
- Time per request
- Failed requests
6. 容器化部署方案(可选)
对于现代部署环境,可以考虑使用Docker编排:
docker-compose.yml示例:
version: '3' services: web: image: nginx:alpine ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf - ./static:/static depends_on: - app app: build: . command: uwsgi --ini uwsgi.ini volumes: - .:/code environment: - DJANGO_SETTINGS_MODULE=myproject.settings.prod这种架构下需要特别注意:
- 容器间的网络通信
- 静态文件卷的挂载
- 环境变量的传递