logrotate 导致 php5-fpm 停机

logrotate 导致 php5-fpm 停机

我注意到我们的一台服务器在 logrotate 运行后立即开始返回错误,即在 nginx 错误日志中我可以看到:

[错误] 8501#0:*118126869 recv()失败(104:对等方重置连接)从上游读取响应头时,客户端:xxx.yyy.zz.ww,服务器:www.test.com,请求:“GET /index.php HTTP/1.1”,上游:“fastcgi://127.0.0.1:9011”,主机:“www.test.com”

我尝试添加一个 postrotate 操作,以使 php 正常重新加载,但错误仍然发生,我们当前的 logrotate 如下:

/var/log/php5-fpm.log {
        daily
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 644 root root
        postrotate
                [ ! -f /var/run/php5-fpm.pid ] || kill -USR2 `cat /var/run/php5-fpm.pid`
        endscript
}

PHP配置如下:

[www-9011]

user = www-data
group = www-data
listen = 127.0.0.1:9011
listen.backlog = 65535
pm = ondemand
pm.max_children = 50
pm.process_idle_timeout = 10s;
pm.max_requests = 500
rlimit_files = 16384
chdir = /
catch_workers_output = no
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on

我们在 ubuntu 12.04 和 php 5.3.10 上运行

答案1

发送 USR1

https://github.com/php/php-src/blob/b7a7b1a624c97945c0aaa49d46ae996fc0bdb6bc/sapi/fpm/fpm/fpm_events.c#L94

源代码显示这是专门用于旋转文件的,我知道 Ubuntu 14.04 不能很好地处理 fpm 重新加载(USR2),我认为旧版本也是如此。

因此改为

postrotate
                [ ! -f /var/run/php5-fpm.pid ] || kill -USR1 `cat /var/run/php5-fpm.pid`
endscript

简单地旋转日志

答案2

这是一个老问题,但仍然没有答案。因此,我尝试为那些仍在寻找答案的人提供答案:logrotate配置文件规定,在进行轮换后,logrotate应终止该php-fpm进程:

        postrotate
                [ ! -f /var/run/php5-fpm.pid ] || kill -USR1 `cat /var/run/php5-fpm.pid`

php5-fpm-reopenlogsUbuntu 16 存储库中的当前默认配置是调用用于日志文件轮换的功能:

        postrotate
                /usr/lib/php5/php5-fpm-reopenlogs

与PHP7类似:

        postrotate
                /usr/lib/php/php7.0-fpm-reopenlogs

以下是完整的上下文/etc/logrotate.d/php5-fpm展示:postrotate

/var/log/php5-fpm.log {
        rotate 12
        weekly
        missingok
        notifempty
        compress
        delaycompress
        postrotate
                # invoke-rc.d php5-fpm reload > /dev/null
                /usr/lib/php5/php5-fpm-reopenlogs
        endscript
}

答案3

似乎在运行 logrotate 进程后,您在服务器的 nginx 错误日志中遇到了错误。错误消息表明存在与“recv()”函数相关的问题,并提到对等方重置了连接。这发生在服务器尝试从上游服务器读取响应标头时。日志还提供有关客户端 IP 地址、服务器域、请求类型和上游服务器详细信息的信息。

这种类型的错误通常与 nginx 和 FastCGI 后端(在本例中为“127.0.0.1:9011”处的上游服务器)之间的通信有关。“对等方重置连接”错误表示上游服务器在 nginx 等待响应时突然关闭了连接。这种情况可能由于多种原因而发生,例如上游服务器崩溃或由于网络问题导致连接断开。

要排除故障并解决此问题,您可以考虑采取以下步骤:

  1. 检查上游服务器:验证 FastCGI 后端 (127.0.0.1:9011) 是否正在运行并正常运行。检查其日志中是否有任何错误或崩溃。

  2. 网络连接:检查 nginx 与上游服务器之间的网络连接。确保没有导致连接中断的网络问题。

  3. 资源限制:确保上游服务器具有足够的资源(CPU、内存等)来处理传入请求。资源限制可能会导致崩溃或连接重置。

  4. FastCGI 配置:检查 nginx 设置中的 FastCGI 配置。确保设置正确配置以匹配 FastCGI 服务器的参数。

  5. 更新软件:确保 nginx 和 FastCGI 后端都运行最新的稳定版本。软件更新通常可以解决已知问题。

  6. 错误处理:在代码中实现适当的错误处理,以便妥善处理意外情况。这可以防止上游服务器崩溃并突然关闭连接。

  7. 负载均衡:如果可行,请考虑使用多个上游服务器实现负载平衡以分配流量并减少一台服务器故障的影响。

  8. 监控和分析:设置监控工具来跟踪服务器性能和错误。分析趋势和模式可以深入了解问题的根本原因。

  9. 日志:检查 nginx 和上游服务器的日志,查找任何可能有助于解释问题的额外错误消息或相关信息。

  10. 配置审查:仔细检查您的 nginx 和 FastCGI 配置,查找可能导致问题的任何错误配置或不一致。

记住一次实施一个更改,并在每次修改后进行测试,以确定解决问题的具体操作。

相关内容