Как открыть nginx. Ограничь количество доступных методов обращения к Web-серверу. О герое дня

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

В одной из предыдущих статей мы уже рассматривали и настройку его основных параметров, в этой же статье я хочу больше остановиться на производительности и подготовке веб-сервера к использованию в боевых условиях. Что касается дистрибутива Linux, то сегодня мы будем рассматривать CentOS, эта система часто используется на серверах и с настройкой Nginx тут могут возникнуть некоторые сложности. Дальше будет рассмотрена настройка Nginx CentOS, поговорим как включить полную поддержку http2, google pagespeed, и настроить основной конфигурационный файл.

В официальных репозиториях CentOS есть Nginx и он, скорее всего, уже установлен в вашей системе. Но мы хотим чтобы сайт работал по протоколу http2, который позволяет передавать все данные одним подключением, а это увеличивает производительность. Для работы по http2 вам понадобиться настроить SSL сертификат, но об этом уже написано в статье получение сертификата Lets Encrypt Nginx. Но это еще не все. для переключения с обычного SSL на HTTP2.0 в большинстве браузеров сейчас используется протокол ALPN, а он поддерживается начиная с OpenSSL 1.02. В то время, как в репозиториях есть только OpenSSL 1.01. Поэтому нам нужно установить версию Nginx, собранную с OpenSSL 1.02. Для этого можно использовать Broken Repo:

sudo yum -y install yum-utils
# sudo yum-config-manager --add-repo https://brouken.com/brouken.repo

Если вы используете репозиторий EPEL, то нужно указать что не надо из него брать Nginx:

sudo yum-config-manager --save --setopt=epel.exclude=nginx*;

Теперь для установки правильной версии Nginx достаточно набрать:

sudo yum install nginx

Будет установлена самая последняя версия Nginx 1.13.2, с полной поддержкой ALPN. Дальше перейдем к настройке.

2. Настройка Nginx

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

глобальные опции
events {}
http{
server {
location{}
}
server {}
}

Сначала идут глобальные опции, которые задают основные параметры программы, например, от какого пользователя она будет запущена и количество процессов. Дальше есть секция events , в которой описано как Nginx будет реагировать на входящие подключения, затем идет секция http , которая объединяет все настройки касаемо работы протокола http. В ней находится секция server , каждая такая секция отвечает за отдельный домен, в секции server размещаются секции location , каждая из которых отвечает за определенный URL запроса, обратите внимание, что не файл на сервере, как в Apache, а именно URL запроса.

Основные глобальные настройки мы будем делать в файле /etc/nginx/nginx.conf. Дальше рассмотрим что именно будем менять и какие значения желательно установить. Начнем с глобальных опций:

  • user - пользователь, от имени которого будет запущен сервер, должен быть владельцем каталога с файлами сайта, и от имени его же нужно запускать php-fpm;
  • worker_processes - количество процессов Nginx, которые будут запущены, нужно установить ровно столько, сколько у вас есть ядер, например, у меня - 4;
  • worker_cpu_affinity - этот параметр позволяет закрепить каждый процесс за отдельным ядром процессора, установите значение auto, чтобы программа сама выбрала что и к чему крепить;
  • worker_rlimit_nofile - максимальное количество файлов, которые может открыть программа, на каждое соединение нужно как минимум два файла и каждый процесс будет иметь указанное вами количество соединений, поэтому формула такая: worker_processes * worker_connections* 2, параметр worker_connections разберем чуть ниже;
  • pcre_jit - включите этот параметр для ускорения обработки регулярных выражений с помощью JIT компиляции;

В секции events стоит настроить два параметра:

  • worker_connections - количество соединений для одного процесса, должно быть достаточным для обработки входящих соединений. Сначала нам нужно знать сколько этих входящих соединений есть, для этого смотрим статистику по адресу ip_сервера/nginx_status. Как включить рассмотрим ниже. В строке Active Connections видим количество активных соединений с сервером, также нужно учесть что соединения с php-fpm тоже считаются. Дальше обратите внимание на поля accepted и handled, первое отображает обработанных подключений, второе - количество принятых. Из значения должны быть одинаковыми. Если отличаются значит соединений не хватает. Смотрите примеры, первый снимок проблема, второй - порядок. Для моей конфигурации оптимальной может быть цифра в 200 соединений (всего 800, учитывая 4 процесса):

  • multi_accept - позволяет программе принимать несколько соединений одновременно, тоже ускоряет работу, при большом количестве соединений;
  • accept_mutex - установите значение этого параметра в off, чтобы сразу все процессы получали уведомление про новые соединения;

Также в секции events рекомендуется использовать директиву use epoll, так как этот самый эффективный метод обработки входящих соединений для Linux, но этот метод применяется по умолчанию, поэтому не вижу смысла добавлять его вручную. Рассмотрим еще несколько параметров из секции http:

  • sendfile - использовать метод отправки данных sendfile. Самый эффективный метод для Linux.
  • tcp_nodelay, tcp_nopush - отправляет заголовки и тело запроса одним пакетом, работает немного быстрее;
  • keepalive_timeout - таймаут поддержания соединения с клиентом, если у вас нет очень медленных скриптов, то будет достаточно будет 10 секунд, устанавливаем значение сколько нужно чтобы пользователь мог быть подключен к серверу;
  • reset_timedout_connection - разрывать соединения после таймаута.
  • open_file_cache - кэшировать информацию об открытых файлах. Например, open_file_cache max=200000 inactive=120s; max - максимальное количество файлов в кэше, время кэширования.
  • open_file_cache_valid - когда нужно проверить актуальность файлов. Например: open_file_cache_valid 120s;
  • open_file_cache_min_uses - кэшировать только файлы, которые были открыты указанное количество раз;
  • open_file_cache_errors - запоминать ошибки открытия файлов.
  • if_modified_since - устанавливает каким образом будут обрабатываться заголовки if-modified-since. С помощью этого заголовка браузер может получить ответ 304 если страница не изменилась с момента последнего просмотра. Возможны варианты - не отправлять - off, отправлять при точном совпадении времени - exact, отправлять если время совпадает точно или больше - before;

Вот как-то так будет выглядеть настройка nginx conf:

user nginx;
worker_processes 4;
worker_cpu_affinity auto;
worker_rlimit_nofile 10000;
pcre_jit on;

error_log /var/log/nginx/error.log warn;
load_module "modules/ngx_pagespeed.so";

events {
multi_accept on;
accept_mutex off;
worker_connections 1024;
}

sendfile on;
tcp_nopush on;
tcp_nodelay on;

open_file_cache max=200000 inactive=20s;
open_file_cache_valid 120s;
open_file_cache_errors on;

reset_timedout_connection on;
client_body_timeout 10;
keepalive_timeout 65;

include /etc/nginx/sites-enabled.*.conf

3. Настройка http2

Я не буду подробно описывать настройку секции server, потому что делал это уже в статье установка Nginx в Ubuntu и здесь мне нечего добавить, настройка SSL это достаточно обширная тема и тоже будет рассмотрена в отдельной статье. Но чтобы настроить http2 вам нужно иметь уже SSL. Далее, просто подправьте директиву listen в вашей секции server:

listen 194.67.215.125:443 default_server;

listen 194.67.215.125:443 http2 default_server;

Вот таким простым способом можно включить http2 если перед этим была установлена правильная версия Nginx.

4. Настройка PageSpeed

Google Pagespeed - это модуль Nginx, который выполняет различные оптимизации для того, чтобы страницы грузились быстрее, веб-сервер работал эффективнее, а пользователи не чувствовали дискомфорта. Сюда входит кэширование, оптимизация html кода, оптимизация картинок, объединение javascript и css кода и многое другое. Все это выполняется на уровне Nginx, поэтому эффективнее, чем если бы вы это делали в php. Но тут есть один недостаток, модуль удаляет заголовок Last Modified.

Дело в том, что PageSpeed устанавливает очень долгий строк кэширования для всех файлов, а в имя файла добавляет его хэш. Так скорость загрузки ресурсов выходит намного выше, поскольку браузер будет запрашивать файлы только с новым хэшем, а LastModified удаляется чтобы пользователи смогли увидеть изменения в случае если какой-либо файл будет изменен. А теперь рассмотрим как установить модуль. Нам придется собрать его из исходных кодов.

Сначала установите инструменты для сборки, очень важно, если не установите, потом получите ошибку и не будете знать что делать:

yum install wget gcc cmake unzip gcc-c++ pcre-devel zlib-devel

Скачайте и распакуйте исходники Nginx для вашей версии, например, 1.13.3:

wget -c https://nginx.org/download/nginx-1.13.3.tar.gz
# tar -xzvf nginx-1.13.3.tar.gz

Настройка сервера nginx не включает пере сборку и замену программы из репозитория, мы просто используем эти исходники для сборки модуля. Скачайте и распакуйте исходники PageSpeed:

wget -c https://github.com/pagespeed/ngx_pagespeed/archive/v1.12.34.2-stable.zip
# unzip v1.12.34.2-stable.zip

Скачайте и распакуйте библиотеку оптимизации PageSpeed в папку с исходниками модуля:

cd ngx_pagespeed-1.12.34.2-stable/
# wget -c https://dl.google.com/dl/page-speed/psol/1.12.34.2-x64.tar.gz
# tar -xvzf 1.12.34.2-x64.tar.gz

Скачайте и распакуйте исходники OpenSSL 1.02:

wget -c https://www.openssl.org/source/openssl-1.0.2k.tar.gz -O /opt/lib/$OPENSSL.tar.gz
# tar xvpzf openssl-1.0.2k.tar.gz

Теперь нам нужно собрать модуль. Сначала смотрим опции, с которыми собран текущий Nginx:

А теперь переходим в папку с Nginx, подставляем все полученные опции, опцию --add-dynamic-module для PageSpeed, OpenSSL и пробуем собрать:

cd nginx-1.13.3
# ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt="-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic" --with-ld-opt= --with-openssl=$HOME/openssl-1.0.2k --add-dynamic-module=$HOME/ngx_pagespeed-1.12.34.2-stable ${PS_NGX_EXTRA_FLAGS}
# make

Если все было сделано правильно, то на выходе вы получите модуль ngx_pagespeed.so в папке obj, его нужно скопировать в папку /etc/nginx/modules:

cp ngx_pagespeed.so /etc/nginx/modules/ngx_pagespeed.so

Создаем папку для кэша:

mkdir -p /var/ngx_pagespeed_cache
# chown -R nginx:nginx /var/ngx_pagespeed_cache

Теперь добавьте такую строчку для включения модуля в /etc/nginx/nginx.conf:

load_module "modules/ngx_pagespeed.so";

От стабильной и быстрой работы сервера зависит судьба сайта. Его медленная работа и частые падения способны отпугнуть как посетителей, так и поисковые системы. Последние ещё и понизят рейтинг тормозящего сайта в результатах поиска и он окажется не в топ-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

Вконтакте

|

Nginx – один из самых популярных веб-серверов в мире, позволяющий размещать очень объемные сайты с высоким трафиком. Он, как правило, расходует меньше ресурсов, чем Apache. Также его можно использовать в качестве обратного прокси-сервера.

Данное руководство поможет установить Nginx на сервер Ubuntu 16.04.

Требования

  • Сервер Ubuntu 16.04.
  • Не-root пользователь с доступом к команде sudo (об этом – в ).

1: Установка Nginx

Пакет Nginx доступен в стандартном репозитории системы Ubuntu.

Поскольку это первое взаимодействие с системой пакетирования apt в текущей сессии, нужно обновить индекс пакетов. После этого можно установить Nginx.

sudo apt-get update
sudo apt-get install nginx

После этого пакетный менеджер установит веб-сервер и все его зависимости.

2: Настройка брандмауэра

Прежде чем запустить Nginx, нужно настроить брандмауэр для поддержки трафика этого сервиса. Во время установки Nginx регистрируется как сервис в ufw, потому разрешить трафик веб-сервера очень просто.

Откройте список настроек приложений ufw:

sudo ufw app list

Команда вернёт:

Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH

Как видите, в списке есть три профиля Nginx:

  • Nginx Full: этот профиль открывает порт 80 (незашифрованный сетевой трафик) и 443 (зашифрованный трафик TLS/SSL).
  • Nginx HTTP: профиль для незашифрованного трафика HTTP на порт 80.
  • Nginx HTTPS: профиль для зашифрованного трафика TLS/SSL на порт 443.

Чтобы включить профиль, введите:

sudo ufw allow "Nginx HTTP"

Убедитесь в том, что профиль включен:

Команда должна сообщить, что трафик HTTP разрешен:

Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)

3: Тестирование веб-сервера

После установки Ubuntu 16.04 запустит Nginx автоматически. На данный момент веб-сервер должен запуститься и работать.

Чтобы убедиться в том, что Nginx запущен, запросите его состояние в системе инициализации systemd.

systemctl status nginx
nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2016-04-18 16:14:00 EDT; 4min 2s ago
Main PID: 12857 (nginx)
CGroup: /system.slice/nginx.service
├─12857 nginx: master process /usr/sbin/nginx -g daemon on; master_process on
└─12858 nginx: worker process

Как видите, сервис успешно запущен.

Также можно попробовать посетить стандартную посадочную страницу Nginx. Она доступна в браузере по доменному имени или IP-адресу.

Если вы не знаете своего IP-адреса, вы можете узнать его с помощью командной строки. Введите:

ip addr show eth0 | grep inet | awk "{ print $2; }" | sed "s/\/.*$//"

Команда вернёт несколько строк. Проверьте каждый адрес в браузере.

Также можно узнать, как видят ваш IP-адрес другие точки в сети.

sudo apt-get install curl
curl -4 icanhazip.com

Узнав вой IP, введите его в браузер, чтобы убедиться, что веб-сервер работает должным образом.

http://server_domain_or_IP

На экране должна появиться стандартная посадочная страница Nginx:

Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

4: Управление процессами Nginx

Рассмотрим несколько базовых программ для управления веб-сервером.

Чтобы остановить Nginx, введите:

sudo systemctl stop nginx

Чтобы запустить, введите:

sudo systemctl start nginx

Для перезапуска используйте команду:

sudo systemctl restart nginx

Чтобы обновить настройки Nginx, не сбрасывая соединения, введите команду:

sudo systemctl reload nginx

По умолчанию Nginx автоматически запускается во время загрузки сервера. Это поведение можно отключить:

sudo systemctl disable nginx

Чтобы возобновить автозапуск сервиса, введите:

sudo systemctl enable nginx

5: Файлы и каталоги Nginx

Теперь вы знаете, как управлять сервисом. Пора ознакомиться с важными файлами и каталогами Nginx.

Контент

  • /var/www/htm: этот каталог содержит текущий контент сайта. По умолчанию в нём находится только стандартная посадочная страница, которую вы уже видели. Этот каталог можно изменить в конфигурационном файле Nginx.

Настройки сервера

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

Логи

  • /var/log/nginx/access.log: этот лог регистрирует все запросы, полученные веб-сервером Nginx (если не настроено другое поведение).
  • /var/log/nginx/error.log: этот лог хранит все сообщения об ошибках Nginx.

Заключение

Теперь веб-сервер Nginx установлен и готов к работе. Используйте его для обслуживания контента вашего сайта.

Nginx является одним из самых популярных веб-серверов в мире, его используют для хостинга самых больших и нагруженных сайтов в Интернете. Nginx в подавляющем большинстве случаев менее требователен к ресурсам, чем Apache; его можно использовать как в качестве веб-сервера, так и в качестве обратного прокси-сервера (reverse proxy).

В этой статье мы рассмотрим процесс установки Nginx на ваш сервер с Ubuntu 16.04.

Перед установкой

Перед тем, как начать следовать описанным в этой статье шагам, убедитесь, что у вас есть обычный не-рутовый (non-root) пользователь с привилегиями sudo . Узнать, как настроить такого пользователя на вашем сервере, можно из .

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

Шаг 1: Установка веб-сервера Nginx

Nginx доступен в стандартных репозиториях Ubuntu, поэтому его установка достаточно проста.

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

  • sudo apt-get update
  • sudo apt-get install nginx

В результате выполнения этих команд apt-get установит Nginx и другие необходимые для его работы пакеты на ваш сервер.

Шаг 2: Настройка файрвола

Перед тем, как начать проверять работу Nginx, нам необходимо настроить наш файрвол для разрешения доступа к сервису. При установки Nginx регистрируется в сервисе файрвола ufw . Поэтому настройка доступа осуществляется достаточно просто.

Для вывода настроек доступа для приложений, зарегистрированных в ufw , введём команду:

  • sudo ufw app list

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

Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH

Как видно из этого вывода, для Nginx настроено три профиля:

  • Nginx Full : этот профиль открывает порты 80 (обычный, не шифрованный веб-трафик) и 443 (трафик шифруется с помощью TLS/SSL).
  • Nginx HTTP : этот профиль открывает только порт 80 (обычный, не шифрованный веб-трафик).
  • Nginx HTTPS : этот профиль открывает только порт 443 (трафик шифруется с помощью TLS/SSL).

Рекомендуется настраивать ufw таким образом, чтобы разрешать только тот трафик, который вы хотите разрешить в явном виде. Поскольку мы ещё не настроили SSL для нашего сервера, в этой статье мы разрешим трафик только для порта 80.

Сделать это можно следующей командой:

  • sudo ufw allow "Nginx HTTP"

Вы можете проверить изменения введя команду:

  • sudo ufw status

В результате должен отобразиться вывод следующего вида:

Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)

Шаг 3: Проверка работы веб-сервера

После завершения процесса установки Ubuntu 16.04 запустит Nginx автоматически. Таким образом веб-сервер уже должен быть запущен.

Мы можем убедиться в этом выполнив следующую команду:

  • systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2016-04-18 16:14:00 EDT; 4min 2s ago Main PID: 12857 (nginx) CGroup: /system.slice/nginx.service ├─12857 nginx: master process /usr/sbin/nginx -g daemon on; master_process on └─12858 nginx: worker process

Как видно из вывода выше, сервис запущен и работает. Тем не менее, убедимся в его полной работоспособности путём запроса веб-страницы.

Для этого мы можем проверить, отображается ли веб-страница Nginx, доступная по умолчанию при вводе доменного имени или IP адреса сервера.

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

  • ip addr show eth0 | grep inet | awk "{ print $2; }" | sed "s/\/.*$//"

В результате будет выведено несколько IP адресов. Попробуйте вставить каждый из них в браузер.

Другим способом определить свой IP адрес будет проверка, как ваш сервер виден из Интернета:

  • sudo apt-get install curl
  • curl -4 icanhazip.com

Наберите полученный IP адрес или доменное имя в вашем веб-браузере. Вы должны увидеть страницу Nginx по умолчанию.

Http://доменное_имя_или_IP_адрес

Если вы видите подобную страницу в своём браузере, вы успешно установили Nginx.

Шаг 4: Управление процессом Nginx

Теперь, когда Nginx установлен и мы убедились в его работоспособности, ознакомимся с некоторыми базовыми командам для управления нашим веб-сервером.

Для остановки веб-сервера используйте команду:

  • sudo systemctl stop nginx

Для запуска остановленного веб-сервера наберите:

  • sudo systemctl start nginx

Для перезапуска веб-сервера можно использовать следующую команду:

  • sudo systemctl restart nginx

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

  • sudo systemctl reload nginx

По умолчанию Nginx настроен на автоматический запуск при запуске сервера. Если такое поведение веб-сервера вам не нужно, вы можете отключить его следующей командой:

  • sudo systemctl disable nginx

Для повторного включения запуска Nginx при старте сервера введите:

  • sudo systemctl enable nginx

Шаг 5: Важные файлы и директории Nginx

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

Контент

  • /var/www/html: веб-контент, который по умолчанию состоит только из тестовой страницы Nginx, которую мы видели ранее, находится в директории /var/www/html . Путь к этой директории можно настроить в файлах конфигурации Nginx.

Конфигурация сервера

  • /etc/nginx: директория конфигурации Nginx. Все файлы конфигурации Nginx находятся в этой директории.
  • /etc/nginx/nginx.conf: основной файл конфигурации Nginx. Этот файл используется для внесения изменений в глобальную конфигурацию Nginx.
  • /etc/nginx/sites-available: директория, в которой хранятся "серверные блоки" для каждого сайта (серверные блоки являются приблизительным аналогом виртуальных хостов в Apache). Nginx не будет использовать конфигурационные файлы в этой директории, если они не имеют соответствующих ссылок в директории sites-enabled (см. ниже). Обычно все настройки серверного блока осуществляются в этой директории, а затем сайт активируется путём создания ссылки в другой директории.
  • /etc/nginx/sites-enabled/ : в этой директории хранятся серверные блоки для активированных сайтов. Обычно это достигается путём создания ссылок на конфигурационные профили сайтов, расположенные в директории sites-available .
  • /etc/nginx/snippets: в этой директории хранятся фрагменты конфигурации, которые можно использовать при конфигурации любых сайтов. Фрагменты конфигурации, которые потенциально могут быть использованы в нескольких файлах конфигурации, являются прекрасными кандидатами для создания этих сниппетов.

Логи сервера

  • /var/log/nginx/access.log: каждый запрос к вашему веб-серверу записывается в этот файл лога, если иное не задано настройками Nginx.
  • /var/log/nginx/error.log: любые ошибки Nginx будут записываться в этот файл.

Заключение

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

Классической связкой для работы сайтов написанных на php считается apache + mod_php. Так как mod_php по умолчанию требует prefork_mpm, то apache для обработки каждого отдельного соединения создает отдельный процесс, что сильно не экономно с точки зрения расходования оперативной памяти.

Потом появился nginx - легковесный проксирующий веб-сервер и его начали ставить перед apache чтобы он занимался выдачей статики и не беспокоил apache по мелочам. Следующим логичным шагом является выключение из цепочки nginx - apache - php посредника в лице apache, чем мы и займемся.

php-fpm позволяет демонизировать php дабы избежать затрат на запуск процессов (чем страдает CGI) что умеет и FastCGI. Но php-fpm дает также другие полезные возможности:

  • запуск пулов обработчиков от имени заданных пользователей,
  • динамическое управление количеством запущенных обработчиков,
  • возможность перезапуска обработчиков в случае, если с ними что-то не так,
  • ведение лога медленных запросов по аналогии с mysql,
  • страницы статуса и пинга,
  • прочее.

Установка php-fpm в Debian крайне проста:

Aptitude install php5-fpm

После чего можно править два конфигурационных файла, которые достаточно хорошо документированы сами по себе, но большое количество слов может также мешать найти за ними суть. Первый (/etc/php5/fpm/php-fpm.conf) позволяет задать общие настройки:

include - из какой директории инклудить дополнительные конфиги,
pid - путь до файла с идентификатором процесса,
error_log - путь до лога ошибок,
syslog.facility - позволяет указать в какой лог писать,
syslog.ident - каким именем помечать записи в системном логе,
log_level - уровень лога от алерта до дебага,

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

emergency_restart_threshold - позволяет задать при каком количестве вылетов процессов с сигналами SIGSEGV или SIGBUS за указанный промежуток времени необходимо мягко перезапустить php-fpm,
emergency_restart_interval - заданный промежуток времени.
process_control_timeout - как долго потомкам ждать от мастера реакции на сигналы,
process.max - максимальное количество процессов для всех пулов,
process.priority - можно указать приоритет мастер-процесса,
daemonize - демонизировать или нет. Может пригодиться для дебага,
rlimit_files - количество доступных для мастер-процесса файловых дескрипторов,
rlimit_core - не осознал,
events.mechanism - в linux однозначно epoll,
systemd_interval - если ваша ос использует systemd, то можно задать периодичность отчетов о состоянии процессов. Будет актуально в Debian 8.

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

Интересно, что в конфиге пула можно использовать имя пула в виде переменной $pool . За счет этого можно создать унифицированный конфигурационный файл и использовать его в качестве основы для новых пулов. Имя пула задается в квадратный скобках и предваряет собой блок параметров. Фактически все пулы можно описать в одном файле, но, кажется, так делать не стоит. Пример конфигурационного файла:


prefix = /var/www/$pool

user = $pool
group = $pool

listen = /var/run/phpfpm-$pool.sock
listen.owner = $pool
listen.group = www-data
listen.mode = 0660

pm = dynamic
pm.max_children = 16
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4

pm.status_path = /fpmstat

request_slowlog_timeout = 3s
slowlog = /var/www/logs/$pool.slow.log

При необходимости:

access.log = /var/www/logs/$pool.access.log

Разберем параметры:

prefix - позволяет задать путь по умолчанию, который может использоваться в параметрах slowlog, listen, chroot, chdir, php_values, php_admin_values.
user и group - задает владельца и группу запускаемых процессов.
listen - указывает на каком сокете слушать. Поддерживаются как UNIX, так и TCP-сокеты. В случае, если веб-сервер и php-обработчики находятся на одном сервере, то лучше использовать UNIX-сокеты, так как это потенциально быстрее, так как нет оверхеда связанного с генерацией пакетов.
listen.owner, listen.group, listen.mode - позволяют задать параметры доступа к сокету. В качестве владельца указано имя совпадающее с именем пула. Необходимо создать соответствующего пользователя и убедиться, что для него нет ssh-доступа, конечно, если у вас не виртуальный хостинг. Группа указана www-data вследствие того, что под ней работает nginx и необходимо предоставить ему доступ к файлу сокета. Закрыть доступ остальным позволяют права 660.
pm - указывает как менеджер процессов будет управлять количеством дочерних процессов. Может быть статическим (постоянное количество процессов), динамическим (количество процессов может варьироваться в заданных пределах) и по требованию (когда нужно процесс запускается и убивается по истечении таймаута).
pm.max_children - максимальное количество дочерних процессов.
pm.start_servers - сколько процессов запускается при запуске php-fpm.
pm.min_spare_servers - минимальное количество ожидающих процессов. Если процессов меньше, чем значение параметра, то новые процессы будут созданы.
pm.max_spare_servers - максимальное количество ожидающих процессов. Если ожидающих процессов больше, чем значение параметра, то лишние процессы будут убиты.
pm.status_path - путь к странице статуса.
request_slowlog_timeout - время по прошествии которого запрос считается медленным.
slowlog - путь до файла лога медленных запросов.
access.log - путь до файла с логом доступа.

Другие интересные параметры:

pm.max_requests - количество обработанных запросов после которых процесс нужно перезапустить. Позволяет бороться с утечками памяти.
process.priority - задает приоритет процессов данного пула.
chroot - позволяет зачрутить процессы в указанную директорию. Однако все пути используемые php будут действовать относительно указанной директории, что требует дополнительной настройки.
security.limit_extensions - позволяет указать список расширений файлов для обработки php-fpm.

Также можно переопределять переменные окружения, к примеру:

и переопределять параметры из php.ini почти как это делается в.htaccess:

php_flag = off

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

Кстати говоря, для изменения параметров php можно использовать в директории сайта.

Реализация

Материал выше изложен как-то сумбурно. Попробуем посмотреть конкретный простой пример реализации.

Исходим из того, что nginx и php-fpm у вас уже установлены.

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

server {
listen 80;
server_name webpanels.spb.ru;

root /var/www/webpanels;
index index.php;

location ~ \.php$ {
try_files $uri =404;

fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;
}

location ~ ^/(fpmstat|ping)$ {
access_log off;
allow 127.0.0.1;
allow 123.123.123.123; #your-ip
deny all;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /fpmstat;
fastcgi_pass unix:/var/run/phpfpm-webpanels.sock;
}

location ~* ^.+.(html|jpg|jpeg|gif|css|png|js|ico|txt)$ {
expires 60d;
}
}

Здесь указано куда перенаправлять запросы. В нашем случае используется unix-сокет. Также указываем индексный файл и путь до файла. Как видно, все довольно просто. Данный пример можно использовать как формулу.

Теперь настроим php-fpm. В Debian общие настройки находятся в файле /etc/php5/fpm/php-fpm.conf:

pid = /var/run/php5-fpm.pid
error_log = /var/log/php5-fpm.log
process.max = 64
process.priority = -5
rlimit_files = 1024
events.mechanism = epoll
include=/etc/php5/fpm/pool.d/*.conf

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

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

Useradd -m -d /var/www/webpanels -s /usr/sbin/nologin -c "webpanels site" -U webpanels

Кроме того, говорят, что для нормальной работы в файле /etc/php5/fpm/php.ini должен быть установлен следующий параметры:

cgi.fix_pathinfo = 0

Так же из-за отказа от Apache может понадобится сконвертировать правила mod_rewrite в правила понятные для nginx. Сделать это можно, к примеру, с помощью конвертеров доступных по адресам:



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

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

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