- Posted in: Networks
Сегодня я хотел бы рассказать об еще одном полезном инстументе, который я использую в моей администраторской практике. Этот инструмент – nginx – маленький и легкий, но очень мощный и эффективный web-сервер, созданный Игорем Сысоевым для использования на серверах компании Рамблер и любезно предоставленный им для использования open-source сообществом. Этот сервер может использоваться как самостоятельный HTTP-сервер или как reverse proxy перед Апачем или любым другим “тяжелым” веб сервером для снижения нагрузки на backend-сервере от большого количества одновременных HTTP-сессий. Как самостоятельный сервер, nginx без проблем выдерживает огромные нагрузки при раздаче статического контента (images, html-pages и т.д.).
Основные возможности nginx:
- обслуживание статических запросов, индексных файлов, автоматическое создание списка файлов;
- акселерированное проксирование без кэширования, простое распределение нагрузки и отказоустойчивость;
- акселерированная поддержка удалённых FastCGI серверов, простое распределение нагрузки и отказоустойчивость;
- модульность, фильтры, в том числе сжатие (gzip), byte-ranges (докачка), chunked ответы, SSI-фильтр; несколько подзапросов на одной странице, обрабатываемые в SSI-фильтре через прокси или FastCGI, выполняются параллельно.
- поддержка SSL;
Дополнительные возмодности сервера:
- виртуальные сервера, определяемые по ip-адресу и имени;
- поддержка keep-alive и pipelined соединений;
- гибкость конфигурации на уровне Apache, настройка таймаутов и размеров буферов;
- изменение настроек и обновление исполняемого файла без перерыва в обслуживании клиентов;
- настройка форматов логов, быстрая ротация логов;
- специальные страницы для ошибок 400-599;
- изменение URI с помощью регулярных выражений;
- выполнение разных функций в зависимости от адреса клиента;
- ограничение доступа в зависимости от адреса клиента и по паролю (Basic аутентификация);
- ограничение скорости отдачи ответов;
Основные архитектурные особенности nginx:
- один главный процесс и несколько рабочих, рабочие процессы работают под непривилегированным пользователем;
- поддержка kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select и poll;
- использование возможностей, предоставляемых kqueue, таких как EV_CLEAR, EV_DISABLE (для временного выключения события), NOTE_LOWAT, EV_EOF, число доступных данных, коды ошибок;
- поддержка sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+) и sendfilev (Solaris 8 7/01+);
- поддержка accept-фильтров (FreeBSD 4.1+) и TCP_DEFER_ACCEPT (Linux 2.4+);
- на 10 000 неактивных keep-alive соединений расходуется около 2.5M памяти;
- минимум операций копирования данных;
Как экспериментальная возсожность, в nginx включен интерпретатор языка perl для программирования особо сложной логики обработки запросов.
Конкретно в моей работе я использую это ПО как основной веб-сервер при построении бесплатных хостингов. Я разработал несколько специфичных модулей для добавления банеров и учета статистики посещения страниц и сейчас один их наших главных серверов способен выдержать нагрузку в 150-200Mbit/s сильно “фрагментированного” трафика (все запрашиваемые файлы маленькие). Я думаю, что это хороший результат, т.к. раньше на этом же сервере Apache даже при всех возможных оптимизациях не мог обработать более 60-80Mbit/s.
Мне кажется, что одной из важных проблем nginx является отсутствие англоязычной документации, сдерживающее использование такого полезного инструмента в работе иностранных администраторов. Насколько мне известно, автор достаточно сильно занят и не собирается заниматься переводом документации до момента выхода финальной стабильной версии. Я же надеюсь, что дал Вам базовую информацию о том, что такое nginx и почему мне кажется, что это лучший из легковесных http-серверов в мире. 😉