我似乎在 /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>
答案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 初始化的,或者更重要的是,如何在生成新实例时使用正确的用户或权限进行初始化,但这是一个开始。