веб-сервер, написанный на PHP

Vincent Negrier, также известный как sIX, представил публике первый веб-сервер, полностью написанный на PHP. Полное название продукта - the aEGiS PHP nano web server, однако пользователи, да и сам автор, сокращают это название до просто Nanoweb. В кратком README, поставляемом с исходниками сервера, автор рассказывает, почему нам следует использовать это чудо программистской мысли. И первое, на что он обращает внимание – это то, что сервер получился шустрым и устойчивым. Насчет устойчивости в отчете на веб-сайте проекта сказано следующее: «За 101 день аптайма сервер не показал ни единой проблемы с работоспособностью, обслужив за это время более 4,1 миллиона запросов общим «весом» в более чем 52 гигабайта». О производительности мы поговорим чуть позже, а пока перечислим основные фичи этого чудо-сервера:

- совместимость с HTTP/1.1;

- простые, но богатые возможности конфигурирования;

- модульная архитектура;

- поддержка FastCGI, CGI и Server side includes (SSI);

- виртуальные хосты, адресумые по имени или порту;

- списки контроля доступа (Access control lists, ACLs);

- поддержка аутентификации через htpasswd, MySQL, PostgreSQL и LDAP;

- поддержка тем для генерируемого сервером контента;

- совместимый а Apache формат логов;

- поддержка SSL через внешние модули;

- защита от DoS-атак;

- поддержка фильтров и сжатия;

- поддержка черных списков RBL (mail-abuse.org);

- поддержка расширений протокола HTTP (новые методы);

- и многое другое.

Что касается производительности, на сайте разработчика выложены результаты тестов. Вот посмотрите на вывод диагностической программы ab (Apache benchmark) после окончания теста, состоящего из 500 запросов (20 одновременных) к статическому и динамическому контенту. Измерения проводились на машине с процессором AMD Duron 700 и одним гигабайтом оперативной памяти.

Статический тест:

Server Software: aEGiS_nanoweb/2.0.1-dev
Server Hostname: si.kz
Server Port: 80

Document Path: /six.gif
Document Length: 28352 bytes

Concurrency Level: 20
Time taken for tests: 3.123 seconds
Complete requests: 500
Failed requests: 0
Broken pipe errors: 0
Keep-Alive requests: 497
Total transferred: 14496686 bytes
HTML transferred: 14337322 bytes
Requests per second: 160.10 [#/sec] (mean)
Time per request: 124.92 [ms] (mean)
Time per request: 6.25 [ms] (mean, across all concurrent requests)
Transfer rate: 4641.91 [Kbytes/sec] received

Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 1.9 0 13
Processing: 18 100 276.4 40 2739
Waiting: 1 97 276.9 39 2739
Total: 18 100 277.8 40 2750

Percentage of the requests served within a certain time (ms)
50% 40
66% 49
75% 59
80% 69
90% 146
95% 245
98% 449
99% 1915
100% 2750 (last request)


Динамический тест (PHP 4, CGI):

Server Software: aEGiS_nanoweb/2.0.1-dev
Server Hostname: si.kz
Server Port: 80

Document Path: /index.php
Document Length: 1606 bytes

Concurrency Level: 20
Time taken for tests: 70.509 seconds
Complete requests: 500
Failed requests: 0
Broken pipe errors: 0
Keep-Alive requests: 0
Total transferred: 921500 bytes
HTML transferred: 803000 bytes
Requests per second: 7.09 [#/sec] (mean)
Time per request: 2820.36 [ms] (mean)
Time per request: 141.02 [ms] (mean, across all concurrent requests)
Transfer rate: 13.07 [Kbytes/sec] received

Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 2.1 0 12
Processing: 388 2785 785.6 2779 4860
Waiting: 372 2784 785.7 2779 4859
Total: 388 2785 785.5 2779 4860

Percentage of the requests served within a certain time (ms)
50% 2779
66% 3099
75% 3286
80% 3378
90% 3802
95% 4241
98% 4530
99% 4631
100% 4860 (last request)


Динамический тест (PHP 4, FastCGI):

Server Software: aEGiS_nanoweb/1.8.0-dev
Server Hostname: si.kz
Server Port: 80

Document Path: /index.php
Document Length: 1606 bytes

Concurrency Level: 20
Time taken for tests: 6.817 seconds
Complete requests: 500
Failed requests: 0
Broken pipe errors: 0
Keep-Alive requests: 488
Total transferred: 946925 bytes
HTML transferred: 803000 bytes
Requests per second: 73.35 [#/sec] (mean)
Time per request: 272.68 [ms] (mean)
Time per request: 13.63 [ms] (mean, across all concurrent requests)
Transfer rate: 138.91 [Kbytes/sec] received

Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 1
Processing: 10 246 358.4 125 3588
Waiting: 10 246 358.3 125 3587
Total: 10 246 358.4 125 3588
ERROR: The median and mean for the initial connection time are more than twice the standard deviation apart. These results are NOT reliable.
Percentage of the requests served within a certain time (ms)
50% 125
66% 290
75% 391
80% 426
90% 581
95% 743
98% 1078
99% 1506
100% 3588 (last request)


Как видите, результаты впечатляют. Сработает ли все так здорово у конечных пользователей, или мы имеем дело с типичным примером подгона результатов в лабораторных условиях, сказать трудно. Но вы можете попробовать сами! Скачайте последнюю версию с сайта разработчика
(nanoweb.si.kz) и установите у себя. Качать, кстати, всего ничего – около 250 килобайт.

Ах, да, еще одна бесспорно приятная особенность продукта – он кроссплатформенный настолько, насколько кроссплатформенен PHP :) То есть везде, где работает PHP, будет работать и Nanoweb. Правда, разработчик предупреждает, что производительность под Windows будет не столь хороша, как под *nix, поскольку PHP не поддерживает ветвление процессов (forking) под Windows.

Инсталляция очень простая – для *nix и Windows прямо в базовой поставке предусмотрены инсталляционные скрипты - install-sh и install.bat соответственно. Не забудьте заглянуть в файл INSTALL, откуда вы узнаете такую важную информацию, как список опций, с которыми должен быть собран ваш PHP, чтобы на нем нормально работал Nanoweb.

Ну, а что делать дальше вы узнаете из документации, которая есть как в архиве с Nanoweb, так и на сайте производителя.



Alice D. Saemon


Сетевые решения. Статья была опубликована в номере 02 за 2007 год в рубрике software

©1999-2024 Сетевые решения