Настройка 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 на раздачу статики, полученный прирост производительности будет вполне ощутим.
Примеры кода доступны на сайте производителя.
можно ли вообще обойтись без Apache и настроить proxy_pass http://127.0.0.1:8080; на nginx а не на Apache?
Lexer
26.09.2011 в 07:06