Интеграция Nginx и PHP: пошаговое руководство по установке и настройке

Раздел: Администрирование веб-серверов -> Настройка веб-сервера Nginx и PHP

Настройка веб-сервера Nginx и PHP: установка и интеграция

Для обработки динамических запросов в связке Nginx и PHP используется PHP-FPM (FastCGI Process Manager). Nginx выступает в роли прокси-сервера, передавая запросы к PHP-FPM. Ниже рассмотрены несколько способов установки и настройки, включая основной (рекомендуемый) и альтернативные варианты.

Как установить Nginx и PHP-FPM на Ubuntu/Debian?

Основной способ для современных систем - использование менеджера пакетов apt.

sudo apt update
sudo apt install nginx php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl php-zip

Install nginx php (установка nginx и php (англ.))

После установки запускаются службы:

sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl start php7.4-fpm
sudo systemctl enable php7.4-fpm

Nginx html php (обработка html и php в nginx)

Далее создаётся виртуальный хост для сайта. Пример конфигурации в /etc/nginx/sites-available/example.com:

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.php index.html index.htm;
    location / {
        try_files $uri $uri/ =404;
    }
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }
    location ~ /\.ht {
        deny all;
    }
}

Nginx index php (настройка index.php в nginx)

Включаем сайт и проверяем:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Nginx apache php (nginx и apache с php)

Создаём файл info.php в корневом каталоге для проверки:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/example.com/info.php

установка nginx php (установка nginx и php)

Открываем в браузере http://example.com/info.php. Должна отобразиться информация о PHP.

Ошибка 502 Bad Gateway

Возникает, если PHP-FPM не запущен или неверно указан сокет. Проверка:

sudo systemctl status php7.4-fpm
sudo ls -la /var/run/php/

Исправляется запуском службы или корректировкой пути в конфигурации Nginx.

Файлы PHP скачиваются, а не выполняются

Причина - отсутствие блока location для PHP. Необходимо убедиться, что файл конфигурации содержит корректную директиву fastcgi_pass.

Как установить Nginx и PHP-FPM на CentOS/RHEL 8+?

На дистрибутивах с пакетным менеджером yum/dnf установка отличается именами пакетов.

sudo dnf install nginx
sudo dnf install php-fpm php-mysqlnd php-json php-gd php-mbstring php-xml php-opcache

Запуск и включение:

sudo systemctl enable --now nginx
sudo systemctl enable --now php-fpm

Конфигурация виртуального хоста обычно находится в /etc/nginx/conf.d/. Пример с использованием Unix-сокета:

server {
    listen 80;
    server_name _;
    root /usr/share/nginx/html;
    index index.php index.html;
    location ~ \.php$ {
        fastcgi_pass unix:/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Ошибка доступа к сокету

Если Nginx не имеет прав на сокет, проверка:

sudo ls -la /run/php-fpm/www.sock

Решается добавлением пользователя nginx в группу apache (или изменением владельца сокета в конфиге PHP-FPM).

Как настроить Nginx с PHP через TCP-сокет?

Вместо Unix-сокета можно использовать TCP-порт (например, 127.0.0.1:9000). Это может потребоваться при разделении сервера Nginx и PHP на разные машины.

В конфигурации PHP-FPM (/etc/php/7.4/fpm/pool.d/www.conf) изменить строку:

listen = 127.0.0.1:9000

В Nginx указать:

fastcgi_pass 127.0.0.1:9000;

Проверка доступности порта

Если порт не слушается, проверка:

sudo netstat -tulpn | grep 9000

Исправляется перезагрузкой PHP-FPM и проверкой конфигурации.

Как использовать несколько версий PHP одновременно?

Иногда требуется поддержка разных версий для разных сайтов. Установка дополнительной версии:

sudo apt install php8.0-fpm php8.0-mysql

В конфигурации Nginx для каждого сервера указывается соответствующий сокет:

fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;

При этом оба пула PHP-FPM должны быть запущены.

Расширенные примеры настройки Nginx и PHP

Дополнительные примеры кода с результатами и пояснениями для углублённого понимания.

Пример 1: Полная конфигурация виртуального хоста с обработкой статики и PHP

Цель: минимизировать нагрузку на PHP, отдав обработку статических файлов напрямую Nginx.

Пример
server {
    listen 80;
    server_name example.com;
    root /var/www/example.com;

    # Настройка кэширования статики
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        try_files $uri =404;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # Запрет доступа к скрытым файлам
    location ~ /\. {
        deny all;
    }
}

Результат: статические файлы отдаются без участия PHP, повышая производительность.

Пример 2: Установка и настройка PHP-FPM с пулом для конкретного пользователя

Цель: обеспечить изоляцию между сайтами, запуская PHP-FPM от разных пользователей.

Пример
# /etc/php/7.4/fpm/pool.d/site1.conf
[site1]
user = site1user
group = site1user
listen = /run/php/php7.4-fpm-site1.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /

В Nginx указываем соответствующий сокет:

Пример
fastcgi_pass unix:/run/php/php7.4-fpm-site1.sock;

Проверка статуса пула:

Пример
sudo systemctl status php7.4-fpm
● php7.4-fpm.service - PHP 7.4 FastCGI Process Manager
   Loaded: loaded
   Active: active (running)
   ...

Пример 3: Использование HTTPS (Let's Encrypt) с Nginx и PHP

Цель: безопасное соединение через SSL/TLS.

Пример
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

После выполнения certbot автоматически изменит конфигурацию Nginx, добавив сервер для 443 порта с указанием ssl_certificate и ssl_certificate_key.

Пример результирующего серверного блока для HTTPS:

Пример
server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    root /var/www/example.com;
    index index.php;
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }
}

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

Результат: сайт доступен по HTTPS, небезопасный HTTP перенаправляется.

Пример 4: Обработка ошибок и логирование PHP

Цель: включить отображение ошибок для разработки, но скрыть в продакшне.

Пример
# /etc/php/7.4/fpm/php.ini
display_errors = On
error_reporting = E_ALL
error_log = /var/log/php_errors.log
log_errors = On

В конфигурации Nginx для конкретного location можно добавить:

Пример
fastcgi_intercept_errors on;
error_page 500 502 503 504 /50x.html;

Проверка логов PHP:

Пример
sudo tail -f /var/log/php_errors.log
[30-May-2025 10:15:30 UTC] PHP Warning:  Undefined array key "test" in /var/www/example.com/index.php on line 10

Установка Nginx и PHP (англ.) - comments

En
Install nginx php (php)