Google Apps Script调用nginx+php-fpm时间歇性超时无日志如何排查
问题排查步骤
1. 优先验证GAS侧出站连接限制
GAS的UrlFetch服务本身存在配额上限,很多偶发连接异常实际是GAS侧触发限制导致,请求根本没有到达你的服务器:
- 核对报错时段的GAS请求并发量:GAS免费版单脚本最大并发UrlFetch请求数为6,Workspace付费版为10,超出该限制时会抛出
Address unavailable类报错,和你遇到的错误特征吻合。 - 做请求轨迹匹配:在GAS代码中记录每次请求的触发时间、唯一标识,和服务器侧nginx的
access.log做对比,如果报错的请求完全没有出现在nginx访问日志中,可直接确认是GAS侧的连接限制导致,和服务器配置无关。
2. 排查服务器侧连接未到nginx的问题
如果匹配后确认请求已经到达GCP区域,但nginx日志无记录,按以下顺序排查:
- 检查Nginx基础连接配置:核对
worker_processes、worker_connections参数,nginx理论最大连接数为worker_processes * worker_connections,同时检查listen指令后的backlog参数,默认值通常为511,短时间大量请求涌入时backlog队列满会直接丢包,不会在nginx日志留下记录。 - 检查内核网络参数:执行
sysctl net.core.somaxconn查看系统全连接队列上限,默认多数发行版为128,低于nginx的backlog配置时会以前者为准;执行sysctl net.ipv4.ip_local_port_range查看可用端口范围,短连接请求过多时会出现端口耗尽的情况,这类异常都会记录在dmesg内核日志中,可直接检索关键字TCP: drop open request from、port already in use确认。 - 检查GCP层面限制:确认VPC防火墙、虚拟机安全组是否配置了单IP/总连接数限流规则,GCP的限流动作不会在虚拟机系统内留下日志,可在GCP控制台的VPC流日志中查询对应时间的丢包记录。
- 检查php-fpm资源占用:如果请求已经出现在nginx访问日志,但是返回超时,核对php-fpm的
pm.max_children参数,进程耗尽时请求会排队超时,GAS端先断开连接也可能抛出该类报错,可查看php-fpm的错误日志、慢日志确认是否有进程不足的记录。
3. 定向验证根因后再调整配置
确认可疑点后做针对性测试验证:
- 用
wrk/ab等压测工具,在和GAS同区域的GCP虚拟机上模拟对应并发量的请求,复现报错时同步监控各层连接数、队列占用情况,定位具体瓶颈点。 - 如果是GAS配额不足,优先调整GAS请求逻辑,比如加异步队列、错峰请求;如果是服务器侧连接队列、进程数不足,再对应调高
somaxconn、backlog、worker_connections、pm.max_children等参数即可。
内容的提问来源于stack exchange,提问作者Iain Dooley
相关产品推荐
相关产品推荐

