Nginx – Маленький, Но Очень Мощный И Эффективный Web-Сервер
4 Apr2006

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

digg story