每天出现 PHP-FPM 超时问题

每天出现 PHP-FPM 超时问题

我正在运行一个带有 nginx、PHP-FPM、MySQL 的专用服务器,并且在它上面运行着几个网站,但是我每天都会遇到超时问题,几乎每 24 小时就会出现一次运行 WordPress 的网站超时问题。

PHP-FPM 错误:

[14-Jan-2012 04:00:48] WARNING: [pool www] child 2759, script '/home/fez/www/index.php' (request: "GET /index.php") execution timed out (73.614398 sec), terminating
[14-Jan-2012 04:00:48] WARNING: [pool www] child 2759 exited on signal 15 (SIGTERM) after 114278.396462 seconds from start 

nginx错误:

2012/01/14 04:00:48 [error] 1629#0: *859825 upstream timed out (110: Connection timed out) while reading upstream, client: 82.130.40.76, server: www.flesheatingzipper.com, request: "GET /gaming/2011/11/skyrim-guide-dragon-shout-rune-locations-youre-welcome/ HTTP/1.1", upstream: "fastcgi://unix:/tmp/php5-fpm.sock:", host: "www.flesheatingzipper.com"

WordPress cron:

  • jetpack_clean_nonces - 每小时
  • akismet_scheduled_delete - 每日凌晨 3:00
  • wp_version_check - 每天两次(上午 10 点/晚上 10 点)
  • wp_update_plugins - 每天两次(上午 10 点/晚上 10 点)
  • wp_update_themes - 每天两次(上午 10 点/晚上 10 点)
  • wp_scheduled_delete - 每日上午 10 点

这是我的 PHP-FPM 配置:http://pastebin.com/ppsWeHVN

答案1

您从未提供过 nginx 配置。但是,PHP-FPM 子级上的 SIGTERM (15) 可能是以下之一:

  • 打开文件描述符太低(编辑 /etc/security/limits.conf 并为您的 Web 用户创建一个条目,并将“nofiles”设置为更高的值)。如果您使用 PHP-FPM 配置,请将 rlimit_files 设置为更高的值

  • 您在 nginx 配置中使用了 fastcgi_keep_conn on。这会对具有“ondemand”和“dynamic”配置的 php-fpm 造成灾难性后果,因为 php-fpm 会关闭并建立新的 php-fpm 子进程,但 nginx 不知道如何重新连接,因此您的网站将崩溃。

答案2

WordPress 使用 cron 作业做一些奇怪的事情。它有一个wp-cron.php在页面请求时包含/执行的文件。这用于为无法访问真实 crontab 的人模拟 crontab。

我怀疑您在 WordPress 管理中心配置了一个每日 cron 作业,该作业执行某些操作需要超过 73 秒。上次运行 24 小时后的第一个页面请求将再次触发该 cron 作业并导致另一次超时。

至于它最终成功的原因,我只能猜测它要么在每次运行期间完成部分工作并保存其进度,要么操作系统正在缓存越来越多的它接触的文件,直到它能够比超时更快地完成整个 cron 作业。

有些人已经致力于通过普通的 crontab 让 WordPress 的 cron 任务运行起来

cron作业akismet_scheduled_delete - Daily @ 3:00am似乎是最有可能的罪魁祸首。要么是服务器和 PHP 对当前时区的看法不同,这意味着凌晨 3 点的作业实际上在凌晨 4 点运行,要么该作业需要一个多小时才能执行。

答案3

看起来这和 Wassup 插件有关。我启用了 PHP 慢速日志,但在白天网站再次崩溃后收到以下错误。禁用插件后,网站立即变得更快,不再像以前那样变慢或崩溃。

[25-Jan-2012 15:09:20]  [pool www] pid 3593
script_filename = /home/fez/www/index.php
[0x00007f353cb75890] mysql_query() /home/fez/www/wp-includes/wp-db.php:1091
[0x00007f353cb75670] query() /home/fez/www/wp-includes/wp-db.php:1375
[0x00007f353cb753d8] get_results() /home/fez/www/wp-content/plugins/wassup/lib/wassup.class.php:553
[0x00007f353cb75278] getMySQLsetting() /home/fez/www/wp-content/plugins/wassup/lib/wassup.class.php:180
[0x00007f353cb750c0] defaultSettings() /home/fez/www/wp-content/plugins/wassup/lib/wassup.class.php:232
[0x00007f353cb74fc0] getSettings() /home/fez/www/wp-content/plugins/wassup/lib/wassup.class.php:212
[0x00007f353cb74ef8] loadSettings() /home/fez/www/wp-content/plugins/wassup/lib/wassup.class.php:90
[0x00007f353cb74b10] wassupoptions() /home/fez/www/wp-content/plugins/wassup/wassup.php:1822
[0x00007f353cb749d0] wassupPrepend() /home/fez/www/wp-content/plugins/wassup/wassup.php:326
[0x00007fff788d6280] wassup_init() unknown:0
[0x00007f353cb747a8] call_user_func_array() /home/fez/www/wp-includes/plugin.php:405
[0x00007f353cb74410] do_action() /home/fez/www/wp-settings.php:304
[0x00007f353cb74320] +++ dump failed

答案4

我猜你正在运行数据库转储或备份,并且一些表在此过程中被锁定,这总是会导致一些超时。尝试启用 mysql 慢查询日志并在凌晨 4 点左右检查慢查询。

相关内容