You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx返回502错误求助:Django应用反向代理异常排查

问题:CentOS 8上Nginx反向代理Django出现502 Bad Gateway

我在CentOS 8服务器部署了Django Web应用,希望通过Nginx反向代理实现80端口访问。目前Django应用运行在8000端口,本地执行curl http://127.0.0.1:8000和curl http://0.0.0.0:8000均可正常获取应用HTML页面,但执行curl http://0.0.0.0和curl http://127.0.0.1时返回Nginx 502 Bad Gateway页面。Nginx日志无错误信息,nginx -T显示配置已成功加载。

我的Nginx配置如下:

events {
    worker_connections 1024;
}

http {
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

        access_log  /var/log/nginx/access.log  main;
        error_log   /var/log/nginx/error.log;

        sendfile            on;
        tcp_nopush          on;
        tcp_nodelay         on;
        keepalive_timeout   65;
        types_hash_max_size 2048;

        include             /etc/nginx/mime.types;
        default_type        application/octet-stream;

        server_tokens               off;
        server {
            listen 80;
            server_name $hostname; # 试过改为下划线也无效

            location / {
                proxy_pass http://0.0.0.0:8000; # 也试过用127.0.0.1
                proxy_set_header Host $host;
            }
        }
}

我尝试过修改server_name为下划线,但问题依旧,请问该从哪些方面排查?


排查方向:

  • 确认Django的监听地址:执行ss -tulpn | grep 8000查看Django实际绑定的IP。如果输出仅显示127.0.0.1:8000,说明Django只监听回环地址,此时Nginx用0.0.0.0:8000代理会失败,需将proxy_pass改为http://127.0.0.1:8000,同时确保Django启动命令添加--bind 0.0.0.0:8000。
  • 检查SELinux限制:CentOS 8默认开启SELinux,可能阻止Nginx连接后端端口。执行getenforce查看状态,若为Enforcing,临时关闭测试:setenforce 0。如果问题解决,执行setsebool -P httpd_can_network_connect on添加永久规则。
  • 验证防火墙规则:临时停止防火墙测试:systemctl stop firewalld,若恢复正常,需确认防火墙是否允许Nginx访问回环端口8000(回环通常默认允许,但可通过firewall-cmd --list-all检查)。
  • 优化Nginx代理配置:
    • 将server_name改为_;以匹配所有请求主机名,或明确指定server_name 127.0.0.1 localhost;
    • 添加必要的代理请求头,避免Django因请求头缺失拒绝连接:
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      
  • 检查Django服务日志:查看Django的日志文件,确认是否收到Nginx的代理请求,排查是否有应用层的错误拦截。
  • 确认端口占用:执行ss -tulpn | grep :80,确保80端口仅由Nginx监听,无其他进程占用导致Nginx未正常处理请求。

内容的提问来源于stack exchange,提问作者George Sferopoulos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:36:00