nginx、php全链路超时设置,一次性搞懂

tech2023-02-08  87

nginx + php全链路超时设置

文章目录

nginx + php全链路超时设置nginx相关超时设置fastcgi通信proxy代理通信 php相关设置避免没有超时机制的请求不同超时设置起作用的状态码

nginx相关超时设置

fastcgi通信

fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300;

proxy代理通信

proxy_connect_timeout 15s;#连接超时 proxy_read_timeout 24s;#读超时 proxy_send_timeout 10s; #写超时

php相关设置

php.ini 中 max_execution_time = 300

php-fpm.conf request_terminate_timeout = 100

基本公式如下:

超时时间 = min(max_execution_time , request_terminate_timeout)

注意 set_time_limit()函数和配置指令max_execution_time只影响脚本本身执行的时间。任何发生在诸如使用system() ,file_get_contents()的系统调用,流操作,数据库操作等不会被计算在执行时间中,request_terminate_timeout 就是真正的执行时间

如果是 max_execution_time 起作用,http状态码为500 页面会显示最大执行时间等报错信息,而request_terminate_timeout 起作用,http状态码为502 页面返回的内容为nginx502页面

避免没有超时机制的请求

在使用file_get_contents函数时,如果不设置超时,而请求的接口又不能很快的返回时,可能能会导致 request_terminate_timeout 超时,子进程会被kill 系统提示页面报 502,被系统kill后,数据的完整性无法保证,应尽量避免没有超时限制的请求操作,包括mysql的连接,执行,redis的连接等

使用curl请求也要设置超时时间

/** * 统一封装的file_get_contents, 原生的file_get_contents绝对不能使用,没有设置超时时间,如果碰到网络问题,这个进程会一直卡在那边,并发高的时候这里会卡住大量进程,导致单机并发上不去 * * @param string $url 请求url * @param integer $timeout 超时时间 * @param array $header 请求头部 * @return */ function pft_file_get_contents($url, $timeout = 10, $header = []){ $url = (string)$url; $timeout = (int)$timeout; $timeout = $timeout <= 0 ? 10 : $timeout; $contextOptions = [ 'http' => ['timeout' => $timeout] ]; if($header) { $contextOptions['http']['header'] = $header; } $context = stream_context_create($contextOptions); $res = file_get_contents($url, false, $context); return $res; }

不同超时设置起作用的状态码

超时设置状态码max_execution_time500request_terminate_timeout502fastcgi_read_timeout504proxy_read_timeout504
最新回复(0)