Для успешной настройки PHP на сервере с Nginx необходимо понимать особенности взаимодействия этих технологий. Nginx не поддерживает обработку PHP-файлов напрямую, поэтому требуется настройка промежуточного обработчика – FastCGI. В этом руководстве будут рассмотрены ключевые шаги для настройки эффективного соединения PHP и Nginx на Linux-системах.
1. Установка необходимых компонентов
Первым шагом является установка PHP и необходимых модулей, включая php-fpm – FastCGI процесс, который взаимодействует с Nginx для обработки запросов. Убедитесь, что у вас установлены последняя версия PHP и соответствующие модули. Для установки используйте следующие команды:
sudo apt update sudo apt install php-fpm php-mysql
После установки проверьте, что служба php-fpm работает:
sudo systemctl status php7.4-fpm
2. Конфигурация Nginx
Далее необходимо настроить конфигурацию Nginx для передачи запросов PHP в php-fpm. В файле конфигурации вашего сайта, обычно расположенном в /etc/nginx/sites-available/, добавьте следующие строки:
server { listen 80; server_name example.com; nginxEditroot /var/www/html; index index.php index.html index.htm; 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; } }
Здесь важным моментом является строка fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;, указывающая на сокет PHP-FPM. Убедитесь, что версия PHP в пути соответствует вашей установленной версии.
3. Перезапуск сервисов
После внесения изменений в конфигурацию необходимо перезапустить как Nginx, так и PHP-FPM:
sudo systemctl restart nginx sudo systemctl restart php7.4-fpm
Для проверки корректности работы можно создать тестовый файл info.php в корневой директории сайта:
Перейдите по адресу http://example.com/info.php для проверки работы PHP через Nginx. Если вы видите страницу с информацией о PHP, настройка выполнена правильно.
Установка PHP на сервер с Nginx
Для работы Nginx с PHP необходим PHP-FPM. Установите PHP и PHP-FPM с помощью пакетного менеджера. На Ubuntu выполните: sudo apt update && sudo apt install php-fpm
. Убедитесь, что установлена актуальная версия PHP: php -v
.
После установки проверьте статус службы PHP-FPM: sudo systemctl status php8.2-fpm
(замените версию при необходимости). Служба должна быть в состоянии active (running)
. Если нет – перезапустите: sudo systemctl restart php8.2-fpm
.
Для минимальной конфигурации убедитесь, что в /etc/php/8.2/fpm/php.ini
включены параметры cgi.fix_pathinfo=0
и заданы корректные значения memory_limit
, upload_max_filesize
, post_max_size
в соответствии с нагрузкой.
Убедитесь, что сокет PHP-FPM соответствует настройке в конфигурации Nginx. Обычно это /run/php/php8.2-fpm.sock
. Его путь можно уточнить в файле /etc/php/8.2/fpm/pool.d/www.conf
, параметр listen =
.
Если планируется использование дополнительных расширений (например, mysqli
, pdo_mysql
, mbstring
), установите их до перезапуска сервиса: sudo apt install php-mysql php-mbstring
.
После всех изменений выполните: sudo systemctl reload php8.2-fpm
, чтобы применить конфигурацию без прерывания работы процессов.
Настройка PHP-FPM для работы с Nginx
Убедитесь, что установлен PHP-FPM соответствующей версии. Например, для PHP 8.2 выполните:
sudo apt install php8.2-fpm
Откройте конфигурационный файл пула PHP-FPM, чаще всего находящийся по пути /etc/php/8.2/fpm/pool.d/www.conf
.
Измените директиву listen
на сокет, который будет использовать Nginx:
listen = /run/php/php8.2-fpm.sock
Проверьте права доступа:
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
Перезапустите PHP-FPM, чтобы применить изменения:
sudo systemctl restart php8.2-fpm
Настройте Nginx для передачи запросов к PHP-FPM через сокет. В блоке server
добавьте:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
Убедитесь, что параметр index
в конфигурации Nginx включает index.php
:
index index.php index.html;
Проверьте, что модуль cgi.fix_pathinfo
в /etc/php/8.2/fpm/php.ini
установлен в 0:
cgi.fix_pathinfo=0
После изменений перезапустите оба сервиса:
sudo systemctl restart php8.2-fpm
sudo systemctl restart nginx
Конфигурация Nginx для обработки PHP-запросов
Для корректной обработки PHP-запросов Nginx необходимо передавать их в PHP-FPM. Ниже представлен минимальный рабочий конфигурационный блок для сайта на PHP:
server {
listen 80;
server_name example.com;
root /var/www/example.com/public;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
}
- root: путь к директории проекта, обязательно указывать полный путь.
- try_files: обеспечивает корректную отдачу статических файлов и возврат 404 при отсутствии ресурса.
- location ~ \.php$: обрабатывает только .php-файлы, предотвращая доступ к другим скриптам.
- fastcgi_pass: указывает на сокет PHP-FPM. Для TCP-соединения можно использовать
127.0.0.1:9000
. - fastcgi_param SCRIPT_FILENAME: передаёт FPM полный путь к исполняемому PHP-файлу, критично для запуска скриптов.
- include fastcgi_params: подключает стандартный набор параметров FastCGI, необходим для корректной передачи данных.
После изменения конфигурации выполните проверку:
sudo nginx -t
Если ошибок нет – перезапустите Nginx:
sudo systemctl reload nginx
Убедитесь, что PHP-FPM запущен и использует тот же сокет, который указан в fastcgi_pass
. Проверить путь к сокету можно в файле /etc/php/8.2/fpm/pool.d/www.conf
.
Проверка работоспособности PHP на сервере с Nginx
Создайте файл info.php в директории, указанной в конфигурации Nginx как root. Обычно это /var/www/html или /usr/share/nginx/html:
sudo nano /var/www/html/info.php
Добавьте в файл следующий код:
<?php phpinfo(); ?>
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
После изменений выполните перезапуск сервисов:
sudo systemctl reload nginx
sudo systemctl restart php8.2-fpm
Удалите файл info.php сразу после проверки:
sudo rm /var/www/html/info.php
Оставление этого файла на сервере представляет угрозу безопасности.
Использование PHP с FastCGI для повышения производительности
Для подключения PHP через FastCGI необходимо использовать php-fpm (FastCGI Process Manager). Убедитесь, что установлен пакет php-fpm, и служба запущена:
sudo systemctl enable php8.2-fpm
sudo systemctl start php8.2-fpm
В конфигурации Nginx для нужного сайта добавьте блок location ~ \.php$ и пропишите параметры FastCGI. Пример:
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Использование сокета unix:/run/php/php8.2-fpm.sock предпочтительнее TCP-порта, так как это снижает задержки и уменьшает нагрузку на ядро ОС.
В конфигурации php-fpm (/etc/php/8.2/fpm/pool.d/www.conf) настройте параметры пула процессов:
pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 8
pm.max_children должен соответствовать количеству одновременных запросов, которое сервер может обрабатывать без выхода в swap. Точное значение определяется расчётом объёма ОЗУ и среднего потребления памяти одним процессом PHP.
Рекомендуется отключить display_errors и включить opcache в php.ini для повышения производительности:
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
FastCGI позволяет отделить веб-сервер от логики приложения, эффективно масштабируя нагрузку при помощи нескольких пулов или серверов php-fpm.
Настройка прав доступа для файлов и папок PHP на сервере Nginx
Для корректной работы PHP-скриптов под управлением Nginx важно правильно задать права доступа к файлам и каталогам проекта. Ошибки в правах могут привести к ошибкам 403 Forbidden или невозможности записи данных.
- Владелец файлов: пользователь, под которым работает PHP (обычно
www-data
). - Права на каталоги:
755
– полный доступ владельцу, чтение и выполнение – группе и остальным. - Права на файлы:
644
– чтение и запись владельцу, чтение – группе и остальным.
Измените владельца файлов и папок проекта:
sudo chown -R www-data:www-data /var/www/your-project
Установите корректные права доступа:
find /var/www/your-project -type d -exec chmod 755 {} \;
find /var/www/your-project -type f -exec chmod 644 {} \;
Для каталогов, в которые требуется запись (например, cache
, uploads
, storage
):
sudo chown -R www-data:www-data /var/www/your-project/storage
chmod -R 775 /var/www/your-project/storage
Убедитесь, что PHP-FPM работает от имени того же пользователя, что и владелец файлов. Откройте файл пула PHP-FPM:
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
Проверьте параметры:
user = www-data
group = www-data
Перезапустите PHP-FPM и Nginx:
sudo systemctl restart php8.2-fpm
sudo systemctl restart nginx
Решение распространённых ошибок при подключении PHP и Nginx
Ошибка 502 Bad Gateway возникает, если Nginx не может связаться с PHP-FPM. Проверьте, что в конфигурации Nginx правильно указан сокет или порт. Пример для сокета:
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
Убедитесь, что путь существует и совпадает с фактическим расположением сокета. Для подключения через порт используйте:
fastcgi_pass 127.0.0.1:9000;
Проверьте, что PHP-FPM запущен и слушает указанный порт или сокет:
sudo systemctl status php8.1-fpm
Ошибка «Primary script unknown» указывает на некорректную директиву fastcgi_param SCRIPT_FILENAME. Убедитесь, что путь формируется корректно:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
Если используется alias вместо root, переменная $document_root будет неверной. В таком случае укажите путь вручную:
fastcgi_param SCRIPT_FILENAME /var/www/site$fastcgi_script_name;
Ошибка 403 Forbidden может быть вызвана отсутствием прав доступа. Убедитесь, что пользователь PHP-FPM имеет права на чтение файлов сайта. Например, если используется пользователь www-data:
sudo chown -R www-data:www-data /var/www/site
Отсутствие обработки .php-файлов часто связано с отсутствием блока location ~ \.php$ в конфигурации. Пример корректного блока:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
PHP-файлы скачиваются вместо выполнения – признак того, что Nginx не передаёт их в PHP-FPM. Проверьте, что соответствующий location-блок не переопределён другим и что директива fastcgi_pass присутствует.