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
相关产品推荐
相关产品推荐

