Установка и настройка PHP5 с nginx и PHP-FPM
Краткое содержание
- Установка PHP5 и необходимых модулей
- Установка APC через PECL
- Настройка /etc/php.ini (cgi.fix_pathinfo, date.timezone, extension)
- Запуск и автозапуск php-fpm
- Конфигурация nginx для передачи PHP на PHP-FPM (TCP и Unix-сокет)
- Проверка через phpinfo() и отладочные советы
- Дополнительные рекомендации по безопасности, чек-лист и мини-методология миграции
1 Установка PHP5
Мы используем PHP-FPM (FastCGI Process Manager) для работы PHP5 с nginx. PHP-FPM — это реализация PHP FastCGI с дополнениями, полезными для сайтов любого размера, особенно нагруженных.
Установите php-fpm вместе с php-cli и распространёнными модулями PHP (например, для работы с MySQL) командой:
yum install php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-mbstring php-xml php-xmlrpc php-mbstring php-snmp php-soapВажно: пакеты могут называться иначе в новой версии дистрибутива. Если команда не находит пакет, проверьте репозитории и имена пакетов для вашей версии CentOS/Red Hat.
2 Установка APC (opcode-кеш)
APC — свободный PHP opcode-кешер. Он ускоряет выполнение PHP-скриптов, сокращая время компиляции кода. Альтернативы: Opcache (в современных версиях PHP встроен), Xcache, eAccelerator.
Для установки APC через PECL нужны инструменты разработки CentOS. Установите их так:
yum install php-devel
yum groupinstall 'Development Tools'Затем соберите и установите APC:
pecl install apcПример интерактивного вывода установки (с пояснениями):
[root@example ~]# pecl install apc
downloading APC-3.1.13.tgz ...
Starting to download APC-3.1.13.tgz (171,591 bytes)
.................done: 171,591 bytes
55 source files, building
running: phpize
Configuring for:
PHP Api Version: 20100412
Zend Module Api No: 20100525
Zend Extension Api No: 220100525
Enable internal debugging in APC [no] : <-- ENTER
Enable per request file info about files used from the APC cache [no] : <-- ENTER
Enable spin locks (EXPERIMENTAL) [no] : <-- ENTER
Enable memory protection (EXPERIMENTAL) [no] : <-- ENTER
Enable pthread mutexes (default) [no] : <-- ENTER
Enable pthread read/write locks (EXPERIMENTAL) [yes] : <-- ENTER
building in /var/tmp/pear-build-rootVrjsuq/APC-3.1.13
......После успешной установки добавьте в конец /etc/php.ini строку:
extension=apc.soИ перезапустите php-fpm.
3 Настройка /etc/php.ini
Откройте файл конфигурации PHP:
vi /etc/php.ini- Отключите cgi.fix_pathinfo — это важная мера безопасности. Найдите и установите:
cgi.fix_pathinfo=0Почему: значение по умолчанию может позволять передавать неконтролируемые запросы в интерпретатор PHP, что открывает риск Remote Code Execution при наличии уязвимости.
Важно: после изменения перезапустите php-fpm.
- Установите часовой пояс, чтобы убрать предупреждения и корректно работать с функциями даты/времени. Пример:
[Date]
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = "Europe/Berlin"Замените “Europe/Berlin” на значение для вашей системы. Узнать текущее значение можно так:
cat /etc/sysconfig/clock
[root@server1 nginx]# cat /etc/sysconfig/clock
ZONE="Europe/Berlin"
[root@server1 nginx]#- Убедитесь, что строка для загрузки модуля APC присутствует (extension=apc.so).
4 Запуск php-fpm и автозапуск
Создайте системные ссылки и запустите сервис:
systemctl enable php-fpm.service
systemctl start php-fpm.servicePHP-FPM запускает демон, который по умолчанию слушает FastCGI на 127.0.0.1:9000 (TCP) или на Unix-сокете (если вы настроите его так).
5 Конфигурация nginx
Файл конфигурации nginx находится в /etc/nginx/nginx.conf. Откройте его:
vi /etc/nginx/nginx.confВы можете увеличить число worker-процессов и уменьшить keepalive_timeout для повышения производительности, например:
worker_processes 4;
keepalive_timeout 2;Виртуальные хосты находятся в /etc/nginx/conf.d и задаются блоками server {}. Отредактируйте default.conf:
vi /etc/nginx/conf.d/default.confПример конфигурации для обработки PHP через FastCGI (сохраните и включите этот блок):
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
root /usr/share/nginx/html;
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}Ключевые моменты:
- Добавьте try_files $uri =404; чтобы не передавать nginx неконтролируемые пути в PHP. Это снижает риск атак.
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; гарантирует корректный путь к файлу для PHP.
- Если хотите, укажите servername ; чтобы сделать виртуальный хост «catch-all».
После правок перезапустите nginx:
systemctl restart nginx.service6 Проверка работы через phpinfo()
Создайте файл /usr/share/nginx/html/info.php с содержимым:
Откройте в браузере http://<ваш-IP>/info.php (пример: http://192.168.1.105/info.php).

На странице phpinfo убедитесь, что Server API показывает FPM/FastCGI и что нужные модули, например MySQL, загружены:

Если страница не отображается, проверьте логи nginx (/var/log/nginx/error.log) и логи php-fpm (/var/log/php-fpm/www-error.log).
7 Перевод PHP-FPM на Unix-сокет (опционально)
Unix-сокет снижает накладные TCP-расходы и может дать небольшое улучшение производительности.
Откройте конфигурацию пула php-fpm (пример):
vi /etc/php-fpm.d/www.confИзмените строку listen так:
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php5-fpm.sockПерезапустите php-fpm:
systemctl restart php-fpm.serviceВ nginx поменяйте fastcgi_pass на путь к сокету. В примере ниже используется /var/run/php-fpm/php5-fpm.sock:
vi /etc/nginx/conf.d/default.conf location ~ \.php$ {
root /usr/share/nginx/html;
try_files $uri =404;
fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}Перезапустите nginx:
systemctl restart nginx.serviceПримечание: убедитесь, что права доступа к сокету позволяют nginx подключаться. Если nginx запускается от пользователя nginx, установите owner/group и права в www.conf (listen.owner/listen.group/listen.mode) или настройте systemd/SELinux соответствующим образом.
8 Дополнительно: безопасность и отладка
Important: всегда отключайте отображение подробных ошибок на продакшн-серверах. phpinfo() и display_errors = On оставляйте только в контролируемой среде.
Рекомендации безопасности:
- cgi.fix_pathinfo=0 — обязательно.
- Ограничьте доступ к info.php и файлам с отладочной информацией.
- Настройте права на сокет и директории: обычно nginx должен иметь доступ к сокету php-fpm.
- Рассмотрите включение OPCache (вместо APC для современных версий PHP).
- Если используется SELinux, проверьте boolean-переменные и контексты для nginx и php-fpm (отключать SELinux не рекомендуется; вместо этого настраивайте контексты).
Отладка:
- tail -f /var/log/nginx/error.log
- tail -f /var/log/php-fpm/www-error.log
- systemctl status php-fpm.service
- ss -ltnp | grep 9000 или ls -l /var/run/php-fpm/*.sock
9 Мини-методология миграции (шаги)
- Установите php-fpm и модули в тестовом окружении.
- Проверьте рабочую версию PHP и совместимость кода.
- Включите cgi.fix_pathinfo=0 и настройте date.timezone.
- Настройте nginx с try_files и корректными fastcgi_param.
- Переключитесь на Unix-сокет при необходимости и проверьте права.
- Выполните нагрузочное тестирование и мониторинг.
- Разверните изменения на продакшн поэтапно.
10 Чек-лист для администратора
- Установлены php-fpm и требуемые модули.
- Установлен opcode-кеш (Opcache/APC) или план по его включению.
- cgi.fix_pathinfo=0 в /etc/php.ini.
- date.timezone настроен.
- fastcgi_param SCRIPT_FILENAME корректен во всех vhost.
- try_files $uri =404 включён для PHP-локации.
- php-fpm запущен и включён в автозапуск.
- Если используется сокет — права и SELinux контексты проверены.
- Инструменты мониторинга и логирования настроены.
11 Когда это не подходит
- Если у вас современный PHP 7/8, используйте встроенный Opcache, а пакеты и конфигурации будут отличаться.
- Для очень высоконагруженных систем рассматривайте пулл-процессы и тонкую настройку pm.* в php-fpm.
- Если вы используете многосерверную архитектуру с выделёнными PHP-фермами, настройка через TCP может быть предпочтительнее Unix-сокета.
12 Глоссарий (1‑строчные определения)
- PHP-FPM: менеджер процессов PHP, реализующий FastCGI для лучшей стабильности и управления пулами.
- FastCGI: протокол обмена между веб-сервером и внешним процессом для обработки динамики.
- Opcode-cache: кеш скомпилированных PHP-операций для ускорения выполнения.
13 Ссылки
- nginx: http://nginx.org/
- nginx Wiki: http://wiki.nginx.org/
- PHP: http://www.php.net/
- PHP-FPM: http://php-fpm.org/
- MySQL: http://www.mysql.com/
- CentOS: http://www.centos.org/
Итог: следуя шагам в этой статье, вы получите надёжную связку nginx + PHP-FPM с минимальным риском уязвимостей и корректной настройкой окружения. Проверяйте логи и права доступа при переключении на Unix-сокеты.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента