#Что означает проблема
Если сервер вместо исполнения PHP предлагает скачать файл или показывает его исходный код, это чрезвычайно опасно: в исходниках могут быть пароли базы и ключи приложения. До диагностики немедленно исключите публичную выдачу такого содержимого через штатную страницу обслуживания либо ограничение доступа на входном узле. Если вместо этого возникает 503/502/500, применяйте безопасную диагностику подключения PHP-FPM и журнала Apache.
#Как различить причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Связь расширения .php с обработчиком исчезлаПосле смены конфигурации больше не действует SetHandler/AddHandler или mod_php. | Код PHP показывается/скачивается либо сервер отдаёт статический файл. | Немедленно закрыть выдачу исходников и восстановить корректный PHP-обработчик. |
| Не совпадает сокет PHP-FPMApache обращается по старому пути сокета после переключения версии PHP. | 503/ошибка соединения с proxy:fcgi в error.log, сокета нет. | Сверить фактический Listen пула и путь Apache. |
| Нужный VirtualHost использует другой режим PHPПанель переключила PHP для одного домена, а нужный VirtualHost остался со старым обработчиком. | Один сайт работает, другой — нет, хотя Apache запущен. | Определить виртуальный хост и его собственные FilesMatch/SetHandler. |
#Подробная диагностика и устранение
- Немедленно проверьте, не раскрывается ли исходный кодЕсли браузер показывает
<?phpили скачивает .php, считайте это происшествием безопасности. Не размещайте общедоступный phpinfo.php или тест с паролями; временно закройте соответствующий сайт штатным режимом обслуживания или блокировкой на внешнем Nginx и согласуйте дальнейшие действия. Проверьте журнал загрузок: если исходники могли быть получены, учётные данные приложения следует считать потенциально раскрытыми и заменить по установленному порядку. - Различите неисправности по коду ответаЕсли код не раскрывается, откройте обычную публичную страницу через браузер F12 → «Сеть», запишите HTTP-статус и время. 503 от Apache при proxy_fcgi может означать отсутствие подключения к PHP-FPM; 500 — ошибку обработчика или самого скрипта. Не угадывайте по внешнему виду: проверьте error.log нужного виртуального хоста за ту же минуту.
- Найдите конкретный VirtualHost и модульНа сервере через SSH выполните
sudo apache2ctl -Sиsudo apache2ctl -M. В списке модулей ищитеproxy_module,proxy_fcgi_module,php_module(название версии может отличаться). Определите, какой путь PHP обслуживал домен: PHP-FPM через SetHandler/ProxyPassMatch или встроенный mod_php. Не включайте одновременно два обработчика для одного файла без схемы проекта. - Проверьте действующий FilesMatch и путь к сокетуВ конфигурации найденного хоста найдите
<FilesMatch "\.php$">иSetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"либо другую конфигурацию. Приведённая строка — только пример. Проверьте, что сокет действительно существует вsudo ls -la /run/php/и принадлежит нужному пулу. На Fastpanel и иных панелях имя пути может отличаться полностью, нельзя подставлятьphp8.2-fpm.sockбез проверки. - Проверьте состояние конкретного PHP-FPMВыполните
systemctl --type=service --state=running | grep -E "php.*fpm"для поиска действующих служб; далее посмотритеsudo systemctl status ИМЯ-СЛУЖБЫс реальным именем из списка. Если пул не запущен, прочитайте журналsudo journalctl -u ИМЯ-СЛУЖБЫ -n 80 --no-pagerи исправьте обнаруженную ошибку конфигурации, сокета или прав. Не запускайте произвольную новую версию PHP вместо той, которую выбрали для сайта. - Убедитесь в безопасной области применения обработчикаСопоставьте блок FilesMatch, DocumentRoot и правила безопасности каталога загрузок. Нельзя разрешать выполнение произвольных PHP-файлов внутри пользовательских uploads. В стандартной архитектуре PHP-FPM проверяйте соответствие SCRIPT_FILENAME фактическому пути скрипта; при ошибке типа
Primary script unknownисправьте сопоставление, а не открывайте все каталоги. - Сделайте копию и восстановите нужный обработчикСохраните конфигурацию Apache и настройки пула PHP-FPM. Если применяете изменения в Apache, выполните
sudo apache2ctl configtest; если меняете настройки PHP-FPM, используйте тест конфигурации конкретной установленной версии, указанный поставщиком пакета. После успешных проверок примените reload соответствующих служб через systemctl или панель. При ошибке возвратите резервные копии и верните сайт в режим обслуживания. - Включайте публичный сайт только после проверкиПроверьте выполнение безопасного уже существующего PHP-маршрута, который не раскрывает секреты, корректность 200/авторизации, работу статических файлов и логи Apache/PHP-FPM. Убедитесь, что исходный код PHP не отображается и не скачивается, а неизвестные PHP-файлы и загрузки не исполняются. Только после этого снимайте страницу обслуживания. Если исходники были доступны, отдельно проведите разбор доступа и замену потенциально затронутых секретов.
- Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Как проверить результат
PHP-маршрут выполняется на назначенном обработчике без ошибок проксирования; посетитель не может увидеть исходный PHP-код, при этом загрузки не запускаются как PHP. Проверены логи Apache и PHP-FPM.
#Если проблема не устранена
Если после восстановления обработчика 503 сохраняется, изучите ошибку proxy_fcgi и путь сокета; если 500 — логи приложения, права и совместимость версии PHP. Если выводится исходный код, не возвращайте сайт в публичный доступ до устранения риска.