Как безопасно обновить версию PHP на сервере без ошибки 500: инструкция для новичков
Как проявляется сбой при некорректном обновлении PHP
Обновление версии PHP на «живом» сервере (Production) часто приводит к внезапной остановке работы сайтов и CMS (WordPress, Bitrix, Laravel). Основные симптомы некорректного перехода:
- В браузере появляется Белый экран смерти (White Screen of Death) или ошибка HTTP 500 Internal Server Error.
- Веб-сервер Nginx возвращает ошибку 502 Bad Gateway из-за того, что сокет старой службы PHP-FPM отключен, а новый еще не настроен.
- В логах ошибок
/var/log/nginx/error.logили/var/log/apache2/error.logфиксируются критические исключенияFatal error: Uncaught Error: Call to undefined function...из-за отсутствия нужных модулей. - Скрипты падают из-за синтаксических изменений и удаленных функций (например, удаление устаревших функций в PHP 8.x).
Сравнение рисков при обновлении PHP
| Сценарий | Что происходит | Последствия для сайта |
|---|---|---|
| Обновление «вслепую» | Удаление старой версии и установка новой без проверки расширений | Сайт падает с ошибкой 500/502, бизнес теряет клиентов |
| Параллельная установка | Установка новой версии рядом со старой и плавное переключение сокетов | Безопасный переход с возможностью мгновенного отката за 5 секунд |
Пошаговый регламент безопасного обновления PHP
Главное правило системного администратора: никогда не удаляйте старую версию PHP до тех пор, пока новая полностью не протестирована. Linux позволяет держать на одном сервере несколько версий PHP одновременно.
- Шаг 1. Фиксируем список установленных модулей:
Перед установкой новой версии сохраните список всех работающих модулей текущей версии (например, PHP 7.4 или 8.1):
php -m > ~/php_modules_backup.txt php -v - Шаг 2. Подключаем репозиторий со свежими версиями PHP:
В Ubuntu для установки любых версий PHP используется доверенный репозиторий Ондрея Сури (Ondřej Surý):
sudo apt update sudo apt install software-properties-common -y sudo add-apt-repository ppa:ondrej/php -y sudo apt update - Шаг 3. Устанавливаем новую версию PHP с необходимыми модулями:
Установим, например, PHP 8.3 вместе с базовыми расширениями, не удаляя текущую версию:
sudo apt install php8.3 php8.3-fpm php8.3-mysql php8.3-cli php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip php8.3-intl -y - Шаг 4. Настраиваем конфигурацию php.ini:
Перенесите критические лимиты (память, размер загружаемых файлов) из старого файла в новый
/etc/php/8.3/fpm/php.ini:sudo nano /etc/php/8.3/fpm/php.ini # Установите рабочие параметры: # memory_limit = 256M # upload_max_filesize = 64M # post_max_size = 64M # max_execution_time = 300Запустите службу новой версии:
sudo systemctl restart php8.3-fpm sudo systemctl status php8.3-fpm - Шаг 5. Переключаем веб-сервер на новую версию PHP:
В конфигурации вашего сайта в Nginx (
/etc/nginx/sites-available/yoursite.conf) измените путь к сокету обработки fastcgi:# Было: fastcgi_pass unix:/run/php/php7.4-fpm.sock; # Стало: fastcgi_pass unix:/run/php/php8.3-fpm.sock;Проверьте конфигурацию Nginx на ошибки и примените изменения:
sudo nginx -t && sudo systemctl reload nginx
План быстрого отката: Если после переключения сайт выдал ошибку 500, не паникуйте. Откройте файл виртуального хоста Nginx, верните путь к старому сокету (php7.4-fpm.sock) и выполните sudo systemctl reload nginx. Сайт восстановит работу мгновенно.
Частые вопросы (FAQ)
Как переключить версию PHP для консоли (CLI)?
Используйте стандартную системную утилиту: sudo update-alternatives --config php и выберите нужный номер версии из появившегося списка.
Почему после смены сокета в Nginx появилась ошибка 502 Bad Gateway?
Ошибка 502 означает, что веб-сервер не может подключиться к сокету. Убедитесь, что служба новой версии запущена (sudo systemctl status php8.3-fpm) и проверьте точное имя сокета в каталоге /run/php/.
Как узнать, какие функции в моем PHP-коде устарели перед обновлением?
Включите отображение предупреждений в php.ini (error_reporting = E_ALL) на тестовой копии сайта или воспользуйтесь утилитой статического анализа PHP_CodeSniffer с базой PHPCompatibility.
Можно ли запускать два разных сайта на одном сервере с разными версиями PHP?
Да. В Nginx для каждого сайта (Server Block) указывается свой индивидуальный fastcgi_pass сокет (например, для сайта А — php7.4-fpm.sock, а для сайта Б — php8.3-fpm.sock).