Bashtannik's Blog

Искусство создания компьютерных программ

Настройка Dklab Realplexor для работы на Localhost.

с одним комментарием

Realplexor — это так называемый Comet сервер, позволяющий конструировать асинхронные веб приложения. Принцип действия прост: вместо того, чтобы закрывать HTTP-соединение между клиентом и сервером, программный комплекс старается поддерживать его как можно дольше. Это позволяет построить приложение, осуществляющее двусторонний обмен данными и задействовать модель программирования на основе событий. Фактически, вместо постоянного опроса клиента сервером в ожидании смены состояния, влекущего событие, здесь событие определено изначально и инициации сервером.

Как и где применять Реалплексор сложно сказать, на его основе можно построить все что угодно, требующее мгновенного обмена данными. В интернете существует несколько аналогичных проектов (напр. APE), однако они сложны и требуют больших временных затрат. Плюс ко всему, идеологически верно поддерживать наших разработчиков.

На сайте производителя есть информация по базовой настройке сервера, я же расскажу как настроить сервер разработчика (development server) на базе ОС Ubuntu 9.10.

Идеология и безопасность.

Фактически Реалплексор это веб сервер, написанный на perl (к сожалению для меня). Он работает параллельно с Apache, ожидая соединения на свой порт, которые никогда (исключений и других правил не касаемся) не закроются. Apache работает над формированием содержимого вашего сайта, по умолчанию слушая порт 80 для входящих соединений.

Вместе с Реалплексором в комплекте идет набор API для PHP и JavaScript. PHP API мы будем использовать на стороне сервера для манипуляций с данными, а JavaScript API позволяет создать на стороне клиента соединение с сервером и берет на себя обязанности по поддержанию оного.

Логично было бы подключаться к Реалплексору просто используя его порт, например так: http://localhost:8088. Однако, производители браузеров подготовили кучу подводных камней и мы сразу же наткнемся на один из них: http://localhost:80 и http://localhost:8088 находятся в разных контекстах безопасности и соединение не пройдет. Это одна из самых известных проблем в AJAX технологии на основе XMLHttpRequest.

К примеру, Firefox порадует нас ошибкой в консоли:

Ошибка: uncaught exception: Due to the standard XMLHttpRequest security policy,
hostname in URL passed toDklab_Realplexor (localhost:8088) must be equals to the
current host (localhost.com) or be its direct sub-domain.

Решение проблемы.

На помощь нам придет чудо-сервер nginx. Рассказ о достоинствах этого сервера — тема для отдельного поста. Нам же, nginx позволит обойти проблему нарушения правил безопасности. Дело в том, что браузер противится соединению по другому порту, однако совершенно не против соединения с поддоменом. Таким образом нам необходимо передать nginx управление соединением и разрулить эту ситуацию.

Стоит отметить, что эту проблему можно решить и с помощью DNS, однако поднимать и настраивать DNS сервер на локальном компьютере разработчика, как минимум не рационально. Использование же связки с nginx даст очень много вкусных возможностей в будущем.

Необходимо настроить Apache на прослушивание не 80 порта, а 8080, для того чтобы освободить 80 для nginx.

Nginx будет рассматривать входящее подключение и в случае, если оно идет на поддомен, выделенный для сервера (пусть будет chat) он передаст соединение на localhost:8088, т.е. Реалплексеру. Иначе соединение уйдет к Apache на localhost:8080 если nginx не настроен иначе.

Специфика локалхоста.

Нельзя забывать, что мы работаем на локалхосте и что для нас хорошо, то немцу смерть на production сервере отвалится. Один из незаметных подводных камней это трактовка поддомена. По правилам HTTP в адресе вида chat.localhost нет поддомена, chat — это домен второго уровня, а не третьего. Поэтому нам необходимо сделать простую вещь: отредактировать файл /etc/hosts следующим образом:

127.0.0.1 chat.localhost.com
127.0.0.1 localhost.com

Таким образом выполняется требование системы безопасности по поддоменам выполняется. И мы спокойно работаем с нашим доменом localhost.com.

Настройка nginx, файл /usr/local/nginx/conf/nginx.conf:

server {
server_name  localhost.com; # Для главного сайта
listen       localhost.com:80; # Запрос, который получет nginx по 80 порту

location / {
proxy_pass http://127.0.0.1:8080; # Передаем обработку Apache
}
}

server {
server_name  chat.localhost.com; # Для поддомена
listen       chat.localhost.com:80; # На таком же порту

location / {
proxy_pass http://127.0.0.1:8088; # Запрос будет обрабатываться Реалплексором
}
}

Теперь необходимо перезагрузить все программы, участвующие в процессе.

sudo apache2ctl restart
sudo /usr/local/nginx/sbin/nginx -s reload
sudo service dklab_realplexor reload

Программный комплекс готов к работе.

Эпилог.

Справедливо заметить, что подобный подход может использоваться и на production-серверах. Использование nginx дает огромные перспективы по масштабированию приложения. Расход памяти составляет около 10 МБ на 1000 одновременных подключений для Реалплексора, а при грамотной настройке nginx на раздачу статики, полученный прирост производительности будет вполне ощутим.

Примеры кода доступны на сайте производителя.

Написано bashtannik

10.02.2010 в 20:12

Опубликовано в Uncategorized

Отмечено как , , , ,

Один ответ

Подписаться на комментарии по RSS.

  1. можно ли вообще обойтись без Apache и настроить proxy_pass http://127.0.0.1:8080; на nginx а не на Apache?

    Lexer

    26.09.2011 в 07:06


Добавить комментарий

Fill in your details below or click an icon to log in:

Логотип WordPress.com

You are commenting using your WordPress.com account. Log Out / Изменить )

Фотография Twitter

You are commenting using your Twitter account. Log Out / Изменить )

Фотография Facebook

You are commenting using your Facebook account. Log Out / Изменить )

Connecting to %s

Follow

Get every new post delivered to your Inbox.