Блог об it, программировании и интернет-маркетинге

Делюсь наблюдениями и личным опытом в области программирования и интернет-маркетинга

Конфигурируем веб-сервер Yaws на Erlang

Posted on | August 2, 2011 | No Comments

Сейчас начинаю делать проект на Erlang и встала необходимость выбора веб-сервера. Выбор пал на Yaws v.1.90 (расш. Yet Another Web Server) мне понравилась его заявленная высокая отказоустойчивость, максимальное количество одновременно обрабатываемых запросов и то, что проект продолжает развиваться, например в Yaws 1.90 от 24.05.2011 добавили поддержку Websockets. По ходу установки и настройки сервера я решил написать небольшую статью в помощь начинающим. Самое интересное под катом..

Диаграмма иллюстрирует скорость отдачи при возрастающей нагрузке. Результаты бенчмарка Apache 2.0.39 MPM Worker vs Yaws на медленных запросах показали что Apache ложится на 4000 запросах в секунду, Yaws держится и на 80 000 запросов/сек. При условиях: медленные HTTP запросы, фиксированная пропускная способность исходящего канала в 800 Кб/сек, возрастающая нагрузка. Условия теста очень похожи на DDOS атаку. Эта старая картинка есть в половине статей о Yaws, что ж, я тоже не буду исключением :)


Полное описание теста можно прочитать тут. А я пока приступлю к Yaws.
Установим веб-сервер (Erlang установится автоматически, если не был установлен ранее), также в дистрибутиве будет БД Mnesia, тоже написанная на Erlang
$ sudo apt-get install yaws
или
$ sudo aptitude install yaws
Основной конфигурационный файл лежит в /etc/yaws/yaws.conf, вот простой пример Вот простой конфиг-файл:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
max_num_cached_files = 8000
max_num_cached_bytes = 6000000
logdir = /var/log/yaws 
<server www.mydomain.org>
      port = 80
      listen = 192.168.128.31
      docroot = /var/yaws/www
      access_log = false
      <auth>
            dir = secret/dir1
            user = jonny:verysecretpwd
            user = benny:thequestion
            user = ronny:havinganamethatendswithy
      </auth>
</server>

logdir = Dir Устанавливаем директорию для логов. Yaws ведёт несколько логов:

  • в report.log пишется лог ошибок сервера,
  • в .access access-лог для каждого виртуального хоста,
  • в .auth сообщения связанные с http auth
  • trace.http и trace.traffic специализированные, нужно включать отдельно

log_wrap_size = int Макс размер лог-файла. При его превышении файл будет усекаться.
access_log = true | false Вести или нет access-лог. default: true
ebin_dir = Dir Установка директории для поиска Erlang файлов. default: “yaws_dir”/examples/ebin
include_dir = Dir Директория дли Erlang include-файлов default: “yaws_dir”/examples/include
server_signature = String Устанавливает Server: в header ответа, стандартный “Server: yaws/%VSN%, Yet Another Web Server”.
ysession_mod = Module Установка механизма хранения сессий отличного от стандартного (ETS таблицы). Основной минус ETS таблиц – потеря сессионых кукиз при перезапуске сервера.

Установка редиректов в Yaws
<redirect> ... </redirect> Блок описания редиректов, внутри определяем параметры
Path = URL | File При запросе страниц начинающихся с Path редиректим на соответствующую в URL, например:

1
2
3
4
<redirect>
      /foo = http://site.org/zapp
      /bar = /tomato.html
</redirect>

Получим:
http://abc.com/foo -> http://site.org/zapp/foo
http://abc.com/foo/test -> http://site.org/zapp/foo/test
Однако, изменив 2 строку конфига на /foo == http://site.org/zapp, мы получим
http://abc.com/foo/test/abc -> http://site.org/zapp

Немного о кэшировании в Yaws (cache in Yaws web-server):
max_num_cached_files = int Максимальное количество кэшируемых файлов. Yaws кэширует частозапрашиваемые файлы в RAM.
max_size_cached_file = int Максимальный размер кэшируемого файла.
max_num_cached_bytes = int Максимальный размер RAM памяти, выделяемой под кэш. Исчисляется в байтах.
cache_refresh_secs = int Время жизни кэша. При разработке удобнее поставить 0. default: 30 sec

Настройки подключений в Yaws (config connections in Yaws web-server)
max_connections = nolimit | int Максимальное количество одновременных подключений
keepalive_timeout = TimeInMilliseconds | infinity Какое время будет жить подключение, если не будет сразу закрыто.
keepalive_maxuses = nolimit | int Если установлено – keepalive соединение не будет использовано более int раз.

Включаем поддержку скриптов (PHP, CGI) в Yaws
allowed_scripts = ListOfSuffixes default: allowed_scripts = yaws php cgi fcgi
php_handler = <Type, Spec> Указываем директорию где установлен интерпретатор для PHP скриптов.
php_handler = <cgi, Filename>
php_handler = <fcgi, Host:Port> Использовать следующий fastcgi сервер для fcgi-файлов, пример: php_handler = <fcgi, 127.0.0.1:54321>

Кратко об установке WWW аутенфикации на Yaws
<auth> ... </auth> Блок описания структуры и параметров аутенфикации. Описывается в блоке <server>..</server>
dir = Dir Установка директории для входа в которую нужна www аутенфикация.
user = User:Password Установка реквизитов доступа, user директив может быть несколько.
allow = all | ListOfHost Кому разрешен доступ к аутенфикации/материалам. Список хостов задаётся через запятую.
deny = all | ListOfHost Кому запрещён доступ.

<opaque> .... </opaque> Игнорируемый сервером контекст, который может быть использован приложениями.
Заполняется ‘Key = Value’ директивами, которые потом можно получить из приложений в виде кортежей {Key, Value}

Запустить теперь Yaws с использованием нашего конфигурационного файла можно так:
$ yaws --daemon --conf DIR/ConfigFileName

SEO Community Ваау! News2.ru SMI2 Google Bookmarks I.ua Закладки Yandex Ruspace Web-zakladka Zakladok.net delicious БобрДобр.ru Memori.ru rucity.com МоёМесто.ru Mister Wong

Comments