Интеграция 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-zipInstall nginx php (установка nginx и php (англ.))
После установки запускаются службы:
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl start php7.4-fpm
sudo systemctl enable php7.4-fpmNginx 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 nginxNginx 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