首页 / 资讯中心 / 文章详情

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

Nginx+uWSGI部署Django项目404问题解决方案 ★ FEATURED ARTICLE
1. 问题现象与背景分析当你在生产环境中使用NginxuWSGI部署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-socket664确保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命令问题2Django路由失效现象所有页面都返回404解决方案检查uWSGI的chdir和module参数确认wsgi.py文件位置正确测试直接通过uWSGI运行项目问题3502 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/2listen 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 DENY5. 高级调试技巧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|5025.3 压力测试方法使用ab工具进行基准测试ab -n 1000 -c 100 http://localhost/关键指标分析Requests per secondTime per requestFailed requests6. 容器化部署方案可选对于现代部署环境可以考虑使用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_MODULEmyproject.settings.prod这种架构下需要特别注意容器间的网络通信静态文件卷的挂载环境变量的传递
阅读完成 · 觉得有帮助?
咨询建站