Вопрос или проблема
Похоже, что я получаю эти строки в моем /var/log/apache2/error.log и соответствующие записи в /var/log/apache2/access.log
/var/log/apache2/error.log
[Пт Сен 20 02:28:36.654357 2019] [proxy_fcgi:error] [pid 28619:tid 140003157985024] [client 49.233.5.191:37604] AH01071: Получена ошибка 'Primary script unknown\n'
[Пт Сен 20 02:28:38.136282 2019] [proxy_fcgi:error] [pid 28618:tid 140003082450688] [client 49.233.5.191:43806] AH01071: Получена ошибка 'Primary script unknown\n'
/var/log/apache2/access.log
49.233.5.191 - - [20/Сен/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/Сен/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-адреса и его поведение. Однако, когда я запрашиваю другой файл, который не существует, я не получаю ошибок ‘Получена ошибка ‘Primary script unknown\n’ в файле /var/log/apache2/error.log
Конфигурация php-fpm
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
# Включить http заголовки авторизации
<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$">
# Запретить доступ к сырым php-исходникам по умолчанию
# Для повторного разрешения рекомендуется включать доступ к файлам
# только в конкретном виртуальном хосте или директории
Require all denied
</FilesMatch>
# Запретить доступ к файлам без имени (например, '.php')
<FilesMatch "^\.ph(ar|p|ps|tml)$">
Require all denied
</FilesMatch>
</IfModule>
</IfModule>
Это что-то, с чем я могу что-то сделать, возможно, изменить конфигурацию?
Я знаю, что могу заблокировать IP-адрес с помощью iptables, меня больше интересует возможность избавиться от записи в журнале, если это возможно, с помощью изменения конфигурации.
В моей недавней стандартной настройке ubuntu 22.04 + apache 2.4 (репозиторий ubuntu)(запуск php как FPM/FastCGI) + php-fpm 8.1 (репозиторий ubuntu), загрузка несуществующего php файла вызывает 404 в журнале доступа, а в журнале ошибок:
[Пн Авг 14 19:41:02.162415 2022] [proxy_fcgi:error] [pid 578412:tid 140622065954369] [client 172.18.26.14:32120] AH01071: Получена ошибка 'Primary script unknown'
Браузер показывает “Файл не найден.” с 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>
…
Наконец, я проверил оба сервиса:
php-fpm7.3 -t
apachectl configtest
Поскольку все выглядело нормально, я перезапустил их оба:
systemctl restart php7.3-fpm
systemctl restart apache2
Так просто.
Хотя, я полагаю, перезагрузка тоже бы исправила это AH01071
.
Убедитесь, что дерево директорий, ведущее к файлу, который должен быть выполнен, доступно для чтения/выполнения. Мы должны были сделать это, чтобы исправить ситуацию:
chmod 711 /home
chmod 711 /home/*
chmod 751 /home/*/public_html
Для немного более расслабленных разрешений используйте это:
chmod 755 /home
chmod 755 /home/*
chmod 755 /home/*/public_html
Это сработало для нас, но вы несете ответственность за свои собственные настройки безопасности! Как только вы это наладите, убедитесь, что настройки соответствуют вашей политике безопасности.
Если вы используете WHM/cPanel, то обратите внимание на эту документацию, которая может сбросить разрешения, когда вы этого не ожидаете!
Моя проблема на AWS (я использую Elastic Beanstalk для запуска EC2 экземпляров, и недавно обновил до PHP 8.0.6) была решена следующим образом:
$ apachectl configtest
Syntax OK
$ php-fpm -t
ERROR: не удалось открыть error_log (/var/log/php-fpm/error.log): Доступ запрещен (13)
ERROR: не удалось обработать конфигурацию
ERROR: Инициализация FPM не удалась
$ sudo chmod 666 /var/log/php-fpm/error.log
Я не уверен, почему этот журнал ошибок был инициализирован root, или, что более важно, как сделать так, чтобы он инициализировался с правильным пользователем или разрешениями, когда создаются новые экземпляры, но это начало.
Ответ или решение
Ошибка с кодом AH01071: "Got error ‘Primary script unknown\n’" в конфигурации Apache с использованием PHP-FPM может возникать по нескольким причинам. В данной статье мы рассмотрим основные аспекты, касающиеся этой проблемы, а также предложим возможные решения.
Причины возникновения ошибки
-
Отсутствие запрашиваемого файла: Сообщение об ошибке указывает на то, что PHP-FPM не может найти запрашиваемый PHP-скрипт. Это происходит, если файл не существует по указанному пути.
-
Ошибка в конфигурации Apache: Неправильная настройка или отсутствие проверки существования файла перед передачей запроса в PHP-FPM может привести к появлению этой ошибки.
-
Проблемы с разрешениями: Доступ к директории или файлу может быть ограничен из-за неверных прав. Apache должен иметь доступ к директориям, которые предшествуют файлу.
Решения проблемы
1. Обновление конфигурации Apache
Чтобы предотвратить переправку запросов к несуществующим PHP-файлам в PHP-FPM, мы можем использовать директиву <If>
для проверки существования файла. Вот пример того, как модифицировать конфигурацию php-fpm.conf
:
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
<FilesMatch ".+\.ph(ar|p|tml)$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
</If>
</FilesMatch>
<FilesMatch ".+\.phps$">
Require all denied
</FilesMatch>
<FilesMatch "^\.ph(ar|p|ps|tml)$">
Require all denied
</FilesMatch>
</IfModule>
</IfModule>
Эта модификация предотвратит передачу запросов на несуществующие PHP-скрипты к PHP-FPM, что, в свою очередь, поможет избежать ошибок AH01071 в логах.
2. Проверка прав доступа
Убедитесь, что все директории, ведущие к вашему PHP-файлу, имеют правильные разрешения:
chmod 755 /home
chmod 755 /home/*
chmod 755 /home/*/public_html
Эти команды обеспечат необходимый доступ для Apache и предотвратят проблемы с разрешениями.
3. Проверка логов
Проверяйте логи Apache и PHP-FPM для выявления других потенциальных ошибок. Например:
tail -f /var/log/apache2/error.log
tail -f /var/log/php-fpm/error.log
Это поможет вам выявить дополнительные проблемы, которые могут быть связаны с конфигурацией.
Заключение
Ошибка AH01071 связана с тем, что PHP-FPM не может найти указанный скрипт. Применение корректной конфигурации Apache и изменение прав доступа к файлам поможет вам избежать данной ошибки. Убедитесь, что вы протестировали настройки с помощью команд apachectl configtest
и php-fpm -t
, чтобы убедиться в отсутствии других ошибок конфигурации.
Если вам нужны дополнительные рекомендации или помощь в настройке, не стесняйтесь обращаться за поддержкой.