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


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

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

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

Требования

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

  • Ubuntu или любая другая платформа на основе Debian
  • Wget
  • Vim (текстовый редактор)

Кроме того, вам нужно запускать или выполнять некоторые команды в этом руководстве как пользователь root с помощью команды sudo.

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

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

  • Структура Nginx
  • Разделы, такие как событие, HTTP и почта
  • Допустимый синтаксис Nginx

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

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

Основной файл конфигурации находится в /etc/nginx/nginx.conf, тогда как другие файлы конфигурации находятся в / etc / nginx.

Основной контекст

Этот раздел или контекст содержат директивы вне определенных разделов, таких как раздел почты.

Любые другие директивы, такие как user nginx; , Worker_processes 1; , Error_log /var/log/nginx/error.log warn; и pid /var/run/nginx.pid можно поместить в основной раздел или контекст.

Но некоторые из этих директив, такие как worker_processes, также могут существовать в разделе событий.

Разделы

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

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

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

Директивы

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

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

рабочий_процессы авто;

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

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

  • Допустимые директивы начинаются с имени переменной, за которым следует один или несколько аргументов
  • Все действительные директивы заканчиваются точкой с запятой;
  • Разделы определяются с помощью фигурных скобок {}
  • Раздел может быть встроен в другой раздел
  • Конфигурация вне любого раздела является частью глобальной конфигурации Nginx.
  • Строки, начинающиеся со знака #, являются комментариями.

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

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

Мы рассмотрим, как настроить:

  • Рабочие
  • Дисковый ввод / вывод
  • Сетевая активность
  • Буферы
  • компрессия
  • Кэширование
  • Тайм-аут

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

cd nginx && Ls

Ищите папку конф. Внутри этой папки находится файл nginx.conf.

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

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

CD Conf
sudo vim nginx.conf

Ниже приведен скриншот того, как файл nginx.conf выглядит по умолчанию.

Рабочие

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

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

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

Мероприятия {
рабочий_процессы авто;
рабочий_соединения 1024;
worker_rlimit_nofile 20960;
multi_accept on;
mutex_accept on;
mutex_accept_delay 500ms;
используйте 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 включен, блокировка мьютекса назначается работнику на период времени, указанный в accept_mutex_delay. Когда таймфрейм истечет, следующий рабочий в очереди готов принять новые соединения.

use: эта директива указывает метод для обработки соединения от клиента. В этом руководстве мы решили установить значение epoll, потому что мы работаем на платформе Ubuntu. Метод epoll является наиболее эффективным методом обработки для платформ Linux..

epoll_events: значение этой директивы указывает количество событий, которые Nginx передаст ядру.

Дисковый ввод / вывод

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

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

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

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

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

местоположение / pdf / {
sendfile on;
AIO On;
}

местоположение / аудио / {
дирекция 4м
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 для эффективной обработки запросов. Буфер – это временное хранилище, где данные хранятся некоторое время и обрабатываются.

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

сервер {

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 на;
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: если вы хотите включить сжатие, установите значение этой директивы на. По умолчанию он отключен.

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 предоставляет функции для кэширования метаданных статического содержимого с помощью директивы open_file_cache.

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

http {

open_file_cache max = 1000 неактивно = 30 с;
open_file_cache_valid 30 с;
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: Nginx обычно очищает информацию в директиве open_file_cache после периода бездействия на основе open_file_cache_min_uses. Вы можете использовать эту директиву, чтобы установить минимальное количество доступа, чтобы определить, какие файлы и каталоги активно доступны.

open_file_cache_errors: вы можете использовать эту директиву, чтобы позволить Nginx кэшировать ошибки, такие как «отказано в доступе» или «невозможно получить доступ к этому файлу» при обращении к файлам. Таким образом, каждый раз, когда к ресурсу обращается пользователь, у которого нет на это права, Nginx отображает тот же отчет об ошибке «разрешение отклонено».

Тайм-аут

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

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

http {

keepalive_timeout 30 с;
keepalive_requests 30;
send_timeout 30 с;

}

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

location / admin {

basic_auth "Административная зона";
auth_basic_user_file / etc / apache2 / .htpasswd;

}

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

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

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

location / admin {
разрешить 192.168.34.12;
разрешить 192.168.12.34;
}

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

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

error_log: позволяет настроить ведение журнала для определенного файла, такого как syslog или stderr. Вы также можете указать уровень сообщений об ошибках, которые вы хотите войти.

access_log: позволяет записать запрос пользователя в файл access.log

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

http {

access_log logs / access.log объединены;
error_log logs / warn.log warn;

}

Предотвратить DDOS

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

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

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

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

limit_req_zone $ binary_remote_addr zone = one: скорость 10 м = 30r / m;

сервер {
location /admin.html {
зона limit_req = один;
}

}

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

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

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

limit_conn_zone $ binary_remote_addr zone = addr: 10 м;

сервер {

местоположение / продукты / {
limit_conn addr 10;

}
}

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

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

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

сервер {
client_body_timeout 5s;
client_header_timeout 5s;
}

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

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

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

расположение / {
auto_index off;
}

Вывод

Мы настроили веб-сервер Nginx для эффективной работы и защиты от чрезмерного использования в производственной среде. Если вы используете Nginx для интернет-приложений, ориентированных на Интернет, вам также следует рассмотреть возможность использования CDN и облачной защиты для повышения производительности и безопасности..

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me