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

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

Мануал

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

Веб-сервер в производственной среде отличается от веб-сервера в тестовой среде с точки зрения производительности, безопасности и так далее.

По умолчанию всегда есть готовый параметр конфигурации для веб-сервера Nginx после его успешной установки.

Однако конфигурация по умолчанию недостаточно хороша для производственной среды.

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

Если вы еще не установили Nginx на свой компьютер, вы можете произвести настройки локально.

Установка Nginx на FreeBSD

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

Требования

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

  • Ubuntu или другая система на основе Debian
  • wget
  • Vim (текстовый редактор)
Кроме того, вам нужно запускать или выполнять некоторые команды в этом руководстве от пользователя root с помощью команды sudo.

Понимание структуры конфигурации Nginx

В этом разделе мы рассмотрим следующее:

  • Структура Nginx
  • Разделы, такие как event, HTTP и mail
  • Допустимый синтаксис Nginx
В конце этого раздела вы поймете структуру конфигурации Nginx, назначение или роли разделов, а также то, как определить допустимые директивы внутри разделов.
Полный файл конфигурации Nginx имеет логическую структуру, которая состоит из директив, сгруппированных в несколько разделов, таких как раздел event, раздел http, раздел mail и так далее.
Основной файл конфигурации находится в /etc/nginx/nginx.conf, а также другие файлы конфигурации находятся в /etc/nginx.

Раздел Main

Этот  основной раздел или контекст содержат директивы вне определенных разделов, таких как например mail раздел.
Любые другие директивы, такие как user nginx; , worker_processes 1; , error_log /var/log/nginx/error.log warn; и pid /var/run/nginx.pid можно поместить в основной раздел или контекст.
Но некоторые из этих директив, такие как worker_processes, также могут существовать в разделе event.

Разделы

Разделы в Nginx определяют конфигурацию для модулей Nginx.

Например, раздел  http определяет конфигурацию для модуля ngx_http_core, раздел event определяет конфигурацию для модуля ngx_event_module, а  mail определяет конфигурацию для модуля ngx_mail_module.

Вы можете посмотреть здесь полный список разделов в Nginx.

Директивы

Директивы в 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 выглядит по умолчанию.

Workers

Чтобы Nginx работал стабильнее, нам нужно настроить воркеры в разделе event.
Эта настройка Nginx позволяет эффективно обрабатывать соединения от клиентов.

Предполагая, что вы не закрыли редактор vim, нажмите кнопку i на клавиатуре, чтобы отредактировать файл nginx.conf.

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

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, раздел location и раздел server для директив в этой области.

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

Скопируйте и вставьте следующий код в раздел location, встроенный в раздел HTTP.

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, чтобы предотвратить ожидание небольших пакетов в течение определенного периода времени около 200 миллисекунд, прежде чем они будут отправлены сразу.

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

Поэтому Джон Нейгл создал алгоритм буферизации для решения этой проблемы.

Цель алгоритма буферизации 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: Если вы намереваетесь обрабатывать большие загрузки файлов, вам нужно установить эту директиву на не менее 2 м или более. По умолчанию установлено значение 1м.
  • client_body_in_file_only: если вы отключили директиву client_body_buffer_size  символом # и эта директива client_body_in_file_only установлена, Nginx сохранит буферы запросов во временный файл. Это не рекомендуется в производственной среде.
  • client_body_in_single_buffer: иногда не все тело запроса хранится в буфере. Все остальное сохраняется или записывается во временный файл. Однако, если вы намереваетесь сохранить все в одном буфере, вам нужно включить эту директиву.
  • client_header_buffer_size: вы можете использовать эту директиву, чтобы установить или выделить буфер для заголовков запроса. Вы можете установить это значение на 1м.
  • large_client_header_buffers: эта директива используется для установки максимального количества и размера для чтения заголовков больших запросов. Вы можете установить максимальное количество и размер буфера до 4 и 8 Кбайт.

Компрессия

Сжатие объема данных, передаваемых по сети, – это еще один способ повысить производительность вашего веб-сервера.

В этом разделе мы будем использовать директивы, такие как 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: Установите минимальную длину ответа для сжатия через поле заголовка ответа content-length. Вы можете установить его более чем на 20 байтов.
  • gzip_types: эта директива позволяет вам выбрать тип ответа, который вы хотите сжать. По умолчанию тип ответа text/html всегда сжат. Вы можете добавить другой тип ответа, такой как text/css, как показано в коде выше.
  • gzip_http_version: эта директива позволяет вам выбрать минимальную версию HTTP запроса для сжатого ответа. Вы можете использовать значение по умолчанию, которое составляет 1.1.
  • gzip_vary: когда директива gzip включена, эта директива добавляет поле заголовка Vary: Accept Encoding к ответу.
  • gzip_disabled: некоторые браузеры, такие как Internet Explorer 6, не поддерживают сжатие gzip. Эта директива использует поле заголовка запроса User-Agent для отключения сжатия для определенных браузеров.

Кэширование

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

Nginx предоставляет функции для кэширования метаданных статического содержимого с помощью директивы 

Вы можете поместить эту директиву в раздел 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;

 }
  • pen_file_cache: эта директива по умолчанию отключена. Включите ее, если вы хотите реализовать кэширование в Nginx. Эта директива хранит метаданные файлов и каталогов, которые обычно запрашиваются пользователями.
  • open_file_cache_valid: эта директива содержит информацию о резервном копировании внутри директивы open_file_cache. Вы можете использовать эту директиву, чтобы установить допустимый период, обычно в секундах, после которого информация, связанная с файлами и каталогами, повторно проверяется.
  • open_file_cache_min_uses: Nginx обычно очищает информацию внутри директивы open_file_cache после периода бездействия, основанного на
  • open_file_cache_min_uses. Вы можете использовать эту директиву, чтобы установить минимальное количество доступа, чтобы определить, какие файлы и каталоги активно доступны.
  • open_file_cache_errors: вы можете использовать эту директиву, чтобы позволить Nginx кэшировать ошибки, такие как «permission denied» или «can’t access this file» при обращении к файлам. Таким образом, каждый раз, когда к ресурсу обращается пользователь, у которого нет на это права, Nginx отображает тот же отчет об ошибке «permission denied».

Тайм-аут

Сконфигурируйте время ожидания, используя директивы, такие как 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 а не само веб-приложения.

💉 9 популярных типов атак на веб-приложения

Таким образом, мы не будем рассматривать веб-атаки, такие как SQL-инъекция и так далее.

💉 Что такое SQL-инъекция и как ее предотвратить в PHP-приложениях

В этом разделе мы рассмотрим, как настроить следующее:

  • Ограничить доступ к файлам и каталогам
  • Настроить журналы для мониторинга вредоносных действий
  • Предотвратить DDoS
  • Отключить список каталогов

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

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

Используя HTTP-аутентификацию

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

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

apt-get install -y apache-utils

Затем создайте файл паролей и пользователя, используя инструмент htpasswd, как показано ниже.

Инструмент htpasswd предоставляется утилитой apache2-utils.

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

Вы можете подтвердить, успешно ли вы создали пользователя и случайный пароль, с помощью следующей команды

cat  etc/apache2/ .htpasswd
Внутри раздела location вы можете вставить следующий код, чтобы запросить у пользователей аутентификацию, используя директиву auth_basic.

location /admin {

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

}

Используя директиву Allow

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

Внутри раздела location вы можете использовать следующий код, чтобы разрешить указанным IP-адресам доступ к конфиденциальной области.

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

Вы можете защитить Nginx от 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, чтобы ограничить соединение с определенными местоположениями или областями.

Например, приведенный ниже код позволяет 15 соединений от клиентов за определенный период.

Следующий код должен быт помещен в раздел location.

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {

    location /products/ {
        limit_conn addr 10;

    }
}

Завершить медленные соединения

Вы можете использовать директивы timeouts, такие как client_body_timeout и client_header_timeout, чтобы контролировать, как долго Nginx будет ожидать записи из тела и заголовка клиента.

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

server {
    client_body_timeout 5s;
    client_header_timeout 5s;
}

Отключить список каталогов

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

Вам нужно установить его в значение off, чтобы отключить список каталогов.

location / {
 auto_index  off;
}

Заключение

Мы настроили веб-сервер Nginx для эффективной работы и защиты от чрезмерного злоупотребления ресурсов в производственной среде.

 

 

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий