Установка nginx на ubuntu. Тонкая настройка Nginx. Защита, оптимизация

  • Администрирование доменных имен ,
  • Настройка Linux ,
  • Серверное администрирование ,
  • Системное администрирование
  • Здравствуй, уважаемый пользователь Хабрахабра. Мое повествование будет о том, как подготовить почву для локальной веб-разработки проектов в операционной системе Ubuntu 16.04.1 LTS.

    В данной статье хочется развеять и разъяснить возможные трудности связанные с установкой и настройкой ПО, которое требуется для современной веб-разработки, с которыми возможно сталкиваются начинающие разработчики и не только.

    Технологии которые будут использованы в статье: nginx, php-fpm.

    Перед началом повествования, хочу отметить, что я проделывал все эти действия на «голой» системе.
    Я буду работать с пакетным менеджером aptitude. Так же рекомендую обновить индекс пакетов и сами пакеты перед установкой ПО. В статье мы проделаем эти действия вместе.

    Поехали!

    Установка пакетного менеджера aptitude , обновление индекса и пакетов

    Устанавливаем:

    Sudo apt install aptitude
    Обновляем индекс.

    Sudo aptitude update
    Обновляем пакеты (команда обновит все пакеты, для которых есть новые версии, если потребуется удаление пакетов, то оно будет выполнено).

    Sudo aptitude full-upgrade

    Установка и настройка nginx (версия >= 1.10.0)

    Устанавливаем.

    Sudo aptitude install nginx
    Запускаем.

    Sudo service nginx start
    Проверяем версию, чтобы убедиться что не установили старую, то есть ниже 1.10.0.

    Установку и запуск произвели, теперь пойдем в каталог туда куда установлен наш nginx и посмотрим на его структуру. Каталог nginx находится по такому пути:

    Cd /etc/nginx/
    Посмотреть содержимое директории можно командой ls, с флагами -la будет удобнее просматривать содержимое каталога (в действительности эту команду с конкретными флагами можно описать детальнее и вернее, но у нас сегодня другая тема).

    Ls -la
    Наc интересуют в данный момент два каталога, которые вы видите на скриншоте. Это каталоги sites-available и sites-enabled.

    Давайте перейдем в каталог sites-available и начнем конфигурировать наш виртуальный хост (сайт).

    Cd /etc/nginx/sites-available
    Перед началом создания конфигурационного файла, проверим что лежит у нас в данном каталоге. В моей случае каталог не пустой, в нем уже есть конфигурационные файлы, я их затер, чтобы не вводить вас в заблуждение.

    Важное отступление

    В случае установки nginx «с нуля», именно «с нуля», так как при удалении nginx командой
    sudo apt-get remove nginx или sudo apt remove nginx конфигурационные файлы остаются и если вы вдруг будете не понимать, почему nginx не работает и захотите его переустановить (обычно к такому прибегают начинающие пользователи Linux), то и после переустановки он не будет корректно работать, из-за того что в старых конфигурационных файлах (они не удаляются после удаления командой remove) прописаны неверные настройки, их придется удалить, либо настроить верно, только тогда nginx заработает.

    Рекомендую удалять командой sudo apt-get purge nginx или sudo apt purge nginx . Если вы используете пакетный менеджер aptitude, то команда sudo aptitude purge nginx удаляет пакет полностью со всеми зависимостями и конфигурационными файлами.


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

    Ls -la

    Создадим свой конфигурационный файл, который будет соответствовать названию домена нашего локального сайта (или реального, если уже знаете его название). Это удобно, в будущем, когда будет много конфигурационных файлов, то это избавит вас от путаницы в них. У меня этот файл будет называться project.local.

    Sudo touch project.local
    Посмотрим что получилось.

    Теперь откроем его в редакторе, я открою его в nano.

    Sudo nano project.local
    Видим что он у нас пустой. Теперь перейдем к формированию нашего файла. Нужно привести конфигурацию к такому виду, как написано ниже. Я опишу только жизненно важные директивы этого файла, описывать остальное не буду, так как это не является на данный момент важным, все-таки у нас тема базовой настройки. Этих настроек с «горкой» хватит для разработки проектов локально, не только мелких, но и довольно крупных. В следующих статьях опишу отдельно каждые использованные директивы (именно так называются строки, например server_name) этого файла.

    Смотрите комментарии прям в конфигурационном файле.

    Server { listen 80; # порт, прослушивающий nginx server_name project.local; # доменное имя, относящиеся к текущему виртуальному хосту root /home/stavanger/code/project.local; # каталог в котором лежит проект, путь к точке входа index index.php; # add_header Access-Control-Allow-Origin *; # serve static files directly location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ { access_log off; expires max; log_not_found off; } location / { # add_header Access-Control-Allow-Origin *; try_files $uri $uri/ /index.php?$query_string; } location ~* \.php$ { try_files $uri = 404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; # подключаем сокет php-fpm fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.ht { deny all; } }
    Сохраняем файл. Теперь нам надо проверить, нет ли в нем ошибок. Сделать мы это можем командой.

    Sudo nginx -t
    Если видим такую информацию как на скриншоте, значит у нас все верно, может продолжать настройку. Если вы получаете какие-либо ошибки, стоит перепроверить конфигурационный файл.

    Теперь нам надо активировать конфигурационный файл, в каталоге /etc/nginx/sites-enabled/ необходимо создать симлинк (символическая ссылка). Если у вас nginx был установлен «с нуля», то в этом каталоге есть симлинк на файл default, про который рассказывалось выше, его можно удалить, если он вам не требуется. Переходим в нужный каталог.

    Cd /etc/nginx/sites-enabled/
    Теперь мы в нужном каталоге. Давайте создадим наш симлинк. Для создания используется команда ln с флагом -s, далее мы укажем путь до нашего конфига project.local.

    Sudo ln -s /etc/nginx/sites-available/project.local
    Посмотрим на наш созданный симлинк.

    Чтобы убедиться что мы делаем еще все верно опять запустим команду.

    Файл hosts

    Этот файл находится по пути /etc/hosts. Наличие в нем записей, позволяет запускать nginx с использованием в качестве домена localhost. В этом файле можно присваивать альтернативные псевдонимы, например для нашего проекта project.local, мы присвоим домен project.local.

    Открываем файл в редакторе nano.

    Sudo nano /etc/hosts
    У вас в этом файле будет и другая информация, просто игнорируйте ее. Вам всего лишь нужно добавить строку как на моем скриншоте.

    Установка php-fpm (>=7.0)

    sudo aptitude install php-fpm
    Проверяем установленную версию, на всякий случай, хотя в Ubuntu 16.04.1 в репозиториях лежит именно 7.0 версия.

    Php-fpm7.0 -v

    Убеждаемся что все ок. Стартуем php-fpm.

    Sudo service php7.0-fpm start
    Если будете править конфиги, то не забывайте рестартовать демон. Это делает так. Но нам это не потребуется.

    Sudo service php7.0-fpm restart
    На этом установка и настройка php-fpm закончена. Правда, это все. Это не магия, путь до сокета php-fpm у нас уже был прописан в конфигурационном файле. Конечно, вам могут понадобиться какие-либо расширения php для разработки личных проектов, но их вы можете поставить по мере того как они будут требоваться.

    Теперь пойдем для в каталог с нашим проектом, у меня он лежит по такому пути.

    Cd /home/stavanger/code/project.local
    Поднимемся на каталог выше и сделаем права 777 (то есть мы будем делать полные права каталогу с нашим проектом project.local). В будущем это избавим нас от лишних проблем.

    Cd .. sudo chmod -R 777 project.local
    На этом настройка ПО завершена, давайте создадим тестовый файл в нашем рабочем каталоге project.local и убедимся что все работает. Я создам файл index.php с таким содержанием.

    Идем в браузер и видим что у нас все прекрасно работает! Интерпретатор php в том числе.

    С уважением к читателям, Stavanger.

    Nginx? Назначение, особенности, варианты настроек - это вещи, с которыми должен быть ознакомлен каждый веб-разработчик, чтобы тестировать свои наработки.

    О nginx замолвим слово

    Данный инструмент обладает одним главным и несколькими рабочими процессами. Первый занимается чтением и проверкой конфигурации. Также под его контролем находится управление рабочими процессами. Задача последних - обрабатывать поступающие запросы. В nginx применяется модель, что базируется на событиях. Также используются механизмы, зависимые от операционной системы, чтобы добиться эффективного распределения запросов непосредственно между рабочими процессами. Их количество всегда обозначено в конфигурационном файле. Значение может быть как фиксированным, так и устанавливаться автоматически, ориентируясь по числу процессорных ядер, с которыми можно работать. В nginx настройка системы и модулей проводится с помощью конфигурационного файла. Поэтому, если надо что-то изменить, то искать необходимо именно его. Обычно он находится в директиве /etc/nginx (но путь может меняться при использовании других систем) и имеет расширение.conf.

    Запуск, перезагрузка и логи

    Для этого необходимо заставить работать исполняемый файл. Настройка nginx-сервера возможна, только когда он запущен. Управление осуществляется благодаря вызову исполняемого файла с параметром -s. Для этого используйте такую запись:

    nginx -s сигнал

    В данном случае подставлять можно такие команды (должны поступать от пользователя, что запустил инструмент):

    1. Stop. Используется для быстрого завершения работы.
    2. Reload. Команда необходима, чтобы перезагрузить конфигурационный файл. Дело в том, что любые изменения не будут применены, пока файл работает. И чтобы они вступили в силу, необходима перезагрузка. Как только будет получен этот сигнал, главный процесс начнёт проверять правильность синтаксической составляющей конфигурационного файла и попробует применить имеющиеся там указания. В случае неудачи он откатит изменения и будет работать со старыми параметрами. Если всё произошло успешно, то будут запущены новые рабочие процессы, а старым будет отправлено требование завершиться.
    3. Quit. Применяется для плавного завершения работы. Применяется, если необходимо подождать, пока закончат обслуживаться текущие запросы.
    4. Reopen. Закрыть и открыть лог-файлы.

    Использование утилит

    Настройка процессов может осуществляться также с помощью средств Unix (в качестве примера будет рассмотрена утилита kill). Обычно они используют механизм отправки процессу сигнала напрямую с данными. Увязываются они с помощью ID. Эти данные хранятся в файле nginx.pid. Допустим, что нас интересует процесс №134. Тогда для плавного завершения нам необходимо отправить следующую информацию:

    kill -s QUIT 1628

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

    ps -ax | grep nginx

    То есть, как видите, при использовании дополнительного инструментария указывается, что идёт именно его применение. А теперь давайте сконцентрируемся на том, как совершается nginx-настройка.

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

    Установка и настройка nginx предусматривает работу с модулями. Они настраиваются с помощью директив, которые указываются в конфигурационном файле. Они бывают простыми и блочными. Первый тип директив состоит из имени и параметров, которые разделяются с помощью пробелов, а их конец указывается точкой с запятой - (;). Блочная имеет похожее строение. Но в данной директиве вместо окончания размещается набор дополнительных инструкций, которые размещают в фигурных скобах ({ указания }). Если в них можно разместить имена и параметры других процессов, то называются такие конструкции уже контекстом. В качестве примера можно привести http, location и server.

    Раздача статического содержимого

    Это одна их самых важных задач, которая стоит перед конфигурацией nginx. Под раздачей статистического содержимого подразумевают изображения и HTML-страницы (не динамические). Допустим, что нам нужна разовая работа по настройке nix nginx кластера. Сложно ли это сделать? Нет, и давайте рассмотрим пример. Прежде чем приступать к нему, необходимо детализировать условия задачи. Так, зависимо от запросов, файлы будут идти из разных локальных каталогов. Так, в /data/www мы имеем HTML-документы. А в каталоге /data/images содержатся изображения. Оптимальная настройка nginx в данном случае требует редактирования конфигурационного файла, в котором необходимо настроить блок server внутри http. Для поддержки будет использоваться также два location.

    Реализация: server

    Итак, для начала нам необходимо создать сами каталоги и разместить в них файлы с необходимыми расширениями (в html необходимо добавить содержимое). Затем открываем конфигурационный файл. В нём по умолчанию уже есть несколько блоков server, которые в массе своей закомментированы. Чтобы добиться оптимального результата, этот процесс необходимо проделать по отношению ко всем составляющим по умолчанию. Затем добавляем новый блок server с помощью такого кода:

    Конфигурационный файл может работать с несколькими такими блоками. Но они должны отличаться своими именами и портами, с помощью которых происходит получение данных.

    Реализация: location

    Определяется внутри server:

    Наличие знака «/» необходимо, чтобы сравнивать получаемые данные и смотреть, есть ли такой адрес из обработанного запроса здесь. Если никаких проблем нет, то указываем путь /data/www к необходимому файлу, что находится в данной локальной системе. Если совпадение есть с несколькими блоками, то выбирается тот, у которого самый длинный префикс. В приведённом примере его длина равняется единице, то есть использование будет исключительно в том случае, если нет «конкурентов». Теперь давайте его усовершенствуем:

    location /images/ {

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

    location /images/ {

    Это рабочий вариант, который случает стандартный Этот сервер без проблем может быть доступный на локальном компьютере, если пройти по адресу: http://localhost/. Как же это всё будет работать?

    Принцип функционирования примера

    Итак, когда придут запросы, что начинаются с с /images, то сервером файлы из соответствующего каталога будут отправляться пользователю. При его отсутствии будет передана информация, указывающая на ошибку 404. Если проводится настройка nginx на локальном компьютере, то при запросе http://localhost/images/example.png нами будет получен файл, месторасположение которого /data/images/example.png. При указании одного символа «/» поиск будет проводиться в директории /data/www. Но мы только изменили конфигурацию. Чтобы она начала работать, её необходимо перезагрузить. Для этого используйте команду nginx -s reload. В случае когда нормальная работа не является возможной, то в файлах error.log и access.log, расположенных в директиве /usr/local/nginx/logs, вы сможете поискать причину неисправностей.

    Создание простого прокси-сервера

    Можно сказать относительно nginx - настройка данного объекта является одним из частых применений (и довольно легким, между прочим). Здесь используется принцип сервера, который принимает запрос, а потом осуществляет перенаправление их к необходимым сайтам. После этого ожидается ответ от них, который направляет их к тому, кто поставил задачу. Поэтому давайте рассмотрим пример создания базовой точки. Она будет заниматься обслуживанием запросов пользователей и предоставлять им изображения из локального каталога. Итак, к блоку http добавляем ещё один server с таким содержимым:

    А теперь давайте для вас расшифрую: создаётся простой сервер. Он будет прослушивать Не указать listen, то сервер будет работать на 80-м. Отображаться будут все запросы в рамках локальной файловой системы, которые направлены на каталог /data/up1 (конечно, его перед этим необходимо будет создать). Для возможности проверки там необходимо поместить файл index.html. Благодаря размещению директивы root в контексте server мы сможем воспользоваться location при любых условиях (поскольку, таким образом, снимаются ограничения доступа). Теперь работаем над созданием прокси-сервера. Для его работы нам понадобится директива proxy_pass, для которой будут указаны протокол, имя, а также порт объекта как параметры (при локальном подключении это будет выглядеть как http://localhost:8080). Получится такой результат:

    proxy_pass http://localhost:8080;

    location /images/ {

    Если вы рассматриваете код и анализируете его, то можете заметить, что второй блок location был изменён. Так, в данном случае он может работать с типичными расширениями изображений. Немного по-другому его можно было бы отобразить таким образом:

    location ~ \.(gif|jpg|png)$ {

    root /data/images;

    Итоговая конфигурация прокси-сервера выглядит следующим образом:

    proxy_pass http://localhost:8080/;

    location ~ \.(gif|jpg|png)$ {

    root /data/images;

    Он будет отфильтровывать запросы, в конце которых имеются указанные расширения, и отправлять их тому, кто попросил файлы. Не забывайте, что при желании проверить файл конфигурации его необходимо будет перезагрузить. И поверьте, это простейшая nginx-настройка. Если открыть конфигурационный файл сервера «Вконтакте» или другой крупной компании, у них будет кода больше, чем слов в этой статье.

    Здравствуй, уважаемый пользователь Хабрахабра. Мое повествование будет о том, как подготовить почву для локальной веб-разработки проектов в операционной системе Ubuntu 16.04.1 LTS.

    В данной статье хочется развеять и разъяснить возможные трудности связанные с установкой и настройкой ПО, которое требуется для современной веб-разработки, с которыми возможно сталкиваются начинающие разработчики и не только.

    Технологии которые будут использованы в статье: nginx, php-fpm.

    Перед началом повествования, хочу отметить, что я проделывал все эти действия на «голой» системе.
    Я буду работать с пакетным менеджером aptitude. Так же рекомендую обновить индекс пакетов и сами пакеты перед установкой ПО. В статье мы проделаем эти действия вместе.

    Поехали!

    Установка пакетного менеджера aptitude , обновление индекса и пакетов

    Устанавливаем:

    Sudo apt install aptitude
    Обновляем индекс.

    Sudo aptitude update
    Обновляем пакеты (команда обновит все пакеты, для которых есть новые версии, если потребуется удаление пакетов, то оно будет выполнено).

    Sudo aptitude full-upgrade

    Установка и настройка nginx (версия >= 1.10.0)

    Устанавливаем.

    Sudo aptitude install nginx
    Запускаем.

    Sudo service nginx start
    Проверяем версию, чтобы убедиться что не установили старую, то есть ниже 1.10.0.

    Установку и запуск произвели, теперь пойдем в каталог туда куда установлен наш nginx и посмотрим на его структуру. Каталог nginx находится по такому пути:

    Cd /etc/nginx/
    Посмотреть содержимое директории можно командой ls, с флагами -la будет удобнее просматривать содержимое каталога (в действительности эту команду с конкретными флагами можно описать детальнее и вернее, но у нас сегодня другая тема).

    Ls -la
    Наc интересуют в данный момент два каталога, которые вы видите на скриншоте. Это каталоги sites-available и sites-enabled.

    Давайте перейдем в каталог sites-available и начнем конфигурировать наш виртуальный хост (сайт).

    Cd /etc/nginx/sites-available
    Перед началом создания конфигурационного файла, проверим что лежит у нас в данном каталоге. В моей случае каталог не пустой, в нем уже есть конфигурационные файлы, я их затер, чтобы не вводить вас в заблуждение.

    Важное отступление

    В случае установки nginx «с нуля», именно «с нуля», так как при удалении nginx командой
    sudo apt-get remove nginx или sudo apt remove nginx конфигурационные файлы остаются и если вы вдруг будете не понимать, почему nginx не работает и захотите его переустановить (обычно к такому прибегают начинающие пользователи Linux), то и после переустановки он не будет корректно работать, из-за того что в старых конфигурационных файлах (они не удаляются после удаления командой remove) прописаны неверные настройки, их придется удалить, либо настроить верно, только тогда nginx заработает.

    Рекомендую удалять командой sudo apt-get purge nginx или sudo apt purge nginx . Если вы используете пакетный менеджер aptitude, то команда sudo aptitude purge nginx удаляет пакет полностью со всеми зависимостями и конфигурационными файлами.


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

    Ls -la

    Создадим свой конфигурационный файл, который будет соответствовать названию домена нашего локального сайта (или реального, если уже знаете его название). Это удобно, в будущем, когда будет много конфигурационных файлов, то это избавит вас от путаницы в них. У меня этот файл будет называться project.local.

    Sudo touch project.local
    Посмотрим что получилось.

    Теперь откроем его в редакторе, я открою его в nano.

    Sudo nano project.local
    Видим что он у нас пустой. Теперь перейдем к формированию нашего файла. Нужно привести конфигурацию к такому виду, как написано ниже. Я опишу только жизненно важные директивы этого файла, описывать остальное не буду, так как это не является на данный момент важным, все-таки у нас тема базовой настройки. Этих настроек с «горкой» хватит для разработки проектов локально, не только мелких, но и довольно крупных. В следующих статьях опишу отдельно каждые использованные директивы (именно так называются строки, например server_name) этого файла.

    Смотрите комментарии прям в конфигурационном файле.

    Server { listen 80; # порт, прослушивающий nginx server_name project.local; # доменное имя, относящиеся к текущему виртуальному хосту root /home/stavanger/code/project.local; # каталог в котором лежит проект, путь к точке входа index index.php; # add_header Access-Control-Allow-Origin *; # serve static files directly location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ { access_log off; expires max; log_not_found off; } location / { # add_header Access-Control-Allow-Origin *; try_files $uri $uri/ /index.php?$query_string; } location ~* \.php$ { try_files $uri = 404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; # подключаем сокет php-fpm fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.ht { deny all; } }
    Сохраняем файл. Теперь нам надо проверить, нет ли в нем ошибок. Сделать мы это можем командой.

    Sudo nginx -t
    Если видим такую информацию как на скриншоте, значит у нас все верно, может продолжать настройку. Если вы получаете какие-либо ошибки, стоит перепроверить конфигурационный файл.

    Теперь нам надо активировать конфигурационный файл, в каталоге /etc/nginx/sites-enabled/ необходимо создать симлинк (символическая ссылка). Если у вас nginx был установлен «с нуля», то в этом каталоге есть симлинк на файл default, про который рассказывалось выше, его можно удалить, если он вам не требуется. Переходим в нужный каталог.

    Cd /etc/nginx/sites-enabled/
    Теперь мы в нужном каталоге. Давайте создадим наш симлинк. Для создания используется команда ln с флагом -s, далее мы укажем путь до нашего конфига project.local.

    Sudo ln -s /etc/nginx/sites-available/project.local
    Посмотрим на наш созданный симлинк.

    Чтобы убедиться что мы делаем еще все верно опять запустим команду.

    Файл hosts

    Этот файл находится по пути /etc/hosts. Наличие в нем записей, позволяет запускать nginx с использованием в качестве домена localhost. В этом файле можно присваивать альтернативные псевдонимы, например для нашего проекта project.local, мы присвоим домен project.local.

    Открываем файл в редакторе nano.

    Sudo nano /etc/hosts
    У вас в этом файле будет и другая информация, просто игнорируйте ее. Вам всего лишь нужно добавить строку как на моем скриншоте.

    Установка php-fpm (>=7.0)

    sudo aptitude install php-fpm
    Проверяем установленную версию, на всякий случай, хотя в Ubuntu 16.04.1 в репозиториях лежит именно 7.0 версия.

    Php-fpm7.0 -v

    Убеждаемся что все ок. Стартуем php-fpm.

    Sudo service php7.0-fpm start
    Если будете править конфиги, то не забывайте рестартовать демон. Это делает так. Но нам это не потребуется.

    Sudo service php7.0-fpm restart
    На этом установка и настройка php-fpm закончена. Правда, это все. Это не магия, путь до сокета php-fpm у нас уже был прописан в конфигурационном файле. Конечно, вам могут понадобиться какие-либо расширения php для разработки личных проектов, но их вы можете поставить по мере того как они будут требоваться.

    Теперь пойдем для в каталог с нашим проектом, у меня он лежит по такому пути.

    Cd /home/stavanger/code/project.local
    Поднимемся на каталог выше и сделаем права 777 (то есть мы будем делать полные права каталогу с нашим проектом project.local). В будущем это избавим нас от лишних проблем.

    Cd .. sudo chmod -R 777 project.local
    На этом настройка ПО завершена, давайте создадим тестовый файл в нашем рабочем каталоге project.local и убедимся что все работает. Я создам файл index.php с таким содержанием.

    Идем в браузер и видим что у нас все прекрасно работает! Интерпретатор php в том числе.

    С уважением к читателям, Stavanger.

    Связка nginx, php-fpm, php-apc позволяет ускорить работу сайта при правильной настройке по сравнению с apache и снизить нагрузку на сервер. Особенно это актуально при настройке работы сайтов с большим количеством посещений. Это сочетание компонентов в последнее время становится все более популярным, но настройка при этом достаточно несложная и делается быстро. Давайте посмотрим пример настройки на Debian’e. Настроим nginx с кэшем + php-fpm + php-apc.

    Для начала вспомним, что это за компоненты. Nginx — это быстрый и гибкий веб-сервер, который к тому же позволяет использовать кеширование. Php-fpm — это PHP FastCGI Process Manager, менеджер процессов FastCGI для PHP. FastCGI — это бинарный протокол клиент-серверного взаимодействия, позволяющий обрабатывать запросы многопоточно, в отличие от однопоточного CGI. А php-apc — это Alternative PHP Cache, свободный фреймворк для кеширования байт-кода PHP в памяти, что в разы может ускорить выполнение PHP, при неоднократном использовании кода, естественно. Таким образом, ускорение должно быть в нескольких местах. Первое — кэш nginx’а, второе — более быстрая отдача статики при помощи nginx’а по сравнению с apache, третье — кэширование байт-кода PHP, четвертое — более быстрое исполнение кода php при помощи php-fpm по сравнению со связкой apache + mod_php5.

    Установка пакетов

    Устанавливаем пакеты:

    Apt-get install nginx php5-fpm php-apc php5-mysql

    Всё необходимое установится по зависимостям

    Настройка nginx

    После установки пакетов необходимо задать настройки для nginx. Создаем файл настроек nginx для нашего сайта, назовем его «site»

    Touch /etc/nginx/sites-available/site

    В файл запишем следующее:

    Server { # Слушаем 80 порт по IPv4 listen 0.0.0.0:80; # Название сайта (доменное имя) server_name site; # Индексный файл index index.php; # Корневая директория сайта root /var/www/site; # Запрещаем доступ к файлам.htaccess и.htpasswd location ~ /\.ht { deny all; } # Отдача статики location ~ \.(jpg|jpeg|ico|gif|css){ # Отключаем записи об отдаче статических файлов # Это поможет снизить количество операций записи на диск access_log off; expires max; root /var/www/site; } location ~ \.php { include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php-fpm-site; fastcgi_index index.php; # Включаем кэш nginx, подключаем зону my-cache proxy_cache my-cache; # Таймауты хранения страниц в кэше в зависимости # от ответа сервера. 200 и 302 - 60 минут, 404 - 1 минута proxy_cache_valid 200 302 60m; proxy_cache_valid 404 1m; # Директория для временного хранения proxy_temp_path /var/cache/nginx/tmp; } }

    Ln -s /etc/nginx/sites-available/site /etc/nginx/sites-enabled

    В файл /etc/nginx/nginx.conf надо добавить кэш, который мы уже записали для использования. В начало секции http вставляем следующую строчку:

    Proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my-cache:8m max_size=128m inactive=600m;

    Эта строчка означает следующее: директория для хранения кэша — /var/cache/nginx. levels — уровни кэширования 1:2, это уровни вложенности директорий в директории для хранения кэша. Параметр keys_zone определяет название и объем зоны кэша (зон может быть несколько). Зона размером 1 мегабайт может хранить 8000 ключей. Параметр max_size определяет максимальный объем кэша, когда кэш достигнет этого объема, то старые файлы из кэша будут удаляться, чтобы освободить место. Если данные не будут запрошены из кэша в течение времени, указанного в параметре inactive (в нашем случае 600 минут), то они будут удалены из кэша. Если параметр inactive не указан, по умолчанию время составляет 10 минут.

    Настройка php-fpm

    Настройки php-fpm находятся в директории /etc/php5/fpm. В этой директории есть поддиректория pool.d, в которой хранятся файлы для работы с сайтами. Нам нужно создать файл для нашего сайта. Назовем его site.conf

    Touch /etc/php5/fpm/pool.d/site.conf

    В этот файл записываем следующее:

    # Сокет-файл для обмена данными с nginx listen = /var/run/php-fpm-site.sock # Максимально доступное в системе количество соединений listen.backlog = -1 # Владелец сокета и группа владения listen.owner = www-data listen.group = www-data # Права, устанавливаемые при создании сокета listen.mode = 660 user = www-data group = www-data # Количество процессов будет контролироваться динамически pm = dynamic pm.max_children = 30 pm.start_servers = 2 pm.min_spare_servers = 2 pm.max_spare_servers = 5 pm.max_requests = 50 env = site env = /usr/local/bin:/usr/bin:/bin env = /tmp env = /tmp env = /tmp

    Теперь можно запускать php-fpm командой

    Service php5-fpm start

    И после этого так же запустить nginx

    Service nginx start

    Давайте создадим директорию /var/www/site, если она еще не создана:

    Mkdir -p /var/www/site

    А в этой директории создадим файл /var/www/site/index.php со следующим содержимым:

    Теперь в браузере откроем наш сервер по доменному имени. Например, «http://site». Должна открыться страница с информацией о сервере. Там же перечислены все модули, которые используются. В этом списке должен присутствовать модуль apc, и его статус должен быть «Enabled».

    Настройка php-apc

    Конфигурационный файл apc находится по следующему пути: /etc/php/fpm/conf.d/20-apc.ini

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

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

    От стабильной и быстрой работы сервера зависит судьба сайта. Его медленная работа и частые падения способны отпугнуть как посетителей, так и поисковые системы. Последние ещё и понизят рейтинг тормозящего сайта в результатах поиска и он окажется не в топ-10, а, скажем, в топ-100 по всем запросам.

    Использование связки nginx и php-fpm для обслуживания сайтов позволяет увеличить скорость их работы, а также стабильность системы в целом. К тому же, отказавшись от использования apache, мы несколько упрощаем систему и даже защищаем её. Ведь если нет apache, то злоумышленник не сможет использовать, например, файл.htaccess для своих целей.

    Связку nginx+php-fpm настраивать довольно легко и она поддерживается многими популярными CMS: WordPress, MODX, DLE, различными фреймворками. Всё это способно работать и без громоздкого apache.

    При установке веб-сервера, не обойтись без создания пользователей. В идеале, для каждого сайта должен быть создан отдельный юзер. Так мы сможем защитить другие сайты, если один из пользователей будет взломан. Примеры в этой статье написаны с учётом того, что пользователей вы создали по .

    Для начала установим базовые модули: php-fpm, mysql, curl, GD. Всё остальное — по индивидуальной необходимости.

    # aptitude install nginx php5-fpm php5-mysqlnd php5-curl php5-gd

    Конфигурационные файлы располагаются в каталоге /etc/php5/fpm/ .

    Изначально в php-fpm есть только один пул по имени www. Мы будем использовать его в качестве основы для других пулов.

    Откроем конфигурационный файл /etc/php5/fpm/pool.d/www.conf , рассмотрим некоторые переменные и подберём для них значения.

    Первая переменная — это имя пула. Оно заключается в квадратные скобки и не может совпадать с именем любого существующего в системе пользователя.

    User = username group = www-data

    Указываем, что пул должен работать в качестве unix-сокета. Переменная $pool будет заменена на имя.

    listen = /var/run/php-$pool.sock

    Определяем использование статического режима, при котором во время запуска fpm создаётся определённое количество процессов пула. Они обслуживают все поступающие запросы.

    Почему именно такой выбор? :) Это самый экономный вариант. Каждый процесс пула будет занимать объём оперативной памяти, выделенный переменной memory_limit плюс несколько мегабайт на подключённые модули, кэш и т.п. При статичном варианте все запросы будут обрабатываться только созданными процессами, а новые порождаться (и занимать драгоценную память) не будут. В итоге получим фиксированное потребление памяти.

    Указываем необходимое количество процессов, обслуживающих запросы. Подбирается в зависимости от загруженности.

    pm.max_children = 3

    Каталог для размещения временных файлов:

    Php_admin_value = "/var/www/username/tmp"

    Каталог для хранения файлов сессий:

    Php_admin_value = "/var/www/username/sessions"

    По соображениям безопасности, доступ к этим каталогам должен быть только у пользователя, с правами которого запускается пул php-fpm. Также не следует использовать один каталог и для хранения файлов сессий, и для временных файлов.

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

    Php_admin_value = 50M

    Укажите обязательный параметр, который устраняет уязвимость :

    Php_admin_value = 0

    Переменные sendmail_path и open_basedir не указываются специально. Они будут переданы в качестве параметров fast-cgi в конфигурационном файле nginx. Таким образом, для каждого конкретного сайта можно определить свою настройку. :)

    После того, как все необходимые параметры прописаны, следует перезагрузить конфигурацию php-fpm командой:

    # service php5-fpm reload

    Обработка php скриптов посредством nginx

    Остаётся настроить nginx для работы с php-fpm. Готовый конфиг

    Server { server_name example.com ; listen 80; access_log /var/log/nginx/example.com .access.log; error_log /var/log/nginx/example.com .error.log; charset utf-8; index index.php; root /var/www location / { try_files $uri $uri/ /index.php$args; } location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/run/php-www.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PHP_VALUE "sendmail_path=/usr/sbin/sendmail -t -i [email protected]"; fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/example.com/:/var/save_path/:/var/tmp_dir/"; } }

    example.com заменяем на свой домен.

    Описание параметров :

    try_files $uri =404; отобразит ошибку 404 в браузере пользователя, вместо сообщения no input file specified , в случае, когда данная ошибка имеет место.

    fastcgi_pass — путь к сокету php-fpm.

    Fastcgi_pass unix:/run/php-www.sock;

    Следующая переменная устанавливает путь к sendmail и параметр, указывающий адрес электропочты администратора сайта. Замените [email protected] на что-то своё.

    Fastcgi_param PHP_VALUE "sendmail_path=/usr/sbin/sendmail -t -i [email protected]";

    Перечисляем каталоги для open_basedir: каталог с сайтом, каталог для сохранения временных файлов, каталог для файлов сессий.

    Fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/example.com/:/var/save_path/:/var/tmp_dir/";

    Если требуется передать несколько параметров, до делать это следует так:

    Fastcgi_param PHP_ADMIN_VALUE "sendmail_path=/usr/sbin/sendmail -t -i [email protected]\nopen_basedir=/var/www/example.com/:/var/save_path/:/var/tmp_dir/";

    Как можно заметить, параметры разделяются при помощи переноса строки: \n .

    Сохраняем все проделанные изменения и перезапускаем nginx.

    # service nginx reload

    Вконтакте



    Есть вопросы?

    Сообщить об опечатке

    Текст, который будет отправлен нашим редакторам: