Lighttpd - установка, базовая настройка и тестирование производительности

Версия для печатиОтправить другуPDF version

Lighttpd

Решил на одном из серверов вместо Apache установить быстрый и легкий Lighttpd. Просмотреть результаты тестирования этих двух web-сервером можно по ссылке: Lighttpd vs Apache.

Итак, результаты тестирования говорят сами за себя, так что "опробовать" Lighttpd однозначно стоит.

Итак, установку выполним как всегда из портов, благо они обновляются ежедневно по cron-у. Даем команду на установку:

# cd /usr/ports/www/lighttpd && make install clean && rehash

 При сборке были отмечены следующие опции:

Options for lighttpd 1.4.28_4

[X] BZIP2      Enable Bzip2 support
[X] CML        Enable Cache Meta Language support
[X] FAM        Enable fam/gamin support
[X] GDBM       Enable gdbm storage support
[ ] IPV6       Enable IPV6 support
[X] LIBEV      Enable libev support
[X] MAGNET     Enable magnet support
[X] MEMCACHE   Enable memory caching support
[X] MYSQL      Enable MYSQL support
[X] MYSQLAUTH  Enable mysql auth (requires WITH_MYSQL)
[X] NODELAY    Set TCP_NODELAY on listening sockets
[ ] OPENLDAP   Enable LDAP support
[X] OPENSSL    Enable SSL support
[X] SPAWNFCGI  Depend on spawn-fcgi utility 
[ ] VALGRIND   Enable valgrind support
[ ] WEBDAV     Enable WebDAV support

Первым делом добавим поддержку Lighttpd в rc.conf:

# echo '# Web-server Lighttpd' >> /etc/rc.conf
# echo 'lighttpd_enable="YES"' >> /etc/rc.conf

Потом приступаем к редактированию конфигурационного файла. В конфигурационный файл по умолчанию (/usr/local/etc/lighttpd/lighttpd.conf), внес только единственное изменение - отключил поддержку IPv6. Все остальное оставил по умолчанию - еще будет время для внесения изменений. Пытаемся запустить Lighttpd:

# sh /usr/local/etc/rc.d/lighttpd start

Starting lighttpd.
2011-05-07 01:34:45: (configfile.c.1214) base-docroot doesn't exist: /usr/local/www/data/
2011-05-07 01:34:45: (server.c.620) setting default values failed
/usr/local/etc/rc.d/lighttpd: WARNING: failed to start lighttpd

Хм... Как оказалось, каталога для размещения данных не существует. Необходимо его создать и выставить необходимые права:

# mkdir /usr/local/www/data
# chown www:www /usr/local/www/data

Ну и для полноты картины, положим туда индексный html-файл:

cat /usr/local/www/data/index.html
 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2002/REC-xhtml1-20020801/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ru" xml:lang="ru">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=KOI8-R">
  <title>Тестовая страница</title>
</head>

<body>

<center><h3>Тестовая страница.</p></center>
<p>&nbsp;</p>
<center><h3>Test Ok!</a></h3></center>
<p>&nbsp;</p>

</body>
</html>

Также укажем IP-адрес, на котором "слушать" запросы. "Забиндим" Lighttpd на IP 192.168.159.254. Соответственно строка в конфигурационном файле принимает следующий вид:

$SERVER["socket"] == "192.168.159.254:80" { }

Снова пытаемся запустить Lighttpd:

# sh /usr/local/etc/rc.d/lighttpd start
Starting lighttpd.

Проверяем, есть ли в процессах Lighttpd:

# ps -ax | grep lighttpd
 7051  ??  S      0:00.00 /usr/local/sbin/lighttpd -f /usr/local/etc/lighttpd/lighttpd.conf

Lighttpd в процессах присутствует, что означает, что мы на верном пути. Кстати, стоит обратить внимание на то, что в памяти висит только один процесс, а не несколько, как в случае с Apache.

Теперь проверим, слушает ли Lighttpd запросы на 80 порту, и обрабатывает ли их. Попробуем в браузере ввести IP-адрес сервера. В результате имеем вывод следующей веб-страницы, что подтверждает обработку запросов:

Картинки

 

Тестирование производительности.

Теперь попробуем провести самостоятельное тестирование производительности Lighttpd и  Apache. На этой же машине установил Apache. Остановим Lighttpd и запустим Apache. Apache запускаем тоже на дефолтных настройках, изменив в конфигурационном файле все вхождения /usr/local/www/apache22/data на значение /usr/local/www/data. Стоит иметь ввиду, что отдаем статический файл index.html.

Добавим в rc.conf запуск Apache:

# echo 'apache22_enable="YES"' >> /etc/rc.conf

Останов Lighttpd и запуск Apache:

# sh /usr/local/etc/rc.d/lighttpd stop
Stopping lighttpd.

# sh /usr/local/etc/rc.d/apache22 start
Performing sanity check on apache22 configuration:
Syntax OK
Starting apache22.

Теперь с помощью ab (Apache HTTP server benchmarking tool) проверим и сравним производительность web-севреров.

apache-worker-2.2.17_2

# ab -n 1000 http://192.168.159.254/

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 195.3.159.254 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests

Server Software:        Apache/2.2.17
Server Hostname:        195.3.159.254
Server Port:            80

Document Path:          /
Document Length:        469 bytes

Concurrency Level:      1
Time taken for tests:   1.451 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      760000 bytes
HTML transferred:       469000 bytes
Requests per second:    689.24 [#/sec] (mean)
Time per request:       1.451 [ms] (mean)
Time per request:       1.451 [ms] (mean, across all concurrent requests)
Transfer rate:          511.55 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.1      1       2
Processing:     1    1   0.2      1       5
Waiting:        1    1   0.2      1       5
Total:          1    1   0.2      1       5

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%      2
  95%      2
  98%      2
  99%      2
 100%      5 (longest request)

Производительность: 689.24 запросов в секунду.

Останавливаем Apache и запускаем Lighttpd:

# sh /usr/local/etc/rc.d/apache22 stop
Stopping apache22.
Waiting for PIDS: 7658.

# sh /usr/local/etc/rc.d/lighttpd start
Starting lighttpd.

Теперь протестируем производительность Lighttpd.

lighttpd-1.4.28_4

# ab -n 1000 http://192.168.159.254/

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 195.3.159.254 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software:        lighttpd
Server Hostname:        195.3.159.254
Server Port:            80

Document Path:          /
Document Length:        469 bytes
Concurrency Level:      1
Time taken for tests:   1.294 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      696000 bytes
HTML transferred:       469000 bytes
Requests per second:    772.86 [#/sec] (mean)
Time per request:       1.294 [ms] (mean)
Time per request:       1.294 [ms] (mean, across all concurrent requests)
Transfer rate:          525.31 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.1      1       2
Processing:     1    1   0.1      1       2
Waiting:        0    1   0.1      1       2
Total:          1    1   0.2      1       3
Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%      1
  95%      1
  98%      2
  99%      2
 100%      3 (longest request)

Хм... Если чесно, то я ожидал большего... Попробуем теперь "прикрутить" PHP к Lighttpd (ну и к Apache заодно). Для начала установим PHP. Опции сборки установил такие:

Options for php52 5.2.17

[X] CLI        Build CLI version
[X] CGI        Build CGI version
[X] APACHE     Build Apache module
[ ] DEBUG      Enable debug
[X] SUHOSIN    Enable Suhosin protection system (not for jails)
[X] MULTIBYTE  Enable zend multibyte support
[ ] IPV6       Enable ipv6 support
[ ] MAILHEAD   Enable mail header patch
[ ] REDIRECT   Enable force-cgi-redirect support (CGI only)
[ ] DISCARD    Enable discard-path support (CGI only)
[X] FASTCGI    Enable fastcgi support (CGI only)
[X] FPM        Enable fastcgi process manager (CGI only)
[X] PATHINFO   Enable path-info-check support (CGI only)

Для Apache необходимо добавить в конфигурационный файл такие строки в блок <IfModule mime_module>:

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

Параметр DirectoryIndex необходимо видоизменить до следующего значения:

DirectoryIndex index.php

Ну и создадим конфигурационный файл для PHP, воспользовавшись одним из предложенных примеров:

# cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini

Теперь поместим в /usr/local/www/data файл index.php следующего содержания:

# cat /usr/local/www/data/index.php

<?php
    phpinfo();
?>

Теперь попробуем "подружить" Lighttpd и PHP. Связка  Lighttpd и PHP будет работать через FastCGI, поэтому необходимо, чтобы в php.ini переменная cgi.fix_pathinfo была установлена в значение 1 (по умолчанию).

Следующий шаг - правка конфигурационных файлов Lighttpd. В файле /usr/local/etc/lighttpd/modules.conf необходимо расскоментировать такую строку:

include "conf.d/fastcgi.conf"

А в файл /usr/local/etc/lighttpd/conf.d/fastcgi.conf необходимо вставить такой блок:

fastcgi.server = ( ".php" => ((
                "bin-path" => "/usr/local/bin/php-cgi",
                "socket" => "/tmp/php.socket",
                "max-procs" => "2",
                "bin-environment" => (
                "PHP_FCGI_CHILDREN" => "16",
                "PHP_FCGI_MAX_REQUESTS" => "10000"
         ),
                "bin-copy-environment" => (
                "PATH", "SHELL", "USER"
        ),
                "broken-scriptfilename" => "enable"
)))

После этого перезаускаем Lighttpd, чтобы изменения вступили в силу:

# sh /usr/local/etc/rc.d/lighttpd restart

В результате должна отображаться страница свойств PHP (как при использовании Apache, так и при использовании Lighttpd:

Картинки

Не буду уже описывать остановы и запуски определенных серверов... Итак, тестируем Apache на вивод PHP-содержимого.

# ab -n 1000 http://192.168.159.254/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.159.254 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests

Server Software:        Apache/2.2.17
Server Hostname:        192.168.159.254
Server Port:            80

Document Path:          /
Document Length:        27895 bytes

Concurrency Level:      1
Time taken for tests:   1.097 seconds
Complete requests:      1000
Failed requests:        989
   (Connect: 0, Receive: 0, Length: 989, Exceptions: 0)
Write errors:           0
Non-2xx responses:      989
Total transferred:      776381 bytes
HTML transferred:       506623 bytes
Requests per second:    911.48 [#/sec] (mean)
Time per request:       1.097 [ms] (mean)
Time per request:       1.097 [ms] (mean, across all concurrent requests)
Transfer rate:          691.07 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:     1    1   0.5      1      11
Waiting:        0    1   0.4      1      11
Total:          1    1   0.5      1      11

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%      1
  95%      1
  98%      2
  99%      4
 100%     11 (longest request)

А теперь проверим производительность PHP на Lighttpd:

# ab -n 1000 http://192.168.159.254/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.159.254 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests

Server Software:        lighttpd
Server Hostname:        192.168.159.254
Server Port:            80

Document Path:          /
Document Length:        23106 bytes

Concurrency Level:      1
Time taken for tests:   3.873 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      23250000 bytes
HTML transferred:       23106000 bytes
Requests per second:    258.20 [#/sec] (mean)
Time per request:       3.873 [ms] (mean)
Time per request:       3.873 [ms] (mean, across all concurrent requests)
Transfer rate:          5862.47 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:     3    3   0.2      3       5
Waiting:        1    1   0.2      1       3
Total:          3    4   0.2      4       5

Percentage of the requests served within a certain time (ms)
  50%      4
  66%      4
  75%      4
  80%      4
  90%      4
  95%      4
  98%      5
  99%      5
 100%      5 (longest request)

При выводе динамического содержимого Lighttpd сильно уступает в производительности Apache. Однако это может быть следствием того, что в Lighttpd PHP работает через FastCGI. Проверять эту теорию нету ни времени ни желания.

Остановимся на том, что Apache желательно использовать при выдаче динамического содержимого, а Lighttpd желательно использовать для выдачи статического контента.

Ваша оценка: Нет Средняя: 5 (3 голоса)

Вставай, Україно!

Литература

Опыт растет прямо пропорционально выведенному из строя оборудованию.