ѕодпишитесь на наш Telegram-канал Ѕудьте в курсе последних новостей 👇 😉 ѕодписатьс€
ѕоддержим в трудное врем€ —пециальное предложение на техническую поддержку вашей »“ - инфраструктуры силами наших экспертов ѕодобрать тариф
ѕоставка оборудовани€ √аранти€ и помощь с настройкой. —кидка дл€ наших читателей по промокоду WIKIMERIONET  упить
»нтерфейс статистики Merion Mertics показывает ключевые диаграммы и графики по звонкам, а также историю звонков в формате, который легко поймет менеджер ѕопробовать бесплатно
¬недрение
офисной телефонии
Ўаг на пути к созданию доступных унифицированных коммуникаций в вашей компании ¬недрить
»нтеграци€ с CRM ѕомогаем навести пор€док с данными
и хранить их в единой экосистеме
ѕодключить
»“ Ѕезопасность ”мна€ информационна€ безопасность дл€ вашего бизнеса «аказать
ћерион Ќетворкс

14 минут чтени€

¬ этом руководстве узнаем, как настроить сервер Nginx дл€ производственной среды.

Ќастройка производительности и безопасности Nginx

“естовый веб-сервер отличаетс€ от рабочего сервера в планах безопасности и производительности.

ѕо умолчанию, веб-сервер Ngnix готов к работе сразу после установки. “ем не менее, настройки по умолчанию недостаточны дл€ рабочего севера. ѕоэтому мы сфокусируемс€ на настройке сервера дл€ большей производительности в случае высокой и нормальной нагрузки, а также на настройках безопасности в цел€х защиты от любопытного пользовател€.

≈сли у вас не установлен веб-сервер, можете узнать, как сделать это перейд€ по ссылке. «десь показано как установить Ngnix на Unix платформы. –екомендуетс€ выбирать установку из исходного кода, так как обычный релиз не включает некоторые модули, используемые в этом руководстве.


Ќастройка производительности и безопасности Nginx

“ребовани€

” вас должны быть установлены нижеследующие компоненты и убедитесь, что веб-сервер запущен на системе на базе Debian, например Ubuntu.

  • Ubuntu или люба€ система семейства Debian
  • wget
  • Vim (текстовый редактор)

“акже имейте ввиду, что некоторые команды из этого руководства придетс€ запускать от имени привилегированного пользовател€ пользу€сь командой sudo.


–азбор структуры конфигурации Nginx

¬ этом разделе рассмотрим следующие вопросы:
  • —труктура Nginx
  • –азделы событий, HTTP и Mail
  • ѕравильный синтаксис Nginx

¬ конце раздела узнаете об структуре конфигурационного файла Nginx, роль и назначение каждого раздела и как задавать директивы внутри разделов.

¬есь файл конфигурации Nginx разделен на такие разделы, как event section, http section, mail section и т.д.

ќсновной конфигурационный файл расположен по пути /etc/ngnix/ngnix.conf, а другие - /etc/nginx.

ќсновна€ секци€

¬ этой секции расположены директивы, дл€ которых нет специальных разделов. “акие директивы как user nginx, worker_processes 1, error_log /var/log/nginx/error.log warn, pid /var/run/nginx.pid могут быть расположены в этом разделе.

Ќо некоторые из этих директив могут быть в секции event, например werker_processes.

–азделы (—екции)

¬ Nginx разделы используютс€ дл€ определени€ конфигурации разных модулей. Ќапример, секци€ http section содержит настройки ngx_http_core module, секци€ even section определ€ет настройки ngx_event module, а секци€ mail хранит настройки модул€ ngx_mail module.

—писок доступных разделов можно просмотреть по этой ссылке.

ƒирективы

ƒирективы в Nginx состо€т из имени переменной и р€да аргументов. Ќапример, директива worker_processes Ц им€ переменной, а auto Ц значение:

worker_processes  auto;

¬ конце каждой директивы об€зательно нужно поставить точку с зап€той ;

Ќаконец, файл конфигурации Nginx должен соответствовать определенному набору правил. Ќиже приведен допустимый синтаксис конфигурации Nginx:

  • ƒирективы начинаютс€ с имени переменной, а затем следуют один или несколько аргументов
  • ƒирективы заканчиваютс€ точкой с зап€той ;
  • –азделы определ€ютс€ фигурными скобками {}
  • –аздел может быть внутри другого раздела
  •  онфигураци€ вне любого раздела €вл€етс€ частью глобальной конфигурации Nginx.
  • —троки, начинающиес€ со знака #, €вл€ютс€ комментари€ми.

Ќастройка производительности Nginx

¬ этой части мы сконфигурируем Nginx дл€ лучшей работы как во врем€ интенсивного трафика, так и во врем€ пиковой нагрузки. Ѕудут рассмотрены следующие настройки:

  • Workers
  • јктивность ¬вода/вывода диска
  • —етевой активности
  • Ѕуферов
  • —жати€
  •  ешировани€
  • ¬ремени ожидани€

»так, в терминале введите следующую команду, чтобы перейти в директорию nginx и показать ее содержимое:

cd nginx && ls

Ќайдите папку conf. ¬ этой папке и находитс€ файл nginx.conf. ћы используем этот файл дл€ настройки Nginx.

“еперь, чтобы перейти в папку conf и открыть файл nginx.conf с помощью редактора vim, выполните следующие команды:

cd conf
sudo vim nginx.conf

Ќиже на скриншоте показан как выгл€дит файл nginx.conf

nginx.conf

Workers

„тобы улучшить работу веб-сервера Nginx нужно настроить должным образом так называемые воркеры. Ёто своего рода потоки €дра, которые управл€ют параллельным выполнением процессов. Ќастройка воркеров дает возможность эффективней обрабатывать запросы клиентов.

≈сли все еще не закрыли vim, нажмите i чтобы перейти к режиму редактировани€ nginx.conf. —копируйте и вставьте код указанный ниже в раздел events:

events {
    worker_processes    auto;
    worker_connections  1024;
    worker_rlimit_nofile 20960;
    multi_accept        on;
    mutex_accept        on;
    mutex_accept_delay  500ms;
    use                 epoll;
    epoll_events        512;
}
  • worker_processes: Ёта директива регулирует количество воркеров в Nginx. «начение этой директивы устанавливаетс€ на auto, чтобы разрешить Nginx определ€ть количество доступных €дер, дисков, загрузки сервера и сетевой подсистемы. ќднако можно определить количество €дер, выполнив команду lscpu на терминале.
  • worker_connections: Ёта директива задает значение количества одновременных подключений, которые могут быть открыты воркером. «начение по умолчанию - 512, но здесь оно установлено 1024, что позвол€ет одному воркеру одновременно принимать соединение от клиента.
  • worker_rlimit_nofile: Ёта директива как-то св€зана с worker_connections. ƒл€ обработки большого одновременного соединени€ устанавливаетс€ большое значение.
  • multi_accept: Ёта директива позвол€ет воркеру принимать множество соединений в очереди одновременно. ќчередь в этом контексте просто означает последовательность объектов данных, ожидающих обработки.
  • mutex_accept: Ёта директива отключена по умолчанию. Ќо поскольку мы настроили много работников в Nginx, мы должны включить его, как показано в коде выше, чтобы позволить работникам принимать новые соединени€ один за другим.
  • mutex_accept_delay: Ёта директива определ€ет врем€ ожидани€ воркера перед прин€тием нового подключени€. ѕосле включени€ accept_mutex воркеру назначаетс€ блокировка mutex на период, указанный в accept_mutex_delay. ѕо истечении этого периода следующий воркер готов прин€ть новые подключени€.
  • use: Ёта директива указывает метод обработки подключени€ от клиента. ¬ этом руководстве мы решили установить значение epoll, потому что мы работаем на платформой Ubuntu. ћетод epoll €вл€етс€ наиболее эффективным методом обработки дл€ платформ Linux.
  • epoll_events: «начение этой директивы указывает количество событий, которые Nginx передаст €дру.

„тение/запись диска

¬ этом разделе мы настроим асинхронные операции ввода-вывода в Nginx дл€ обеспечени€ эффективной передачи данных и повышени€ эффективности кэшировани€.

ƒисковый ввод-вывод относитс€ к операци€м записи и чтени€ между жестким диском и ќ«”. ћы будем использовать функцию sendfile() внутри €дра дл€ отправки небольших файлов.

ƒл€ задани€ директив можно использовать http section, location section и server section.

location section и server section могут быть вложены в разделе http section, чтобы сделать конфигурацию более читабельной.

—копируйте и вставьте следующий код в location section, расположенный в http section:

location /pdf/  {
   sendfile on;
   aio      on;
  }

location /audio/ {
    directio    4m
    directio_alignment 512
}
  • Sendfile: „тобы использовать ресурсы операционной системы, установите дл€ этой директивы значение on. Sendfile передает данные между дескрипторами файлов в пространстве €дра ќ—, не отправл€€ их в буферы приложений. Ёта директива будет использоватьс€ дл€ обслуживани€ небольших файлов.
  • Directio: Ёта директива повышает эффективность кэшировани€, позвол€€ выполн€ть чтение и запись непосредственно в приложение. Directio - это функци€ файловой системы каждой современной операционной системы. Ёта директива будет использоватьс€ дл€ обслуживани€ больших файлов, например видео.
  • Aio: Ёта директива обеспечивает многопоточность дл€ операций записи и чтени€. ћногопоточность - это модель выполнени€, позвол€юща€ выполн€ть несколько потоков отдельно друг от друга при совместном использовании ресурсов процесса хостинга.
  • directio_alignment: ¬ этой директиве дл€ переноса данных назначаетс€ значение размера блока. ќна касалась директивы directio.

—етевой уровень

¬ этом разделе мы используем такие директивы, как tcp_nodelay и tcp_nopush, чтобы небольших пакеты не ждали в очереди перед отправкой.

ќбычно, когда пакеты передаютс€ в "част€х", они имеют тенденцию заполн€ть высоконагруженную сеть. ƒжон Ќагл построил алгоритм буферизации дл€ решени€ этой проблемы. ÷елью алгоритма буферизации Nagle €вл€етс€ предотвращение заполнени€ высоконагруженной сети небольшими пакетами.

—копируйте и вставьте следующий код в раздел HTTP:

http {

  tcp_nopush  on;
  tcp_nodelay on;

  }
  • tcp_nodelay: Ёта директива по умолчанию отключена, чтобы позволить небольшим пакетам ждать указанный период времени, прежде чем они будут отправлены одновременно. ƒл€ немедленной отправки всех данных эта директива включена.
  • tcp_nopush: ѕоскольку tcp_nodelay директива включена, небольшие пакеты отправл€ютс€ одновременно. ќднако, если вы все еще хотите использовать алгоритм буферизации ƒжона Ќагле, мы также можем включить
  • tcp_nopush, чтобы собрать пакеты в одну пачку и отправл€ть их все одновременно.

Ѕуфер

–ассмотрим, как настроить буферы запросов в Nginx дл€ эффективной обработки запросов. Ѕуфер - это временное хранилище, где данные хран€тс€ в течение некоторого времени и обрабатываютс€.

ћожно скопировать код указанный ниже в раздел server.

server {

   client_body_buffer_size 8k;
   client_max_body_size 2m;
   client_body_in_single_buffer on;
   client_body_temp_pathtemp_files 1 2;
   client_header_buffer_size  1m;
   large_client_header_buffers 4 8k;

 }

¬ажно четко понимать, функции указанных директив

  • client_body_buffer_size: Ёта директива задает размер буфера дл€ тела запроса. ≈сли планируетс€ запустить веб-сервер на 64-разр€дных системах, необходимо установить значение 16k. ≈сли требуетс€ запустить веб-сервер в 32-разр€дной системе, установите значение 8k.
  • client_max_body_size: ≈сли вы собираетесь обрабатывать большие загрузки файлов, необходимо установить дл€ этой директивы значение не менее 2m или более. ѕо умолчанию установлено значение 1m.
  • client_body_in_file_only: ≈сли вы отключили директиву, закомментировав ее client_body_buffer_size, а директива client_body_in_file_only включена, Nginx будет сохран€ть буферы запросов во временный файл. Ёто не рекомендуетс€ дл€ производственной среды.
  • client_body_in_single_buffer: »ногда не все тело запроса хранитс€ в буфере. ќстальна€ часть сохран€етс€ или записываетс€ во временный файл. ќднако если предполагаетс€ сохранить или хранить все запросы в буфер запросов в одном буфере, необходимо включить эту директиву.
  • client_header_buffer_size: Ёту директиву можно использовать чтобы дать заголовков запросов доступ к буферу. Ёто значение можно задать равным 1m.
  • large_client_header_buffers: Ёта директива используетс€ дл€ задани€ максимального количества и размера дл€ чтени€ заголовков больших запросов. ћаксимальное число и размер буфера можно точно установить в 4 и 8k.

—жатие

≈ще одним способом оптимизации работы веб-сервера €вл€етс€ сжатие объема данных, передаваемых по сети, €вл€етс€. ¬ этом разделе мы используем директивы, такие как gzip, gzip_comp_level, и gzip_min_length, чтобы сжать данные.

¬ставьте следующий код в раздел http, как показано ниже:

http {

  gzip on;
  gzip_comp_level  2;
  gzip_min_length  1000;
  gzip_types  text/xml text/css;
  gzip_http_version 1.1;
  gzip_vary  on;
  gzip_disable "MSIE [4-6] \.";

}
  • gzip: ≈сли требуетс€ включить сжатие ответа, установите значение этой директивы в on. ѕо умолчанию он отключен.
  • gzip_comp_level: Ёту директиву можно использовать дл€ установки степени сжати€ ответа. „тобы не тратить ресурсы ÷ѕ, не нужно устанавливать слишком высокий уровень сжати€. ѕо шкале от 1 до 9 лучше установить уровень сжати€ 2 или 3.
  • gzip_min_length: ”станавливает минимальную длину ответа, который будет сжиматьс€ методом gzip. ƒлина определ€етс€ только из пол€ content-length заголовка ответа. ћожно установить значение более 20 байт.
  • gzip_types: Ёта директива разрешает сжатие ответа методом gzip дл€ указанных MIME-типов. ѕо умолчанию, тип text/html всегда сжимаетс€. ћожно добавить другой тип, например, text/css, как показано в коде выше
  • gzip_http_version: Ёта директива позвол€ет выбрать минимальную HTTP-версию запроса, необходимую дл€ сжати€ ответа. ћожно использовать значение по умолчанию 1.1.
  • gzip_vary: –азрешает или запрещает выдавать в ответе поле заголовка Vary: Accept Encoding, если директива gzip включена.
  • gzip_disable: Ќекоторые браузеры, такие как Internet Explorer 6, не поддерживают сжатие gzip. Ёта директива использует поле User-Agent заголовка дл€ отключени€ сжати€ методом gzip дл€ определенных браузеров.

 еширование

»спользуйте функции кэшировани€, чтобы сократить количество обращений дл€ многократной загрузки одних и тех же данных. Nginx предоставл€ет функции кэшировани€ метаданных статического содержимого через директиву open_file_cache.

Ёту директиву можно поместить в разделы server, location и http:

http {

open_file_cache max=1,000 inactive=30s;
open_file_cache_valid 30s;
open_file_cache_min_uses 4;
open_file_cache_errors on;

 }
  • open_file_cache: Ёта директива по умолчанию отключена. ¬ключите его, если требуетс€ внедрить кэширование в Nginx. ¬ нем могут хранитьс€ дескрипторы открытых файлов, информаци€ об их размерах и времени модификации, информаци€ о существовании каталогов, информаци€ об ошибках поиска файла Ч Унет файлаФ, Унет прав на чтениеФ
  • open_file_cache_valid: Ёта директива определ€ет врем€, через которое следует провер€ть актуальность информации об элементе в open_file_cache.
  • open_file_cache_min_uses: «адаЄт минимальное число обращений к файлу в течение времени, заданного параметром inactive директивы open_file_cache, необходимых дл€ того, чтобы дескриптор файла оставалс€ открытым в кэше.
  • open_file_cache_errors: Ёту директиву можно использовать, чтобы разрешить Nginx кэшировать ошибки, такие как Унет файлаФ, Унет прав на чтениеФ при доступе к файлам. “аким образом, каждый раз, когда к ресурсу обращаетс€ пользователь, не имеющий на это права, Nginx отображает тот же самый отчет об ошибке Ђв доступе отказаної

¬рем€ ожидани€

Ќастройте врем€ ожидани€, использу€ директивы, такие как keepalive_timeout и keepalive_requests, чтобы предотвратить растрачивание ресурсов при длительном ожидании подключений.

¬ разделе HTTP скопируйте и вставьте следующий код:

http {

 keepalive_timeout  30s;
 keepalive_requests 30;
 send_timeout      30s;

}
  • keepalive_timeout: —охран€йте св€зь в течение 30 секунд. «начение по умолчанию - 75 секунд.
  • keepalive_requests: Ќастройка количества запросов дл€ поддержани€ активности в течение определенного времени.  оличество запросов можно задать равным 20 или 30.
  • keepalive_disable: если вы хотите отключить поддержку keepalive дл€ определенной группы браузеров, используйте эту директиву.
  • send_timeout: ”становка времени ожадани€ дл€ передачи данных клиенту.

Ќастройки безопасности Nginx

¬ этой части рассматриваютс€ только способы настройки безопасности самого Nginx, а не веб-приложени€. ћы не будем разбирать такие методы веб-атаки, как инъекци€ SQL и так далее. «десь мы рассмотрим настройки следующих параметров:
  • ќграничение доступа к файлам и каталогам
  • Ќастройка журналов дл€ мониторинга подозрительных действий
  • «ащиту от DDoS атак
  • ќтключение вывода списка файлов и директорий

ќграничение доступа к файлам и каталогам

ƒавайте рассмотрим как можно ограничить доступ к важным и чувствительным файлам системы с помощью следующих методов.

»спользование HTTP јутентификации

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

apt-get install -y apache-utils

ƒалее создайте файл паролей и пользовател€ с помощью утилиты htpasswd. htpasswd входит в набор утилит apache2-utils.

sudo  htpasswd  -c  /etc/apache2/ .htpasswd mike

ѕроверить результат работы можно командой:

cat  etc/apache2/ .htpasswd

—копируйте и вставьте следующий код в разделе location:

location /admin {

 basic_auth "Admin Area";
 auth_basic_user_file /etc/apache2/ .htpasswd;

}
»спользу€ директиву Allow

¬ дополнение к директиве basic_auth мы можем использовать директиву allow дл€ ограничени€ доступа к указанным каталогам.

„тобы разрешить доступ как конкретным каталогам только с указанных адресов вставьте нижеследующий код в раздел location:

location /admin {
 allow 192.168.34.12;
 allow 192.168.12.34;
}

Ќастройка журналировани€ подозрительных действий

¬ этом разделе настроим error и access логи, чтобы вести мониторинг запросов. »х можно использовать дл€ определени€ кто заходил систему в указанный период времени или какой пользователь открывал конкретный файл и т.д.

  • error_log: ѕозвол€ет настроить запись событий в определенный файл, например syslog или stderr. ћожно также указать уровень журналировани€, которые требуетс€ записывать.
  • access_log: ѕозвол€ет регистрировать запросы пользователей в файле access.log

ƒл€ этого в разделе http введите следующие изменени€:

http {

  access_log  logs/access.log   combined;
  error_log   logs/warn.log     warn;

}

ѕредотвращение DDoS атак

DDoS атаки один из самых легкореализуемых и потому часто примен€емых видов атак. «ащитить свой веб-сервер от атак такого вида можно помен€в следующие настройки.

ќграничение запросов пользователей

ƒл€ ограничени€ числа запросов от пользователей можно использовать директивы limit_req_zone и limit_req. —ледующий код нужно добавить в раздел location, который вложен в раздел server

limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;

server {
 location /admin.html {
   limit_req zone=one;
       }

}
ќграничение на число подключений

ƒирективы limit_conn и limit_conn_zone можно использовать дл€ ограничени€ числа подключение к конкретным зонам. Ќапример, код указанный ниже ограничивает число подключений дес€тью.

 од должен располагатьс€ в разделе location раздела server

server {

    location /products/ {
        limit_conn addr 10;

    }
}
–азрыв медленных соединений

ƒиректива как client_body_timeout задаЄт таймаут при чтении тела запроса клиента. “аймаут устанавливаетс€ не на всю передачу тела запроса, а только между двум€ последовательными операци€ми чтени€. ≈сли по истечении этого времени клиент ничего не передаст, обработка запроса прекращаетс€ с ошибкой 408 (Request Time-out). ј client_header_timeout задаЄт таймаут при чтении заголовка запроса клиента. ≈сли по истечении этого времени клиент не передаст полностью заголовок, обработка запроса прекращаетс€ с ошибкой 408 (Request Time-out).

ƒобавьте следующее в раздел server.

server {
    client_body_timeout 5s;
    client_header_timeout 5s;
}

ќтключение вывода списка директорий

„тобы отключить вывод директорий на странице можно использовать директиву auto_index. ќна располагаетс€ в разделе location, а значение должно быть установлено в off.

location / {
 auto_index  off;
}

«аключение

»так, в этом руководстве показали, как можно настроить веб-сервер Nginx дл€ более безопасной и оптимальной работы. Ќа этом, конечно, работа не заканчиваетс€. ≈сли на Nginx крутитс€ какое-то приложение с доступом в »нтернет, то можно прибегнуть к облачным решени€м защиты и оптимизации.