Nginx未转发请求至Django:前后端部署超时问题排查
解决Django后端请求超时问题
你的核心问题出在Nginx对Django路径的匹配规则误用,再加上Gunicorn配置里的一个小语法错误,我来一步步帮你搞定:
问题根源分析
- Nginx精确匹配的误用:你在Django的Nginx配置里用了
location = /、location = /static/这类带=的规则,=代表精确匹配——只有当请求路径和配置的路径完全一致时才会生效。比如:- 只有访问
ADDRESS:8800/时才会走Gunicorn代理 - 访问
ADDRESS:8800/suburl、ADDRESS:8800/media/xxx时,Nginx找不到对应的处理规则,就会一直等待直到超时
- 只有访问
- Gunicorn配置的语法错误:你的
ExecStart里-- bind多了一个空格,应该是--bind,这会导致Gunicorn无法正确绑定Unix socket,也是请求失败的潜在原因
修复步骤
1. 修正Django的Nginx配置
把带=的路径匹配(除了单个文件的favicon.ico)改成普通匹配,修改后的配置如下:
listen 8800; server_name ADDRESS; # 精确匹配单个favicon文件,这个可以保留= location = /favicon.ico { access_log off; log_not_found off; } # 匹配所有以/static/开头的请求,去掉= location /static/ { root /home/ubuntu/django/dbsystem; } # 匹配所有以/media/开头的请求,去掉= location /media/ { root /home/ubuntu/django/dbsystem; } # 匹配所有其他请求,转发到Gunicorn的socket,去掉= location / { include proxy_params; proxy_pass http://unix:/home/ubuntu/django/dbsystem/dbsystem.sock; }
2. 修正Gunicorn配置的语法错误
把-- bind改成--bind(去掉空格),修改后的Gunicorn配置:
[Unit] Description=gunicorn service After=network.target [Service] User=ubuntu Group=www-data WorkingDirectory=/home/ubuntu/django/dbsystem/ # 修正-- bind为--bind ExecStart=/home/ubuntu/django/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/django/dbsystem/dbsystem.sock dbsystem.wsgi:application [Install] WantedBy=multi-user.target
3. 重启服务使配置生效
执行以下命令重启Gunicorn和Nginx:
# 重启Gunicorn sudo systemctl restart gunicorn # 重启Nginx sudo systemctl restart nginx
验证与排查
完成上述修改后,你可以:
- 访问
ADDRESS:8800/suburl,应该能正常触发Django的路由处理 - 访问
ADDRESS:8800/media/xxx(替换成你实际的媒体文件路径),应该能正确加载文件
如果还是有问题,可以做以下排查: - 检查Gunicorn状态:
sudo systemctl status gunicorn,确认服务正常运行 - 检查Nginx配置语法:
sudo nginx -t,确保没有语法错误 - 查看Nginx错误日志:
sudo tail -f /var/log/nginx/error.log,查看是否有具体的错误提示
内容的提问来源于stack exchange,提问作者anthonyhvelazquez
相关产品推荐
相关产品推荐

