如何修复 Apache-mod_proxy_fcgi-PHP-FPM 服务器上反复出现的 PHP 503 错误?

如何修复 Apache-mod_proxy_fcgi-PHP-FPM 服务器上反复出现的 PHP 503 错误?

我的 php-fpm 设置有问题。也许你们可以给我指出正确的方向。首先,一切都运行良好。但时不时地,我会收到 503 错误。一旦我重新加载网站,这些错误就会消失。它们只出现在 php 网站上,并且不局限于一个域或一个框架。我在 PHPmyAdmin、Wordpress 和 Typo3 中收到 503 错误。这是我测试过的 3 个网站。它们位于单独的虚拟主机上,具有不同的 php-fpm 池,但它们共享相同的 php-fpm 主进程。

我运行的服务器是 Apache 2.4 (MPM-Event Workers),没有 mod_php 或 cgi/fastcgi。相反,我使用 mod_proxy 和 mod_proxy_fcgi 将每个 .php 文件传递​​给我的 php-fpm 进程。需要注意的一点是,该服务器尚未投入生产,因此几乎没有流量。服务器硬件很强大,有 12 个 VCores 和 32 GB 内存。

我的 mod_proxy 和 mod_proxy_fcgi 设置是默认的 - 我没有在那里更改任何内容。

我的虚拟主机配置(代理部分):

<FilesMatch "\.php$">
        SetHandler "proxy:unix:///opt/php-5.6.11/var/run/php5-fpm-mywebsite.sock|fcgi://mywebsite/"
    </FilesMatch>
    <Proxy fcgi://mywebsite/ enablereuse=on retry=0>
</Proxy>

注意:我之前在 Proxy 指令中使用过 max=10,它似乎更频繁地产生 503 错误。现在我删除了 max=10,它似乎出现得更少了。不过这可能只是巧合。

我的 PHP-FPM 池配置(相关部分):

listen = var/run/php5-fpm-mywebsite.sock
listen.owner = mywebsite
listen.group = www-data
listen.mode = 0660
listen.backlog = 65535

user = mywebsite
group = www-data
listen.allowed_clients = 127.0.0.1

pm = ondemand
pm.max_children = 20
pm.process_idle_timeout = 15s

request_terminate_timeout = 300s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = no

我的 PHP-FPM 配置(相关部分):

emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10
events.mechanism = epoll

我的 PHP.ini 用于 PHP-FPM 主进程。此处未列出的所有内容要么是默认的 php 设置,要么不相关:

memory_limit = 400M
upload_max_filesize = 20M
post_max_size = 20M
max_execution_time = 600
max_input_time  = -1
max_input_vars = 10000
suhosin.get.max_vars = 10000
suhosin.post.max_vars = 10000

[Zend]
zend_extension=/opt/php-5.6.11/lib/php/extensions/no-debug-non-zts-20131226/ioncube.so
zend_extension=opcache.so
opcache.revalidate_freq=0
;opcache.validate_timestamps=0
opcache.max_accelerated_files=50000
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.fast_shutdown=1

[APC]
extension=apcu.so
apc.enabled=1
apc.shm_segments = 1
apc.shm_size=256M
apc.ttl=7200
apc.user_ttl=7200
apc.gc_ttl=3600
apc.stat=1
apc.enable_cli=0
apc.file_update_protection=2
apc.max_file_size=2M
apc.include_once_override=0
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.cache_by_default=1
apc.use_request_time=1
apc.slam_defense=0
apc.stat_ctime=0
apc.canonicalize=1
apc.write_lock=1
apc.report_autofilter=0
apc.rfc1867=0
apc.rfc1867_prefix =upload_
apc.rfc1867_name=APC_UPLOAD_PROGRESS
apc.rfc1867_freq=0
apc.rfc1867_ttl=3600
apc.lazy_classes=0
apc.lazy_functions=0

extension=memcache.so
extension=memcached.so

注意:Memcached 分配了 1 GB 内存。

Apache 错误日志

来自 apache error.log 的实际错误消息。错误消息始终相同。(我已启用详细代理日志记录):

[proxy:debug] [pid 141760:tid 140526898214656] mod_proxy.c(1159): [client myclient] AH01143: Running scheme unix handler (attempt 0), referer: http://mywebsite/website/typo3/install/index.php?TYPO3_INSTALL[type]=cleanup
[proxy_fcgi:debug] [pid 141760:tid 140526898214656] mod_proxy_fcgi.c(879): [client myclient] AH01076: url: fcgi://mywebsite//var/www/html/mywebsite/htdocs/typo3site/website/index.php proxyname: (null) proxyport: 0, referer: http://mywebsite/website/typo3/install/index.php?TYPO3_INSTALL[type]=cleanup
[proxy_fcgi:debug] [pid 141760:tid 140526898214656] mod_proxy_fcgi.c(886): [client myclient] AH01078: serving URL fcgi://mywebsite//var/www/html/mywebsite/htdocs/typo3site/website/index.php, referer: http://mywebsite/website/typo3/install/index.php?TYPO3_INSTALL[type]=cleanup
[proxy:debug] [pid 141760:tid 140526898214656] proxy_util.c(2147): AH00942: FCGI: has acquired connection for (mywebsite)
[proxy:debug] [pid 141760:tid 140526898214656] proxy_util.c(2200): [client myclient] AH00944: connecting fcgi://mywebsite//var/www/html/mywebsite/htdocs/typo3site/website/index.php to mywebsite:8000, referer: http://mywebsite/website/typo3/install/index.php?TYPO3_INSTALL[type]=cleanup
[proxy:debug] [pid 141760:tid 140526898214656] proxy_util.c(2237): [client myclient] AH02545: fcgi: has determined UDS as /opt/php-5.6.11/var/run/php5-fpm-mywebsite.sock, referer: http://mywebsite/website/typo3/install/index.php?TYPO3_INSTALL[type]=cleanup
[proxy:debug] [pid 141760:tid 140526898214656] proxy_util.c(2409): [client myclient] AH00947: connected //var/www/html/mywebsite/htdocs/typo3site/website/index.php to httpd-UDS:0, referer: http://mywebsite/website/typo3/install/index.php?TYPO3_INSTALL[type]=cleanup
[proxy_fcgi:error] [pid 141760:tid 140526898214656] [client myclient] AH01067: Failed to read FastCGI header, referer: http://mywebsite/website/typo3/install/index.php?TYPO3_INSTALL[type]=cleanup
[proxy_fcgi:error] [pid 141760:tid 140526898214656] (104)Connection reset by peer: [client myclient] AH01075: Error dispatching request to : , referer: http://mywebsite/website/typo3/install/index.php?TYPO3_INSTALL[type]=cleanup
[proxy:debug] [pid 141760:tid 140526898214656] proxy_util.c(2162): AH00943: FCGI: has released connection for (mywebsite)

现在我的问题是:

如何修复 Web 服务器上反复出现的 PHP 503 错误?

我的想法:

  • 也许在 UDS 模式下可以使用 mod_proxy_fcgi。但是从性能角度来看,停用 UDS 不是很糟糕吗?我可以在那里调整任何东西吗?
  • mod_proxy 或 mod_proxy_fcgi 无法与 php-fpm 正确协同工作或设置不正确?
  • APC、ZendOPCache 或 Memcached 搞砸了?我不会说是分配给它们的内存,因为服务器上几乎没有发生任何事情,而且有足够的可用内存
  • php.ini 配置存在一些问题吗?
  • php-fpm 配置或 php-fpm 池配置存在一些问题?

我对这些东西并不熟悉,所以我很难弄清楚。带有 php-fpm 的 Apache 似乎也不常见,大多数谷歌结果都是基于 nginx 的,这对我没有太大帮助。

也许这里有人可以帮助我?

多谢!!

答案1

删除代理行上的 enablereuse=on 选项,使其显示

<Proxy fcgi://mywebsite/ retry=0>

这为我解决了“错误地将请求发送到:,引用...”的问题。

答案2

我遇到了同样的问题,在尝试了解原因后,我发现对我们来说,原因在于插件有缺陷。

具体来说,我们通过禁用此 wordpress 插件解决了该问题:https://wordpress.org/plugins/custom-css-js/

我们使用的是 php 7 和 wordpress 4.5.6。

所以对我们来说这不是由于 php、apache 或任何缓存系统配置错误造成的。问题也不是没有可用资源(CPU/RAM)的问题。问题是由于插件错误造成的。

很难找到导致问题的插件。我们通过 php 调试选项了解了问题所在,因此我建议将下面的这些行添加到wp-config.php调试:

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
@ini_set('display_errors',0);

好运!

答案3

正如其他帖子所建议的,enablereuse=on当 PHP-FPM 守护进程通过 Unix 套接字运行时,不应使用它。

Apache 的 mod_proxy_fcgi 文档证实了这一点,

UDS目前不支持连接重用

UDS 代表 Unix 域套接字,这意味着当您以套接字 (.sock) 的形式运行 PHP-FPM 时,而不是默认的 TCP 端口方法。

Nathan Zachary 详细介绍了如何将 Apache + PHP-FPM 配置为套接字以及其他相关主题。

我在使用 enablereuse=on 和 UDS 执行 POST 后立即遇到了疯狂且不可预测的 Apache 响应。在我删除 enablereuse=on 并重新启动服务后,问题就完全消失了。

更多关于mod_h2 人员的症状和调试此问题

答案4

我遇到了类似的问题并修复了它将文件夹移出 /var/lib/php/opcache/,然后重新启动 php-fpm

可能相关:昨晚有用户向 PHP URL 发送垃圾邮件,导致这些错误在我们的 Apache 日志中重复出现。

[pid 925] worker.c(1613): AH00288: scoreboard is full, not at MaxRequestWorkers

我猜测它导致 /var/lib/php/opcache 文件夹中的一些缓存损坏。

出于某种原因,通过 opcache 控制面板重置 opcache 或重新启动 apache/php-fpm 似乎可以清除这些文件夹。您必须手动执行此操作。

但这似乎对我有用。

相关内容