04.10.2019 04:20 07.02.2020 03:50

Настройка Nginx для поддержки PHP на Debian/Ubuntu (nginx + php-fpm)

В этой статье я объясню, как настроить Nginx сервер для поддержки PHP на операционной системе Debian/Ubuntu. Мы разберемся в структуре конфигурационного файла, узнаем как работает Nginx и его модули. PHP-FPM — это менеджер процессов FastCGI (FCGI) в PHP, обычно используемый для высоконагруженных сайтов. Этот метод интеграции PHP использует Nginx. PHP-FPM 7.4 является последней стабильной версией, доступной для установки. По этой инструкции вы также можете установить PHP-FPM 7.3, PHP-FPM 7.2, PHP-FPM 7.1, PHP-FPM 7.0.

Эта инструкция была выполнена на операционных системах: Debian 10, Debian 9, Ubuntu 20.10, Ubuntu 20.04, Ubuntu 19.10.

Структура конфигурационного файла

Обычно главный конфигурационный файл nginx.conf расположен в директории /etc/nginx. В нем можно выделить блочные и простые директивы, которые относятся к определенному модулю Nginx. Блочные директивы также могут называться контекстом, если внутри фигурных скобок находятся другие директивы. Давайте рассмотрим конфигурационный файл по умолчанию (я удалил закомментированные части):

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
}

http {
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	gzip on;

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}

В этом файле прописаны глобальные настройки (базовые, SSL, логирование, Gzip), которые можно будет переопределить для конкретного виртуального хоста, которые подгружаются в самом конце:

Главный конфигурационный файл nginx.conf подключает все конфигурационные файлы и объединяет их в один, который запрашивается при запуске сервера. Этот файл нужно редактировать только в том случае, если вам необходимы другие глобальные настройки. Для начала, вы можете оставить его без изменений.

Виртуальные хосты

Конфигурационные файлы, которые описывают ваши домены, должны находиться в директории /etc/nginx/sites-available, а директория /etc/nginx/sites-enabled должна содержать символьные ссылки на активные виртуальные хосты. Каждый конфигурационный файл наследует директивы из главного конфигурационного файла nginx.conf и, при необходимости, они могут быть переопределены для конкретного виртуального хоста. Давайте рассмотрим конфигурацию сервера по умолчанию /etc/nginx/sites-available/default (я удалил закомментированные части):

server {
	listen 80 default_server;
	listen [::]:80 default_server;

	root /var/www/html;
	index index.html index.htm index.nginx-debian.html;

	server_name _;

	location / {
		try_files $uri $uri/ =404;
	}
}

В этом файле директивой listen задается прослушивание порта 80 (HTTP) для соединений IPv4 и IPv6, параметр default_server означает сервер по умолчанию. Директивой root задается корневая директория для запросов, т.е. директория, в которой будут находиться все файлы ваших сайтов. По умолчанию в качестве индекса используются файлы index.html, index.htm, index.nginx-debian.html, а название сервера не задано.

Установка PHP-FPM

Перед любой установкой программного обеспечения рекомендуется обновить список пакетов репозитория, выполнив команду в терминале:

sudo apt-get update

Установим PHP-FPM, выполнив команду в терминале:

sudo apt-get install php7.4-fpm

или

sudo apt-get install php-fpm

Вы можете узнать больше о том, как установить PHP 7.x в Debian и как установить PHP 7.x в Ubuntu.

Настройка Nginx для поддержки PHP-FPM

Перед тем как настроить Nginx для работы с обработчиком PHP, узнаем его версию, выполнив команду в терминале:

php -v

Если PHP еще не установлен, то будет отображаться ошибка:

bash: php: command not found

Отредактируем файл конфигурации сервера /etc/nginx/sites-available/default, добавив поддержку PHP-FPM:

sudo nano /etc/nginx/sites-available/default
server {
	listen 80 default_server;
	listen [::]:80 default_server;

	root /var/www/html;
	index index.php index.html index.htm index.nginx-debian.html;

	server_name _;

	location / {
		try_files $uri $uri/ =404;
	}

	location ~ \.php$ {
		include snippets/fastcgi-php.conf;
		fastcgi_pass unix:/run/php/php7.4-fpm.sock; # PHP version (php -v command)
	}
}

Сохраняем изменения и закрываем файл. Проверим конфигурацию на валидность, выполнив команду в терминале:

sudo nginx -t

Теперь применим изменения конфигурации, выполнив команду в терминале:

sudo service nginx reload

Тестирование Nginx с поддержкой PHP-FPM

Давайте проверим, что Nginx корректно передает файлы с расширением .php нашему обработчику PHP. Создадим тестовый файл, который будет возвращать информацию о нашем сервере, выполнив команду в терминале:

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

Давайте убедимся, что Nginx сервер корректно отображает содержимое, сгенерированное PHP скриптом, открыв данную страницу в браузере:

http://192.168.0.101/info.php

или для локального хоста

http://localhost/info.php

Если вы правильно настроили Nginx для поддержки PHP-FPM, то отобразится похожая страница:

Тестирование Nginx с поддержкой PHP-FPM

После проверки в целях безопасности вам необходимо удалить этот файл, выполнив команду в терминале:

sudo rm /var/www/html/info.php

Другие статьи