ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Nginx+uWSGI部署Django项目404问题解决方案

Nginx+uWSGI部署Django项目404问题解决方案

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 --noinput

2.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进程有权限访问socket
  • max-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 nginx

3. 问题排查与解决方案

3.1 常见错误排查流程

当出现404 Not Found时,建议按以下顺序排查:

  1. 检查Nginx错误日志

    tail -f /var/log/nginx/error.log
  2. 验证uWSGI是否正常运行

    ps aux | grep uwsgi curl http://localhost:8001 # 测试uWSGI直接响应
  3. 检查socket文件权限

    ls -l /tmp/uwsgi.sock # 确保nginx用户有读写权限
  4. 验证静态文件路径

    ls -l /home/myproject/static/admin/ # 检查Django admin静态文件是否存在

3.2 典型问题解决方案

问题1:静态文件404

  • 现象:页面可以访问但CSS/JS加载失败
  • 解决方案:
    1. 确认STATIC_ROOT设置正确
    2. 检查Nginx配置中的alias路径是否完全匹配
    3. 确保执行了collectstatic命令

问题2:Django路由失效

  • 现象:所有页面都返回404
  • 解决方案:
    1. 检查uWSGI的chdir和module参数
    2. 确认wsgi.py文件位置正确
    3. 测试直接通过uWSGI运行项目

问题3:502 Bad Gateway

  • 现象:Nginx返回502错误
  • 解决方案:
    1. 检查uWSGI进程是否运行
    2. 确认socket端口一致
    3. 查看uWSGI日志中的错误信息

4. 性能优化与安全加固

4.1 性能调优建议

  1. uWSGI参数优化

    # 根据服务器配置调整 processes = 2 * CPU核心数 threads = 2 harakiri = 60 # 请求超时时间(秒)
  2. Nginx缓存优化

    location /static/ { alias /home/myproject/static/; expires 1y; add_header Cache-Control "public"; gzip_static on; }
  3. 启用HTTP/2

    listen 443 ssl http2;

4.2 安全配置要点

  1. 禁用服务器信息

    server_tokens off;
  2. SSL安全配置

    ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
  3. 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/endpoint

5.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

这种架构下需要特别注意:

  • 容器间的网络通信
  • 静态文件卷的挂载
  • 环境变量的传递
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进