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

Содержание

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

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

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

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

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

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

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

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

Требования

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

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

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

Раздел Main

Разделы

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

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

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

Директивы

Директивы в Nginx состоят из имени переменной и ряда аргументов, например:

Worker_processes – это имя переменной, в то время как auto служит аргументом.

Директивы заканчиваются точкой с запятой, как показано выше.

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

Ниже приведен правильный синтаксис конфигурации Nginx:

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

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

Workers

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

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

Ввод / вывод диска

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

Дисковый ввод / вывод просто относится к операциям записи и чтения между жестким диском и оперативной памятью.

Мы будем использовать функцию sendfile () внутри ядра для отправки небольших файлов.

Вы можете использовать раздел http, раздел location и раздел server для директив в этой области.

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

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

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

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

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

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

Цель алгоритма буферизации Nagle – предотвратить насыщение небольших пакетов высоконагруженной сети.

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

Буферы

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

Буфер – это временное хранилище, где некоторое время хранятся и обрабатываются данные.

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

Компрессия

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

В этом разделе мы будем использовать директивы, такие как gzip, gzip_comp_level и gzip_min_length, для сжатия данных.

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

Кэширование

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

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

Тайм-аут

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

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

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

Далее рассказывается только о том, как безопасно настроить Nginx а не само веб-приложения.

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

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

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

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

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

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

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

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

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

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

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

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

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

Настрйка логов для мониторинга вредоносных действий

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

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

Внутри раздела HTTP вы можете использовать следующую настройку:

Предотвращение DDOS

Вы можете защитить Nginx от DDOS-атаки следующими способами:

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

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

Добавьте следующий код в раздел location, встроенный в раздел server.

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

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

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

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

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

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

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

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

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

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

Заключение

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

Практические советы по тюнингу веб-сервера NGINX

Советы и примеры по тюнингу NGINX показаны на базе операционных систем FreeBSD и CentOS, но они подойдут для любой системы семейства Linux.

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

1. Установка NGINX

Для тюнинга установка из пакетов или портов не подходит. Лучше всего выполнять сборку и установку из исходников.

Скачайте последнюю стабильную версию nginx (актуальную ссылку можно посмотреть по адресу https://nginx. org/ru/download. html):

Копируем ссылку на последнюю стабильную версию NGINX

. и с помощью данной ссылки скачиваем исходник.

* На момент обновления статьи актуальная версия nginx — 1.16.1.

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

И перейдите в распакованную директорию:

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

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

Приступаем к конфигурированию:

./configure \
—prefix=/usr/local/etc/nginx \
—with-cc-opt='-I /usr/local/include' \
—with-ld-opt='-L /usr/local/lib' \
—conf-path=/usr/local/etc/nginx/nginx. conf \
—sbin-path=/usr/local/sbin/nginx \
—pid-path=/var/run/nginx. pid \
—error-log-path=/var/log/nginx-error. log \
—user=www \
—group=www \
—http-client-body-temp-path=/var/tmp/nginx/client_body_temp \
—http-fastcgi-temp-path=/var/tmp/nginx/fastcgi_temp \
—http-proxy-temp-path=/var/tmp/nginx/proxy_temp \
—http-scgi-temp-path=/var/tmp/nginx/scgi_temp \
—http-uwsgi-temp-path=/var/tmp/nginx/uwsgi_temp \
—http-log-path=/var/log/nginx-access. log \
—with-http_ssl_module \
—with-file-aio \
—with-pcre \
—with-http_stub_status_module \
—without-http_charset_module \
—without-http_ssi_module \
—without-http_userid_module \
—without-http_autoindex_module \
—without-http_geo_module \
—without-http_map_module \
—without-http_split_clients_module \
—without-http_referer_module \
—without-http_empty_gif_module \
—without-http_browser_module \
—without-http_upstream_hash_module \
—without-http_upstream_ip_hash_module \
—without-http_upstream_least_conn_module \
—without-http_upstream_keepalive_module \
—without-mail_pop3_module \
—without-mail_imap_module \
—without-mail_smtp_module

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

yum install gcc pcre-devel openssl-devel make

Приступаем к конфигурированию:

./configure \
—prefix=/etc/nginx \
—sbin-path=/usr/sbin/nginx \
—pid-path=/var/run/nginx. pid \
—error-log-path=/var/log/nginx/error. log \
—lock-path=/var/run/nginx. lock \
—user=nginx \
—group=nginx \
—http-log-path=/var/log/nginx-access. log \
—with-http_ssl_module \
—with-file-aio \
—with-pcre \
—with-http_stub_status_module \
—without-http_charset_module \
—without-http_ssi_module \
—without-http_userid_module \
—without-http_autoindex_module \
—without-http_geo_module \
—without-http_map_module \
—without-http_split_clients_module \
—without-http_referer_module \
—without-http_empty_gif_module \
—without-http_browser_module \
—without-http_upstream_hash_module \
—without-http_upstream_ip_hash_module \
—without-http_upstream_least_conn_module \
—without-http_upstream_keepalive_module \
—without-mail_pop3_module \
—without-mail_imap_module \
—without-mail_smtp_module

Теперь запустите сборку дистрибутива из исходника:

И установите nginx:

Теперь можно запустить и проверить наш веб-сервер.

а) во FreeBSD необходимо разрешить запуск демона nginx:

service nginx start

б) в CentOS действий больше.

Создаем учетную запись nginx и в качестве владельца каталога для его настроек:

Создаем юнит для systemd:

Применяем изменения в systemd:

Разрешаем автозапуск сервиса и стартуем его:

systemctl enable nginx

systemctl start nginx

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

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

Открываем конфигурационный файл nginx.

. или, если nginx ставился из пакетов:

Пример настроенного nginx. conf:

multi_accept, по умолчанию off. Если включен, позволяет принимать максимально возможное количество соединений. Иначе, процесс nginx за один раз будет принимать только одно новое соединение.

3. Оптимизация работы с файлами

Пример настроенного nginx. conf:

http <
.
sendfile on;
aio on;
tcp_nopush on;

open_file_cache max=100000 inactive=20s;
open_file_cache_valid 45s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
.
>

sendfile позволяет использовать более совершенный системный вызов, который обеспечивает прямую передачу файла (без системных вызовов read + write).

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

tcp_nopush позволит передавать заголовок ответа и начало файла в одном пакете.

open_file_cache по умолчанию выключена. Задает настройку для кэширования информации о файлах, с которыми работает nginx. По умолчанию, выключено.

open_file_cache_valid задает время, через которое веб-сервер будет проверять актуальность данных. По умолчанию, 60 секунд.

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

open_file_cache_errors включает или выключает кэширование ошибок.

Также вы можете найти инструкции по тюнингу, где говорится об опции tcp_nodelay. Ее менять не нужно, так как по умолчанию она уже включена.

Для того, чтобы aio заработал в FreeBSD, необходимо выполнить следующее.

Подгружаем модуль aio в ядро системы:

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

Открываем на редактирование файл с настройками лимитов для пользователей и групп:

.
nginx hard nofile 199680
nginx soft nofile 65535
.

* в данном примере мы задаем ограничение для пользователя nginx на количество открытых файлов.

Зададим ограничение для текущей загрузки:

4. Логирование

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

Пример настроенного nginx. conf:

error_log /var/log/nginx-error. log crit;

* само собой, не стоит отключать логирование на хостинге или если вы предоставляете доступ к веб-сервису третьим лицам.

5. Сжатие

Это один из самых эффективных методов ускорить ответ от вашего веб-сервера nginx.

Пример настроенного nginx. conf:

http <
.
gzip on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/javascript application/javascript application/x-javascript text/xml application/xml application/xml+rss application/json;
gzip_disable "msie6";
.

gzip включает сжатие.

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

gzip_proxied перечисляет параметры проксированных запросов, для которых будет разрешено сжатие.

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

gzip_disable запрещает для перечисленных параметров заголовка User-Agent сжатие. В данном примере для Internet Explorer 6 сжатие применяться не будет (данный браузер не умеет принимать сжатые ответы).

6. Настройка метода select

В Linux и FreeBSD используются свои методы обработки соединений. На данный момент наиболее эффективными являются epoll (Linux) и kqueue (FreeBSD).

а) Пример nginx. conf для FreeBSD:

б) Пример nginx. conf для Linux:

7. Обработка статики и ее кэширование

NGINX умеет сам отдавать статические данные, не заставляя сервер backend этим заниматься. В настройке каждого сайта (секция server добавляем):

* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js|svg|woff2|ttf)$ <
root /var/www/site
expires modified +1w;
>
>

* в данном примере для перечисленных статических файлов NGINX сам будет сам их отдавать. Сами файлы мы будем искать в каталоге /var/www/site, однако, опцию root можно и не задавать в location, если мы ее задали уровнем выше (в секции server). Также мы задали время кэширования для файлов, равное 1 недели от момента их модификации.

8. Пример настроенного файла конфигурации

В итоге, у нас получиться что-то на подобие:

events <
worker_connections 2048;
multi_accept on;
use epoll;
>

http <
include mime. types;
default_type application/octet-stream;

keepalive_timeout 45;
reset_timedout_connection on;
client_body_timeout 35;
send_timeout 30;

sendfile on;
aio on;
tcp_nopush on;

open_file_cache max=100000 inactive=20s;
open_file_cache_valid 45s;
open_file_cache_min_uses 2;
open_file_cache_errors on;

access_log off;
error_log /var/log/nginx-error. log crit;

gzip on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/javascript application/javascript application/x-javascript text/xml application/xml application/xml+rss application/json;
gzip_disable "msie6";

server <
listen 80;
server_name localhost;

location / <
root html;
index index. html index. htm;
>

error_page 500 502 503 504 /50x. html;
location = /50x. html <
root html;
>
>
>

* обратите внимание, что в Linux в events use задается epoll, во FreeBSD — kqueue.

9. Проверка корректности настроек и их применение

После внесения всех настроек необходимо проверить их корректность командой:

Источники:

https://itsecforu. ru/2020/02/25/%F0%9F%8C%90-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%B8-%D0%B1%D0%B5/

https://www. dmosk. ru/instruktions. php? object=kak-optimizirovat-veb-server-nginx

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

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: