Как подключить php к nginx

Как подключить php к nginx

Для успешной настройки 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 для работы с 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-запросов

Конфигурация 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

Проверка работоспособности 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

Решение распространённых ошибок при подключении 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 присутствует.

Вопрос-ответ:

Ссылка на основную публикацию