Nginx PHP-FPM停止工作,连接中留下一个打开的socket

ifmq2ha2  于 2023-06-21  发布在  Nginx
关注(0)|答案(3)|浏览(166)

我有这个反复出现的问题与Nginx大约一天一次,大约两次在高流量负载。解决办法很简单:重新启动服务器,但当错误发生时,Nginx完全停止工作。我有一个Nginx PHP-FPM设置。
问题开始于:

020/09/27 09:57:27 [error] 38#38: *430982 upstream timed out (110: Connection timed out) while connecting to upstream, client: x.x.x.x, server: example.com, request: "POST /api/sessions/wri

然后它会发展成:

2020/09/27 10:03:22 [alert] 40#40: *431277 open socket #18 left in connection 51
2020/09/27 10:03:22 [alert] 38#38: *431298 open socket #34 left in connection 166
2020/09/27 10:03:22 [alert] 40#40: *431288 open socket #28 left in connection 59
2020/09/27 10:03:22 [alert] 38#38: *431296 open socket #32 left in connection 169
2020/09/27 10:03:22 [alert] 38#38: *431257 open socket #36 left in connection 177
2020/09/27 10:03:22 [alert] 38#38: *431291 open socket #23 left in connection 178
2020/09/27 10:03:22 [alert] 38#38: *431253 open socket #27 left in connection 188
2020/09/27 10:03:22 [alert] 38#38: *431300 open socket #31 left in connection 197
2020/09/27 10:03:22 [alert] 38#38: *431312 open socket #12 left in connection 204
2020/09/27 10:03:22 [alert] 38#38: *431259 open socket #38 left in connection 206
2020/09/27 10:03:22 [alert] 37#37: aborting
2020/09/27 10:03:22 [alert] 38#38: aborting
2020/09/27 10:03:22 [alert] 40#40: aborting
2020/09/27 10:03:23 [warn] 21568#21568: 8096 worker_connections exceed open file resource limit: 1024
    2020/09/27 10:08:24 [warn] 21574#21574: *636 upstream server temporarily disabled while connecting to upstream,

现在GET请求仍然有效。所以如果我去网站,它加载。但是任何POST、PUT或DELETE操作都会失败,所以最终用户除了浏览什么都不能做。
为什么会这样?是否有一种健康检查可以用来检测这些问题?

3okqufwl

3okqufwl1#

关于您看到的第一个超时错误,如果您使用的是FastCGI配置,那么您可能需要查看以下内容:

fastcgi_read_timeout 600s;

确保该值比PHP将执行的最长处理时间长。
您还应该将worker connections设置增加到您期望的并发连接数(例如10000):

worker_connections 10000;

此外,正如Sang Lu的回答所提到的,您需要确保nginx可以打开足够的文件句柄(也包括网络套接字)。
如果你以root身份启动主nginx进程,你可以简单地做(至少两次以上的worker_connections配置:

worker_rlimit_nofile 21000;

另一种方法是为启动主nginx进程的用户使用ulimit/etc/security/limits.conf

slhcrj9b

slhcrj9b2#

可能是你的Nginx进程打开了太多的文件。您可以通过遵循本文来增加此限制:How to Increase Number of Open Files Limit in Linux
要更改此设置,您需要root权限,并执行以下操作:
1.打开 /etc/security/limits.conf 文件:vi /etc/security/limits.conf
1.将这些行附加到文件末尾:

## Example hard limit for maximum number of opened files
*    hard    nofile    10240
## Example soft limit for maximum number of opened files
*    soft    nofile    10240

1.保存所有更改并重新启动您的服务器/VPS以应用新设置。

注意10240为进程最大可以打开的文件数。根据需要更改此值。

ebdffaop

ebdffaop3#

您可以采取以下几个步骤来诊断和解决问题:
1.增加PHP-FPM超时需要更改request_terminate_timeoutrequest_slowlog_timeout, and max_execution_time settings in your PHP-FPM configuration file (often located at/etc/php-fpm.conf or/etc/php/version/fpm/php-fpm.conf)。完成更改后,重新启动PHP-FPM。 1.**增加Nginx超时:**在Nginx配置文件(通常位于/etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf)中,调整proxy_read_timeoutfastcgi_read_timeout`的值,以允许更长的请求处理时间。修改后重启Nginx。
1.**验证服务器的资源:**在高流量期间关注服务器的资源使用情况。检查您的CPU、内存和磁盘I/O空间是否不足。如果需要,可以考虑更新服务器或简化应用程序中的代码和数据库查询,以提高性能。
1.启用PHP-FPM慢日志来查找可能导致超时的任何缓慢请求。取消注解'slowlog'指令并将其值设置为您希望在PHP-FPM配置文件中存储日志文件的目录。完成更改后,重新启动PHP-FPM。通过分析日志文件查找应用程序代码中的任何瓶颈。
1.**实施健康检查:**要对Nginx和PHP-FPM服务器进行常规健康检查,您可以设置监控系统或使用第三方工具。这些检查有助于在问题影响服务之前发现问题。服务器的响应时间、CPU使用率、内存利用率和其他相关数据都可以被观察到。
1.开启错误日志:确保PHP-FPM和Nginx错误日志都开启。查看错误日志,以查找任何相关的错误消息,这些错误消息可以提供有关超时原因的更多信息。

相关问题