AH01071:出现错误‘主要脚本未知\n’ apache2.4 php-fpm7.2

AH01071:出现错误‘主要脚本未知\n’ apache2.4 php-fpm7.2

我似乎在 /var/log/apache2/error.log 中看到了这些行,在 /var/log/apache2/access.log 中也看到了相应的记录

/var/log/apache2/error.log

[Fri Sep 20 02:28:36.654357 2019] [proxy_fcgi:error] [pid 28619:tid 140003157985024] [client 49.233.5.191:37604] AH01071: Got error 'Primary script unknown\n'
[Fri Sep 20 02:28:38.136282 2019] [proxy_fcgi:error] [pid 28618:tid 140003082450688] [client 49.233.5.191:43806] AH01071: Got error 'Primary script unknown\n'

/var/log/apache2/access.log

49.233.5.191 - - [20/Sep/2019:02:28:36 +0000] "GET /TP/html/public/index.php HTTP/1.1" 404 392 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.0;en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6)"
49.233.5.191 - - [20/Sep/2019:02:28:36 +0000] "GET /elrekt.php HTTP/1.1" 404 433 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.0;en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6)"

这些文件显然不存在,因此从 IP 位置和行为来看,这似乎是机器人扫描。但是,当我请求另一个不存在的文件时。我没有在 /var/log/apache2/error.log 文件中收到“Got error 'Primary script unknown\n'”错误

php-fpm 配置

<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
    # Enable http authorization headers
    <IfModule setenvif_module>
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    </IfModule>

    <FilesMatch ".+\.ph(ar|p|tml)$">
        SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
    </FilesMatch>
    <FilesMatch ".+\.phps$">
        # Deny access to raw php sources by default
        # To re-enable it's recommended to enable access to the files
        # only in specific virtual host or directory
        Require all denied
    </FilesMatch>
    # Deny access to files without filename (e.g. '.php')
    <FilesMatch "^\.ph(ar|p|ps|tml)$">
        Require all denied
    </FilesMatch>
</IfModule>
</IfModule>

这是我能做些什么的事情吗,也许可以更改配置?

我知道我可以使用 iptables 来阻止 ip,如果可能的话,我更感兴趣的是通过某些配置更改来摆脱日志条目。

答案1

在我最近的默认/标准设置 ubuntu 22.04 + apache 2.4(ubuntu repo)(以 FPM/FastCGI 运行 php)+ php-fpm 8.1(ubuntu repo)中,加载不存在的 php 文件在访问日志中出现 404,并且错误日志中出现“[Mon Aug 14 19:41:02.162415 2022] [proxy_fcgi:error] [pid 578412:tid 140622065954369] [client 172.18.26.14:32120] AH01071: 出现错误‘主要脚本未知’”。

浏览器显示“未找到文件。”并显示 http 404,这不是标准的 apache 错误。

经过google搜索,应该是php解释器处理了一个不存在的php文件导致的。

解决方案:仅将存在的 php 文件传递​​给 php 解释器(添加 If 检查)。

# /etc/apache2/conf-available/php8.1-fpm.conf
<FilesMatch ".+\.ph(ar|p|tml)$">
    <If "-f %{REQUEST_FILENAME}">
        SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
    </If>
</FilesMatch>

参考:https://stackoverflow.com/questions/27408285/how-to-make-apache-check-if-php-file-exists-before-passing-it-to-php-fpm

答案2

最后,我检查了这两项服务:

php-fpm7.3 -t
apachectl configtest

由于一切看起来都很好,我重新启动了它们:

systemctl restart php7.3-fpm
systemctl restart apache2

就这么简单。
虽然我猜重启本来可以修复AH01071也一样。

答案3

我在 AWS 上的问题(我使用 Elastic Beanstalk 运行 EC2 实例,最近升级到了 PHP 8.0.6)通过以下方法解决:

$ apachectl configtest  
Syntax OK

$ php-fpm -t  
ERROR: failed to open error_log (/var/log/php-fpm/error.log): Permission denied (13) 
ERROR: failed to post process the configuration 
ERROR: FPM initialization failed

$ sudo chmod 666 /var/log/php-fpm/error.log

我不确定为什么该错误日志是由 root 初始化的,或者更重要的是,如何在生成新实例时使用正确的用户或权限进行初始化,但这是一个开始。

相关内容