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

0
6412
Обложка статьи: Настройка 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.

Источники

Комментарии закрыты.