веб-сервер, написанный на 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
- совместимость с 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