AH01071: Получена ошибка ‘Основной скрипт неизвестен\n’ apache2.4 php-fpm7.2

Вопрос или проблема

Похоже, что я получаю эти строки в моем /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>

Ссылка: https://stackoverflow.com/questions/27408285/how-to-make-apache-check-if-php-file-exists-before-passing-it-to-php-fpm

Наконец, я проверил оба сервиса:

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 может возникать по нескольким причинам. В данной статье мы рассмотрим основные аспекты, касающиеся этой проблемы, а также предложим возможные решения.

Причины возникновения ошибки

  1. Отсутствие запрашиваемого файла: Сообщение об ошибке указывает на то, что PHP-FPM не может найти запрашиваемый PHP-скрипт. Это происходит, если файл не существует по указанному пути.

  2. Ошибка в конфигурации Apache: Неправильная настройка или отсутствие проверки существования файла перед передачей запроса в PHP-FPM может привести к появлению этой ошибки.

  3. Проблемы с разрешениями: Доступ к директории или файлу может быть ограничен из-за неверных прав. 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, чтобы убедиться в отсутствии других ошибок конфигурации.

Если вам нужны дополнительные рекомендации или помощь в настройке, не стесняйтесь обращаться за поддержкой.

Оцените материал
Добавить комментарий

Капча загружается...