Протокол WebSocket является расширением протокола HTTP. Однако прокси-модуль Apache2, похоже, не знает об этом и отбрасывает важные заголовки, преобразовывая вызов в стандартный HTTP-вызов.
Есть ли способ заставить Apache2 либо (1) понимать WebSocket, либо (2) просто слепо передавать все, что получает?
Теперь в магистрали Apache есть модуль mod_proxy_wstunnel, который позволяет mod_proxy (ProxyPass / ProxyPassReverse) проходить через трафик WebSocket. Кто-то написал сообщение в блоге о обратном портировании mod_proxy_wstunnel в Apache 2.4 / 2.2 и предоставил для этого патч.
# Check apache version (should be 2.2.20 as of writing, if not adjust the next step)
dpkg -s apache2
# Checkout apache source
svn checkout http://svn.apache.org/repos/asf/httpd/httpd/tags/2.2.20/ httpd-2.2.20
# Get patch and apply it
wget http://cafarelli.fr/gentoo/apache-2.2.24-wstunnel.patch
cd httpd-2.2.20
patch -p1 < ../apache-2.2.24-wstunnel.patch
# Build Apache
svn co http://svn.apache.org/repos/asf/apr/apr/branches/1.4.x srclib/apr
svn co http://svn.apache.org/repos/asf/apr/apr-util/branches/1.3.x srclib/apr-util
./buildconf
./configure --enable-proxy=shared --enable-proxy_wstunnel=shared
make
# Copy the module and recompiled mod_proxy (for new symbols) to the ubuntu apache installation and update the permissions to match the other modules
sudo cp modules/proxy/.libs/mod_proxy{_wstunnel,}.so /usr/lib/apache2/modules/
sudo chmod 644 /usr/lib/apache2/modules/mod_proxy{_wstunnel,}.so
echo -e "# Depends: proxy\nLoadModule proxy_wstunnel_module /usr/lib/apache2/modules/mod_proxy_wstunnel.so" | sudo tee -a /etc/apache2/mods-available/proxy_wstunnel.load
# Enable the module (also make any configuration changes you need)
sudo a2enmod proxy_wstunnel
sudo service apache2 restart
Когда я следовал твоему руководству, был шаг, которого у тебя не было. После выполнения проверок в апреле мне пришлось запустить, ./buildconfigчтобы создать файл конфигурации. И было несколько зависимостей, которые мне сказали установить.
notbad.jpeg
это соединяет Glassfish 4 с wss: (SSL)
Архимед Траяно,
1
@ notbad.jpeg: Вы, вероятно, имеете в виду ./buildconf (не ./buildconfig) :-)
Эрик Форсберг
1
Просто мой отзыв ... он установлен и загружен в apache 2.2.22-1ubuntu1.10 из Ubuntu 12.04, но в конце концов он у меня не сработал. Прокси-сервер удалял заголовок «Upgrade» (в исходном коде написано «RFC2616 13.5.1 говорит, что мы должны удалить эти заголовки»), который представляет собой заголовок, ожидаемый сервером, а не один переход, поэтому он не сработал для меня, и я заменил его правилом DNAT iptables вместо этого.
Модуль apache-websocket - это серверный модуль Apache 2.x, который может использоваться для обработки запросов с использованием протокола WebSocket сервером Apache 2.x.
Я посмотрел на вышеупомянутый проект GitHub. Он не действует как прокси. цитатаThe module consists of a plugin architecture ...
Геттли
1
Это дополнение к ответу Эндрю Мосса о том, как правильно настроить VirtualHostработу с socket.io 1.0! Не стесняйтесь пропустить часть о CentOS!
Если вы застряли на CentOS 6, вот как это сделать:
Загрузите исходный код для mod_proxy_wstunnelмодуля здесь (либо клонируйте Gist, либо загружайте файлы по отдельности)
Установите все необходимое для сборки: yum install make gcc httpd-devel
Настройка среды сборки RPM (в основном непривилегированный пользователь и некоторые каталоги)
Скопируйте .c-file в SOURCESподпапку среды и .spec-file в SPECSподпапку.
Бег rpmbuild -ba mod_proxy_wstunnel.spec
Пакет сейчас находится в SRPMSподпапке
Установите пакет: rpm -i /path/to/package.rpm
прибыль
Это также автоматически загрузит модуль в Apache, так что вам просто нужно перезапустить его service httpd restart.
Настройка VirtualHostдля фактического обслуживания сервера Socket.io и клиентского скрипта (который по умолчанию доступен в разделе http://your.server/socket.io/socket.io.js) немного сложнее в Apache 2.2 из-за ошибки в mod_proxyмодуле :
Учитывая следующее правило переписывания:
RewriteRule ^/ws(.*)$ ws://localhost:9000/ws [P]
mod_rewrite рассматривает это как путь к файлу, поэтому журнал доступа показывает:
Таким образом, вы не можете использовать ws-protocol в правиле перезаписи , потому что это внутренне превратится в запрос HTTP GET.
Есть обходной путь, хотя:
<VirtualHost *:80>
ServerName your.server
# Proxy socket.io Websocket
RewriteEngine On
# socket.io 1.0+ starts all connections with an HTTP polling request
RewriteCond %{QUERY_STRING} transport=polling [NC]
RewriteRule /(.*) http://localhost:8081/$1 [P]
ProxyRequests Off
# Explicitly send the request for the client-script to HTTP:
ProxyPass /socket.io/socket.io.js http://localhost:8081/socket.io/socket.io.js
ProxyPassReverse /socket.io/socket.io.js http://localhost:8081/socket.io/socket.io.js
# Anything else goes to the WebSocket protocol:
ProxyPass /socket.io/ ws://localhost:8081/socket.io/
ProxyPassReverse /socket.io/ ws://localhost:8081/socket.io/
# Any additional stuff (the actual site) comes here
ProxyPass / http://localhost:8081/
ProxyPassReverse / http://localhost:8081/
</VirtualHost>
Это гарантирует, что все отправленные на /socket.ioотправляются в ws://-protocol, кроме запроса на длинный опрос (который является механизмом отката, когда недоступны WebSockets) и запроса на клиентскую библиотеку.
./buildconfig
чтобы создать файл конфигурации. И было несколько зависимостей, которые мне сказали установить.Ничто не указывает на то, что Apache httpd поддержит их в ближайшее время.
Если вам нужно запустить websockets через apache, попробуйте mod_pywebsocket . Я попробовал это, и это работает.
Вот несколько альтернатив, которые я предпочитаю:
источник
Похоже, с помощью комбинации подключаемого модуля и некоторого дополнительного кода это теперь возможно:
http://blog.alex.org.uk/2012/02/16/using-apache-websocket-to-proxy-tcp-connection/
источник
Пожалуйста, посмотрите на http://github.com/disconnect/apache-websocket
источник
The module consists of a plugin architecture ...
Это дополнение к ответу Эндрю Мосса о том, как правильно настроить
VirtualHost
работу с socket.io 1.0! Не стесняйтесь пропустить часть о CentOS!Если вы застряли на CentOS 6, вот как это сделать:
mod_proxy_wstunnel
модуля здесь (либо клонируйте Gist, либо загружайте файлы по отдельности)yum install make gcc httpd-devel
.c
-file вSOURCES
подпапку среды и.spec
-file вSPECS
подпапку.rpmbuild -ba mod_proxy_wstunnel.spec
SRPMS
подпапкеrpm -i /path/to/package.rpm
Это также автоматически загрузит модуль в Apache, так что вам просто нужно перезапустить его
service httpd restart
.Настройка
VirtualHost
для фактического обслуживания сервера Socket.io и клиентского скрипта (который по умолчанию доступен в разделеhttp://your.server/socket.io/socket.io.js
) немного сложнее в Apache 2.2 из-за ошибки вmod_proxy
модуле :Таким образом, вы не можете использовать
ws
-protocol в правиле перезаписи , потому что это внутренне превратится в запрос HTTP GET.Есть обходной путь, хотя:
Это гарантирует, что все отправленные на
/socket.io
отправляются вws://
-protocol, кроме запроса на длинный опрос (который является механизмом отката, когда недоступны WebSockets) и запроса на клиентскую библиотеку.источник