502 Bad Gateway

种一棵树最好的时间是十年前其次是现在

错误详情

请求/login居然出现了502错误。而我们的后端服务没有收到任何的报错日志。


让人非常的纠结,由于我的所有请求使用的是Nginx进行反向代理转发。于是进一步查看Niginx的错误日志。logs/erros.log找到对应的日志信息。

2023/10/27 09:00:13 [error] 12420#12344: *12 no live upstreams while connecting to upstream, 
client: 127.0.0.1, 
server: localhost, 
request: "POST /api/employee/login HTTP/1.1", 
upstream: "http://localhost/admin/employee/login", 
host: "localhost", 
referrer: "http://localhost/"

可以看到目标主机拒绝了我们的请求/login,这就让人更加纠结了,怎么会拒绝转发(无法转发)或者说能转发但没成功(超时或者被拦截等原因)。

错误排查

思前想后,没理由会拒绝啊。但是没办法第一次遇见,只能硬着头皮上了。

第一步

// 首先测试本机是否可以连通
// 本机ip获取,ipconfig -> ipv4
ping 127.0.0.1
ping localhost
ping 192.168.249.1

发现上面的没有问题,如果不放心,还可以设置host,再次测试(快捷设置host工具:SwitchHosts)

第二步
确定不是自己的问题后,再次查看Nginx配置文件,看看转发路径,端口等配置是否有误。config/nginx.conf找到并打开

...
http{
  upstream webservers{
	  server localhost:8080 weight=90 ;
	  #server 127.0.0.1:8088 weight=10 ;
	}

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html/sky;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # 反向代理,处理管理端发送的请求
        location /api/ {
			proxy_pass   http://localhost:8080/admin/;
            #proxy_pass   http://webservers/admin/;
        }
		
		# 反向代理,处理用户端发送的请求
        location /user/ {
            proxy_pass   http://webservers/user/;
        }
		
		# WebSocket
		location /ws/ {
            proxy_pass   http://webservers/ws/;
			proxy_http_version 1.1;
			proxy_read_timeout 3600s;
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection "$connection_upgrade";
        }
}
...

此处主要检查了server,查看端口和路径信息是否有问题,经过一番折腾,发现与前后端的约定一致,并没有问题。

第三步

由于我们使用Nginx做代理转发,

而检查端口又没有问题后,就试着查看端口是否被占用了

netstat -ano | findstr :8080


发现并没有多余的服务占用8080端口,事情就越发的奇怪了。几乎从 "前端-中间人-后端"都走了一遍了,还没有发现问题所在。这个再次查看项目启动日志,最大的乌龙就产生了


发现后端服务居然跑在8888端口,而配置中又写的8080,这里就立马意识到,自己项目中有两个独立的工程,端口正好对应8080和8888,运行岔了啊。到此,真相大白了,服务根本没在8080端口上,转发多少次,也无法成功获取响应啊。从而也就出现了502,网关错误。

总结

虽然这并不算真正意义上502,网关错误,但是经此一遭对502错误也有了一定理解,总结排错如下:

  1. 先确定后端服务是否可以正常响应请求。spring boot项目都有内置的Tomcat服务器,默认地址为:localhost:8080,启动项目直接访问该地址,没有出现"无法访问"等字样,都属于正常,404也算正常。说明服务端可以正常返回响应。
  2. 查看nginx配置文件,是否存在前后端口,地址信息错误。
  3. 查看端口是否被其他程序占用,命令:netstat -ano | findstr :端口号
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值