[lang_en]Nginx – Small, But Very Powerful and Efficient Web Server[/lang_en][lang_ru]Nginx – Маленький, Но Очень Мощный И Эффективный Web-Сервер[/lang_ru]
4 Apr2006

[lang_en]

Today, I want to describe one of the interesting tools I am using in my job. This tool is nginx – small, but very powerful and efficient web server created by Igor Sysoev for large Russian web company Rambler and kindly provided by open-source community. This server can be used as standalone HTTP-server and as reverse proxy server before some Apache or another “big” server” to reduce load to backend server by many concurrent HTTP-sessions. As standalone web server, nginx can easily handle huge http-load on static files (images, html-pages, etc).

[/lang_en]

[lang_ru]

Сегодня я хотел бы рассказать об еще одном полезном инстументе, который я использую в моей администраторской практике. Этот инструмент – nginx – маленький и легкий, но очень мощный и эффективный web-сервер, созданный Игорем Сысоевым для использования на серверах компании Рамблер и любезно предоставленный им для использования open-source сообществом. Этот сервер может использоваться как самостоятельный HTTP-сервер или как reverse proxy перед Апачем или любым другим “тяжелым” веб сервером для снижения нагрузки на backend-сервере от большого количества одновременных HTTP-сессий. Как самостоятельный сервер, nginx без проблем выдерживает огромные нагрузки при раздаче статического контента (images, html-pages и т.д.).

[/lang_ru]

[lang_en]

Main features of nginx server:

  • Handling requests to static content, automatical handling of index files and building directory listings.
  • Accelerated proxying without caching, simple load banancing and fail-over.
  • Accelerated support of remote FastCGI servers with simple load banancing and fail-over.
  • Modules and filters including compression (gzip), byte-ranges, chunked responses, SSI-filter, concurrently executed FastCGI or proxy subrequests from one SSI-page.
  • SSL-support.

Advanced features of nginx server:

  • IP-based and name-based virtual servers.
  • Support for keep-alive and pipelined connections.
  • Flexible configurations like in Apache, tunable timeouts and buffers.
  • Config file and even executable file updating without any termination in service.
  • Tunable log files with fast rotation.
  • Special pages for errors 400-599.
  • Very efficient URI rewriting with regular expressions.
  • Access rules based on client’s IP address and on pasword (Basic auth).
  • Download speed limits.

Main architecture specifics of nginx server:

  • One management and many worker processes; workers are running from non-privileged user.
  • Support for different techniques for asynchronous sockets handling: kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select and poll.
  • sendfile() system call support: sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+) and sendfilev (Solaris 8 7/01+).
  • Accept-filters support on FreeBSD 4.1+ and TCP_DEFER_ACCEPT on Linux 2.4+.
  • Very efficient memory handling: it needs only 2.5Mbytes of RAM for 10000 inactive keep-alive connections.
  • Minimum of memory copying operations

As an experimental feature, perl interpreper integration can be turned on in nginx.

As for my job, we are using nginx as a primary software for free hosting platforms. I have developed specific modules for banner inserting and stats calculation in nginx and now our central server can handle about 150-200Mbit/s of highly fragmented http-traffic (all files are small). I think, this is really good result bacause with any possible tunnings of Apache on the same servers we were not able to handle even 60-80Mbit/s.

IMHO, main problem of this server is lack of English documentation. As far as i know, its author is really busy and have no time to translate documentation to English. I hope, this article gave you main ideas of what nginx is and why I think that it is the best of lightweight http-servers in the world. 😉

digg story

[/lang_en]

[lang_ru]

Основные возможности 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

[/lang_ru]