Настройка web сервера nginx, php-fpm, php7 на CentOS 8

Статья о CentOS, поддержка которого закончилась. Для новых серверов выберите замену: Rocky, AlmaLinux или Astra. Описание ниже сохранено как справка по старым системам.
Нужны nginx и PHP-FPM на Linux. Заголовок про CentOS 8 и PHP 7 — оба сняты с поддержки. Ниже Alma/Rocky или Debian с PHP 8.3 из пакетов дистрибутива. HTTPS — отдельная статья.
1. Пакеты
sudo dnf install -y nginx php-fpm php-cli php-mbstring php-xml php-mysqlnd
sudo systemctl enable --now nginx php-fpm
# Debian: sudo apt install -y nginx php-fpm php-cli php-mbstring php-xml php-mysql
Версию PHP смотрите своей: php -v. Не ставьте PHP 7 «как в старой статье».
2. Пул FPM слушает сокет
Типичный путь пула: /etc/php-fpm.d/www.conf или /etc/php/8.3/fpm/pool.d/www.conf.
listen = /run/php-fpm/www.sock
; или 127.0.0.1:9000 — только localhost, не 0.0.0.0
sudo systemctl restart php-fpm
ss -lntup | grep -E 'php-fpm|9000'
Ожидание: сокет или 127.0.0.1:9000, не публичный адрес. Иначе PHP окажется в сети.
3. nginx отдаёт в FPM
server {
listen 80;
server_name www.example.com;
root /var/www/example;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php-fpm/www.sock;
}
}
echo '<?php echo "ok";' | sudo tee /var/www/example/index.php
sudo nginx -t && sudo systemctl reload nginx
curl -sI -H "Host: www.example.com" http://127.0.0.1/
Ожидание: 200 и тело ok. Путь сокета должен совпасть с пулом. Не включайте autoindex на проде без нужды.
Права и пользователи
PHP-FPM и nginx работают от разных пользователей. Если сокет недоступен nginx, вы получите 502. В файле пула задайте владельца сокета:
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
user = php-app
group = php-app
В Debian пользователь веб-сервера называется www-data. Для каждого сайта заведите отдельный пул и отдельного пользователя: взлом одного сайта не даст доступа к файлам другого.
Базовая безопасность PHP
; /etc/php.ini или /etc/php/8.3/fpm/php.ini
expose_php = Off
display_errors = Off
log_errors = On
cgi.fix_pathinfo = 0
display_errors = Off важно на рабочем сервере: сообщения об ошибках раскрывают пути и устройство приложения. Параметр open_basedir в пуле ограничивает каталоги, к которым имеет доступ сайт. Ограничение функций (disable_functions) проверяйте вместе с приложением: у некоторых CMS они ломают работу.
Проверка конфигурации и диагностика
php-fpm -t # Debian: php-fpm8.3 -t
sudo tail -n 30 /var/log/nginx/error.log
sudo journalctl -u php-fpm --since "10 min ago"
| Симптом | Причина |
|---|---|
| 502 Bad Gateway | FPM не запущен или сокет недоступен nginx |
| Скачивается PHP-файл вместо выполнения | В nginx нет блока location ~ \.php$ |
| «File not found» | Неверный SCRIPT_FILENAME или root |
Включите HTTPS: TLS в nginx. Статья описывает CentOS 8 как историческую справку: на новых системах используйте Rocky Linux и PHP 8.x.
Как проверить
php -v
ss -lntup | grep -E ':80|php-fpm'
curl -s -H "Host: www.example.com" http://127.0.0.1/
PHP 8.x, nginx на 80, FPM не на 0.0.0.0, страница отдаёт PHP. Дальше закройте 80 редиректом на 443.
Источники
- nginx, Configuring FastCGI Servers. URL: https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html.


















