种一棵树最好的时间是十年前其次是现在
错误详情
请求/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错误也有了一定理解,总结排错如下:
- 先确定后端服务是否可以正常响应请求。spring boot项目都有内置的Tomcat服务器,默认地址为:localhost:8080,启动项目直接访问该地址,没有出现"无法访问"等字样,都属于正常,404也算正常。说明服务端可以正常返回响应。
- 查看nginx配置文件,是否存在前后端口,地址信息错误。
- 查看端口是否被其他程序占用,命令:
netstat -ano | findstr :端口号