个人情况,仅供参考,如果跟你的项目不适用,请勿恶言。
项目是采用前后端分离的模式,其中的路由关系为Nginx A为对外暴露host地址,对于App的所有请求都直接通过server走到路由挂NginxB。
路由关系为:手机App→请求(例:www.test.cn:8072/xy-app-web/index.html)→Nginx A→Nginx B
Nginx A路由到Nginx B的server配置为如下路径:
server {
listen 8090;
# listen 192.25.106.214:8090;
server_name 192.25.106.214;
location /xy-app-web {
proxy_pass http://192.25.106.214:8090/xy-app-web;
proxy_set_header Host $host:8090;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Via "nginx";
}
location / {
root html;
index index.html index.htm;
}
}
突然发现项目出现问题,访问接口报错,查看Nginx A的日志发现错误如下:
2019/01/29 16:29:48 [error] 20969#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.25.103.53, server: 192.25.106.214, request: "GET /xy-app-web/portfolio/piazza?rettype=appjson&opstation=Y_IHADPLAZA_12222222222_e9dfdb288326f0371d091ea8bd64b2f55b7906ff77b68db98ae99bafe0cf9896_07AE3442-1E72-4346-A58B-6EE511202F01_30901_3.9.0.11&logintoken=b6459d2e-1e85-489a-94e9-57d2059cba69&userId=5d395883d13573b189da524ce1401834×tamp=1548750589604&client=3&device=appweb&version=appweb&clientId=appweb&sign=8E6CFC226DBCF7DBD01A68A987363427 HTTP/1.0", upstream: "http://192.25.106.214:8090/xy-app-web/portfolio/piazza?rettype=appjson&opstation=Y_IHADPLAZA_12222222222_e9dfdb288326f0371d091ea8bd64b2f55b7906ff77b68db98ae99bafe0cf9896_07AE3442-1E72-4346-A58B-6EE511202F01_30901_3.9.0.11&logintoken=b6459d2e-1e85-489a-94e9-57d2059cba69&userId=5d395883d13573b189da524ce1401834×tamp=1548750589604&client=3&device=appweb&version=appweb&clientId=appweb&sign=8E6CFC226DBCF7DBD01A68A987363427", host: "www.xyzqts.cn:8072", referrer: "http://www.test.cn:8072/app-web/index.html"
网上搜索了半天都是什么shit一样的抄袭文章,什么PHP的问题。我们项目没有PHP,connect() failed (111:Connection refused) while connecting to upstream的原因就是网络连接建立失败了,就开始从报错的地方开始查调用链路问题,这里我们是从Nginx A服务器telent Nginx B的网络调用链路中,发现8090端口没有提供服务。方法很简单就是telent。
图片为telnet正确的情况应该是这样的:
那么问题就很明显了,看一下8090端口是哪个服务提供的,说明该服务异常了,查看一下进程是否还在。
ps -ef|grep java
发现不知道什么时候,8090端口的xy-app-web没了。
我们这里是用的SpringBoot,启动它。
nohup java -jar -Dlogging.path=./logs xy-app-web-0.0.2.jar --spring.profiles.active=test &
再查看一下进程 : ps -ef|grep java 发现8090端口的xy-app-web已经有了。重新用手机App发起调用,发现问题解决了。