Nginx — на сегодняшний день один из самых популярных веб-серверов, и эта популярность обусловлена тем, что он очень быстро и легко настраивается. Обратная сторона такой популярности — этот веб-сервер часто становится целью вредоносных атак. И в один не особенно прекрасный день вы можете столкнуться с ситуацией, когда ваш не имеющий лимитов nginx «упал» после того, как израсходовал доступные системные ресурсы. Поэтому стоит контролировать и ограничивать ресурсы, потребляемые Nginx.
Все ограничения задаются в конфигурационном файле nginx. Здесь будет описан один из вариантов настройки на примере Ubuntu 20.04. Ограничения вносятся в файл /etc/nginx/nginx.conf. Каждая директива должна заканчиваться точкой с запятой. Далее будут описаны наиболее важные параметры.
Глобальные настройки
Эти настройки повлияют на весь сервер. Описание параметров:
- worker_connections — этот параметр определяет, сколько одновременных соединений возможно для одного воркера (специального процесса, который взаимодействует между nginx и ядром операционной системы). Оптимальное количество таких процессов зависит от того, сколько ядер процессора и оперативной памяти имеет ваш сервер;
- multi_accept и multi_accept — эти директивы позволяют воркерам обрабатывать несколько процессов. Создается очередь, задачи в которой обрабатываются одна за другой;
- multi_accept_delay — этот параметр определяет задержку между обрабатываемыми задачами;
- use — метод обработки. Лучший выбор для серверов Linux — epoll.
- limit_conn — эта директива ограничивает количество одновременных соединений. Указывать ее можно в разных секциях конфигурационного файла, система работает до достижения первого из заданных ограничений. На скриншоте ниже показан пример, где общее доступное количество подключений равно 5 с одного IP-адреса, а на папку /download таких подключений может быть только 2:
Дисковые операции
Настройки в этой секции определяют, как именно nginx будет работать с диском:
- sendfile on — эта опция позволяет веб-серверу «обмениваться» данными небольших файлов в пространстве ядра ОС, не отправляя их в пространство приложения, тем самым значительно ускоряя работу nginx;
- aio on — эта директива разрешает многопоточные операции чтения/записи на диск.
Сжатие и кэширование
Вы можете кэшировать некоторые данные, чтобы заставить nginx работать быстрее. Сжатие в свою очередь уменьшит поток отправляемого веб-сервером трафика:
- gzip on — эта опция включает сжатие;
- gzip_comp_level — уровень сжатия. Чем выше цифра, тем более сильное сжатие будет применяться;
- gzip_types – определяет, файлы каких типов будут сжиматься. Например. текст хорошо сжимается, а картинки сжимать никакого смысла нет.
- open_file_cache — этот параметр разрешает кеширование файлов;
- open_file_cache_valid — время хранения кеша;
- open_file_cache_errors — эта опция позволяет кэшировать ошибки типа «отказано в доступе». Это может быть полезно для предотвращения массовых одновременных атак;
Настройки безопасности
Вы можете ограничить доступ для парсеров, ботов, загрузчиков ит.д. Просто добавьте показанную ниже конструкцию в описание раздела, доступ к которому нужно ограничить. Чаще всего доступ ботам запрещают глобально ко всему сайту:
if ($http_user_agent ~* LWP::curl|wget|*bot) {
return 403;
}
Кроме того, вы можете вообще разрешить доступ к некоторым разделам веб-сайта только с определенных IP-адресов. Может быть полезно, например, ограничить таким образом доступ к административной части вашего сайта:
location /admin/ {
## Разрешаем доступ с вашего IP
allow xxx.xxx.xxx.xxx/32;
## Блокируем подключение с любых других адресов
deny all;
}
Заключение
В этой статье описано, как оптимизировать работу сервера nginx, и приводится несколько советов по повышению уровня безопасности.