记一次生产环境大面积404问题!

发布到线上的接口服务一直好端端的,今天突然运营反馈说很多功能无法正常使用。经过排查,发现前端调用后端接口时,部分接口出现404的现象。今天,我到公司比较晚,肯定是哪个小伙伴昨晚下班,走出办公室前没有祈祷服务器不要出问题。要把这个人揪出来,吊在服务器上——祭天!

文章已收录到:

https://github.com/sunshinelyz/technology-binghe

https://gitee.com/binghe001/technology-binghe

问题复现

得知运营的反馈后,我迅速登录服务器排查问题。首先,查看了接口服务的启动进程正常。验证接口服务的ip和端口是否正常,结果也是没啥问题。接下来,通过Nginx转发请求,此时出现了问题,无法访问接口。同时Nginx的access.log文件中输出了如下日志信息。

192.168.175.120 - - [26/Feb/2021:21:34:21 +0800] "GET /third/system/base/thirdapp/get_detail HTTP/1.1" 404 0 "http://192.168.175.100/api/index.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0" 192.168.175.120 - - [26/Feb/2021:21:34:22 +0800] "GET /third/system/base/thirdapp/get_detail HTTP/1.1" 404 0 "http://192.168.175.100/api/index.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0" 192.168.175.120 - - [26/Feb/2021:21:34:26 +0800] "GET /third/system/base/thirdapp/get_detail HTTP/1.1" 404 0 "http://192.168.175.100/api/index.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0"

此时,从Nginx日志中发现,输出的状态为404,未找到后端的接口服务。为了进一步定位问题,我直接在线上环境通过curl命令的方式来访问接口服务,结果是正常的。

经过这一系列的操作之后,我们就可以确定问题是出在Nginx上了。

问题分析 Nginx开启debug模块

既然已经定位到问题了,那我们接下来就要分析下产生问题的具体原因了。既然是Nginx的问题,我第一时间想到的就是调试Nginx查找错误原因。于是我在服务器命令行输入了如下命令来查看安装Nginx时的配置情况。

nginx -V

注意:这里已经为Nginx配置了系统环境变量,如果没有配置系统环境变量,则需要输入nginx命令所在目录的完整路径,例如:

/usr/local/nginx/sbin/nginx -v

命令行输出了如下信息。

configure arguments: --prefix=http://www.likecs.com/usr/local/nginx --with-http_stub_status_module --add-module=http://www.likecs.com/usr/local/src/fastdfs/fastdfs-nginx-module-1.22/src --with-openssl=http://www.likecs.com/usr/local/src/openssl-1.0.2s --with-pcre=http://www.likecs.com/usr/local/src/pcre-8.43 --with-zlib=http://www.likecs.com/usr/local/src/zlib-1.2.11 --with-http_ssl_module

可以看到,安装Nginx时没有配置Nginx的debug模块。

于是我在服务器上找到了Nginx的安装文件,在命令行输入如下命令重新编译Nginx。

cd /usr/local/src/nginx/ #进入Nginx的安装文件根目录 make clean #清除编译信息 ./configuration --prefix=http://www.likecs.com/usr/local/nginx-1.17.8 --with-http_stub_status_module --add-module=http://www.likecs.com/usr/local/src/fastdfs/fastdfs-nginx-module-1.22/src --with-openssl=http://www.likecs.com/usr/local/src/openssl-1.0.2s --with-pcre=http://www.likecs.com/usr/local/src/pcre-8.43 --with-zlib=http://www.likecs.com/usr/local/src/zlib-1.2.11 --with-http_ssl_module --with-debug #设置编译Nginx的配置信息 make #编译Nginx,切记不要输入make install

上述命令中,切记不要输入make install 进行安装。

执行完 make 命令后,会在当前目录的objs目录下生成nginx命令,此时我们需要先停止Nginx服务,备份/usr/local/nginx/sbin/目录下的nginx命令,然后将objs目录下的nginx命令复制到/usr/local/nginx/sbin/目录下,然后启动Nginx服务。

nginx_service.sh stop #通过脚本停止Nginx服务 mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak #备份原有nginx命令 cp ./objs/nginx /usr/local/nginx/sbin/nginx #复制nginx命令 nginx_service.sh start #通过脚本启动Nginx服务

注意:这里,在停止Nginx服务前,已经将此Nginx从接入层网关中移除了,所以不会影响线上环境。为了避免使用新编译的nginx命令重启Nginx出现问题,这里通过脚本先停止Nginx服务,然后复制nginx命令后,再启动Nginx服务。

配置Nginx输出debug日志

在Nginx的nginx.conf文件中配置如下信息。

error_log logs/error.log debug;

此时,开启了Nginx的debug日志功能,并将debug信息输出到error.log文件中。

分析问题

接下来,在服务器命令行输入如下命令监听error.log文件的输出日志。

tail -F /usr/local/nginx/logs/error.log

然后模拟访问http接口,可以看到error.log文件中输出如下信息。

2021/02/26 21:34:26 [debug] 31486#0: *56 http request line: "GET /third/system/base/thirdapp/get_detail HTTP/1.1" 2021/02/26 21:34:26 [debug] 31486#0: *56 http uri: "/third/system/base/thirdapp/get_detail" 2021/02/26 21:34:26 [debug] 31486#0: *56 http args: "" 2021/02/26 21:34:26 [debug] 31486#0: *56 http exten: "" 2021/02/26 21:34:26 [debug] 31486#0: *56 posix_memalign: 0000000000FF6450:4096 @16 2021/02/26 21:34:26 [debug] 31486#0: *56 http process request header line 2021/02/26 21:34:26 [debug] 31486#0: *56 http header: "Host: 10.31.5.66" 2021/02/26 21:34:26 [debug] 31486#0: *56 http header: "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0" 2021/02/26 21:34:26 [debug] 31486#0: *56 http header: "Accept: */*" 2021/02/26 21:34:26 [debug] 31486#0: *56 http header: "Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2" 2021/02/26 21:34:26 [debug] 31486#0: *56 http header: "Accept-Encoding: gzip, deflate" 2021/02/26 21:34:26 [debug] 31486#0: *56 http header: "Referer: " 2021/02/26 21:34:26 [debug] 31486#0: *56 http header: "Connection: keep-alive" 2021/02/26 21:34:26 [debug] 31486#0: *56 http header done 2021/02/26 21:34:26 [debug] 31486#0: *56 rewrite phase: 0 2021/02/26 21:34:26 [debug] 31486#0: *56 test location: "http://www.likecs.com/" 2021/02/26 21:34:26 [debug] 31486#0: *56 test location: "file/" 2021/02/26 21:34:26 [debug] 31486#0: *56 test location: ~ "/base" 2021/02/26 21:34:26 [debug] 31486#0: *56 using configuration "/base"

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsgwg.html