Установка и настройка ​Nginx + PHP-fpm в Debian

28Сен

Nginx – это веб сервер, который был выпущен в релиз в 2004 году. Данный сервер прост в использовании, но, несмотря на это, он прекрасно справляется с большим количеством подключений. Данная особенность обусловлена его внутренней архитектурой. Изначально он создавался как сервер, работающий со статическим содержимым (так называемый кэширующий сервер). В отличии от сервера Apache, Nginx не имеет встроенного интерпретатора, позволяющего обрабатывать запросы к динамическому контенту.

Для этого необходимо дополнительно налаживать взаимодействие между веб-сервером и приложением. Решением данной задачи успешно занимается менеджер процессов PHP-FPM(FastCGI). Важным моментом является то, что в работе с PHP связка Nginx + PHP-FPM показывает себя менее производительной чем Apache + php_mod.

Поэтому если на вашем сервере предъявляются высокие требования к производительности php, то лучше посмотреть в сторону связки apache + php_mod. Еще одним важным моментом является то, что сервер Nginx требует больших усилий по настройке, чем Apache.

Данная статья посвящена установке и простейшей настройке Nginx сервера в связке с менеджером процессов PHP-FPM в операционной системе Debian 8. Все операции выполняются под привилегиями пользователя root.

Для начала необходимо обновиться:

apt-get update

Далее устанавливаем nginx:

apt-get –y install nginx

После установки – проверим работоспособность сервера. Для этого просто откроем в веб-браузере адрес нашего сервера. Должно открыться следующее содержимое:

Это стандартная страница-заглушка сервера nginx. Следующим шагом будет установка пакета php5-fpm. Все очень просто:

apt-get -y install php5-fpm

Далее надо заняться настройкой. Сперва настроим сервер nginx. Конфигурационный файл находится по пути /etc/nginx/nginx.conf.

Откроем данный файл. Я использую текстовый редактор vi, но вы можете использовать любой другой, который вам удобен.

vi  /etc/nginx/nginx.conf

Давайте немножко разберемся в структуре самого файла. Весь файл отчасти напоминает программный код. В нем присутствуют директивы. Они делятся на 2 типа:

  • Простые – строка с операторами, заканчивающаяся символом «;». Например: pid /run/nginx.pid;
  • Блочные – директива, содержащая в себе дополнительные параметры, помещенные в фигурные скобки {}.

Внутри фигурных скобок можно задавать другие директивы. В таком случае это будет называться контекстом, а все директивы, которые находятся в конфигурационном файле, но не заключены ни в какие фигурные скобки – относятся к глобальному контексту или так называемому контексту main.

Строки отмеченные символом # - являются комментариями и не рассматриваются в конфигурации.

Как видите в файле присутствует директива:

include /etc/nginx/sites-enabled/*;

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

Теперь нам необходимо настроить виртуальный хост, который будет отвечать за наш простейший ресурс (пусть это будет test.net). Для начала создадим директорию для него. Сделаем это командой:

mkdir -p /var/www/test.net/html

Теперь создадим в данном каталоге файл index.html примерно следующего содержания:

<html>
   <head>
      <title>Hello World</title>
   </head>
   <body>
      <h>This is a test page.</h>
   </body>
</html>

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

cp /etc/nginx/sites-available/default /etc/nginx/sites-available/test.net

Далее откроем его для редактирования. Директива listen имеет параметры для default_server. Только один блок можно устанавливать с этим значением, оно означает, что данный блок будет обслуживать запросы, для которых не найдено ничего более походящего. Поэтому строки

listen 80 default_server;
listen [::]:80 default_server;

необходимо удалить из данного файла. Далее необходимо настроить корневой каталог, в котором находится содержимое нашего сайта. Для этого пропишем директиву root следующим образом:

root /var/www/test.net/html;

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

index index.html index.htm index.nginx-debian.html;

Следующей директивой server_name укажем имя сервера. В качестве значений укажем доменное имя и псевдоним для случая, когда доменное имя указывается с www префиксом.

server_name test.net www.test.net;

Далее остается задать только директиву location, которая устанавливает конфигурацию сайта в зависимости от имени URI, указанного в запросе. В нашем случае она будет выглядеть просто:

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

Это говорит о том, что сначала будут проверяться файлы, потом каталоги и если не будет найдено ничего подходящего, то будет выдан ответ Not Found (404).

Вот и все с конфигурационным файлом. Его итоговое содержание – следующее:

#cat /etc/nginx/sites-available/test.net
server {
     root /var/www/test.net/html;
     index index.html index.htm index.nginx-debian.html;
     server_name test.net www.test.net;
     location / {
           try_files $uri $uri/ =404;
     }
}

 

Обо всех остальных директивах и их значениях можно почитать в официальной документации nginx, которая находится вот тут «http://nginx.org/en/docs/».

Теперь мы имеем содержимое сайта и его конфигурационный файл. Осталось его включить. Для этого создадим символическую ссылку:

ln -s /etc/nginx/sites-available/test.net /etc/nginx/sites-enabled/

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

/etc/init.d/nginx restart

Давайте проверим работу созданного ресурса.

Для открытия страницы, возможно, на компьютере, с которого осуществляется проверка понадобиться добавить строчку в файл hosts:

xxx.xxx.xxx.xxx test.net

Где xxx.xxx.xxx.xxx – это IP-адрес сервера с установленным Nginx. Файл hosts, находится:

  • C:\Windows\System32\drivers\etc (в Win7);
  • /etc/hosts (в Debian).

Мы установили nginx и php5-fpm, а также сделали простейший сайт. Следующим шагом будет настройка php и его применение с nginx.

Для начала создадим на нашем виртуальном хосте страницу с php кодом. Сделаем файл /var/www/test.net/html/info.php следующего содержания:

 

<?php
phpinfo();
?>

 

Теперь откроем в браузере данную страницу http://test.net/info.php. В результате мы получим нечто следующее:

Но а как же выполнение php-кода? А php код у нас не выполнился, так как интерпретатор php не сконфигурирован в nginx. Давайте займемся этим.

Откроем наш конфигурационный файл /etc/nginx/sites-available/test.net. Добавим в него следующую блочную директиву:

 

location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

Данная директива описывает параметры обработки запросов, идущих к php файлам. Не буду описывать каждый параметр и его значение. Данную информацию можно найти в официальной документации вот тут http://nginx.org/en/docs/dirindex.html

Теперь наш файл конфигурации имеет следующий вид:

server {
root /var/www/test.net/html;
index index.html index.htm index.nginx-debian.html;
server_name test.net www.test.net;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

Сохраним изменения в файле и перезапустим наш сервер nginx.

/etc/init.d/nginx restart

Теперь снова попытаемся открыть страницу http://test.net/info.php. Результатом должно быть следующее:

Я на скриншоте отметил информацию, которая указывает на использование менеджера FPM.

По сути, простейшая настройка сервера nginx + php-fpm, на этом завершена. Простейший сайт создан и настроен на работу с php.

Продолжение смотрите в следующей статье про настройку PHP-FPM