梳理一些服务器Nginx相关的工作场景
技术背景
LNMP环境下,反向代理服务器 Nginx 错误日志大量报错,显示504
upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond) while reading response header from upstream
理论回看
Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI
一般情况下,提交动态请求的时候,Nginx会直接把 请求转交给php-fpm,而php-fpm再分配php-cgi进程来处理相关的请求,之后再依次返回,最后由 Nginx 把结果反馈给客户端浏览器。
原因列举如下
1 作为调用方,服务提供方接口异常,造成访问超时,Nginx交由 PHP 处理的任务长时间没有返回,Nginx直接返回504。而这种超时,在PHP调用层面的的代码逻辑里很难捕获到,并且习惯上也不捕获,交由框架层面的异常捕获器。
2 作为服务提供者,自身服务访问数据库超时不返回或者PHP层面业务处理严重耗时,程序设计不合理,造成长时间延迟超时。
问题追踪
如果PHP服务出现短时间大量504错误,会把整个fastcgi通道拥塞堵死。最后就是PHP服务挂了。如果多个服务以虚拟主机的形式在同一台服务器上,那么这多个服务都会受到影响,最直观的前台体验就是访问速度慢,或者直接打不开。
定时任务,跑批,数据库批量数据更新相关业务容易出这种类型的 Nginx 错误。
网络上通过配置解决504的方式,正常情况下不建议使用,优先考虑程序设计和实现方面的不足,参照我之前的一篇博文 PHP性能优化之连接超时
温习下Nginx 中的常用命令
检查配置文件
./nginx -t;
nginx: the configuration file /etc/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/conf/nginx.conf test is successful
检查版本
./nginx -v;
nginx version: nginx/1.15.2
检查模块
./nginx -V;
nginx version: nginx/1.15.2
built by clang 9.1.0 (clang-902.0.39.2)
built with OpenSSL 1.0.2o 27 Mar 2018 (running with OpenSSL 1.0.2r 26 Feb 2019)
TLS SNI support enabled ...
故障排查通用思路
排查与Nginx服务相关的故障时从以下几个方面检查
- user
- error_log
- pid
- access_log