Налаштування Apache2 для проксі WebSocket?


40

Протокол WebSocket - це розширення протоколу HTTP. Однак проксі-модуль Apache2, схоже, не знає про це, і викидає важливі заголовки, перетворюючи виклик у стандартний HTTP-дзвінок.

Чи є спосіб змусити Apache2 або (1) зрозуміти WebSocket, або (2) просто сліпо передати все, що він отримує?

Відповіді:


23

Зараз в магістралі Apache є модуль під назвою mod_proxy_wstunnel, який дозволяє mod_proxy (ProxyPass / ProxyPassReverse) проходити через трафік WebSocket. Хтось написав публікацію в блозі про те, що підтримує mod_proxy_wstunnel в Apache 2.4 / 2.2 і надав патч для цього.

Я розібрався з конкретними інструкціями щодо налаштування mod_proxy_wstunnel на Ubuntu (тестований на Ubuntu Server 11.10 та Apache 2.2.20) і розмістив їх у своєму блозі. Я скопіював їх нижче:

# 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

2
Коли я слідував за вашим посібником, стався крок, якого у вас не було. Зробивши каси apr, мені довелося запустити, ./buildconfigщоб створити файл налаштування. І було кілька залежностей, які мені сказали встановити.
notbad.jpeg

робить це зачіпка з Glassfish 4 над wss: (SSL)
Архімед Траяно

1
@ notbad.jpeg: Ви, мабуть, маєте на увазі ./buildconf (не ./buildconfig) :-)
Ерік Форсберг

1
Просто мій відгук ... це було встановлено і завантажено в apache 2.2.22-1ubuntu1.10 від Ubuntu 12.04, але в кінцевому підсумку воно не працювало для мене. Проксі-сервер видаляв заголовок "Оновлення" (у вихідному коді написано: "RFC2616 13.5.1 говорить, що нам слід зняти ці заголовки"). і я замінив його правилом DNAT iptables.
Пітер

11

Там немає нічого , щоб вказати Apache HTTPD буде підтримувати їх в найближчим часом.

Якщо вам потрібно запустити веб-розетки через apache, спробуйте mod_pywebsocket . Я спробував це, і це працює.

Ось кілька альтернатив, які я віддаю перевагу:



3

Погляньте на сторінку http://github.com/disconnect/apache-websocket

Модуль apache-websocket - це серверний модуль Apache 2.x, який може використовуватися для обробки запитів за допомогою протоколу WebSocket сервером Apache 2.x.


Я переглянув вищезгаданий проект github. Він не діє як проксі. цитатаThe module consists of a plugin architecture ...
guettli

1

Це додаток до відповіді @Andrew Moss про те, як правильно налаштувати VirtualHostроботу з socket.io 1.0! Не соромтеся пропустити частину про CentOS!


Якщо ви застрягли в CentOS 6, ось як це зробити:

  1. Завантажте підтримуваний джерело для mod_proxy_wstunnelмодуля тут (або клонуйте Gist, або завантажуйте файли окремо)
  2. Встановіть усе необхідне для складання: yum install make gcc httpd-devel
  3. Налаштування середовища побудови RPM (в основному непривілейований користувач та деякі каталоги)
  4. Скопіюйте .c-файл у SOURCESпідтеки середовища та .spec-файл у SPECSпідпапку.
  5. Біжи rpmbuild -ba mod_proxy_wstunnel.spec
  6. Пакет зараз знаходиться у SRPMSпідпапці
  7. Встановіть пакет: rpm -i /path/to/package.rpm
  8. Прибуток

Це також автоматично завантажить модуль в 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 трактує цей шлях файлу, тому журнал доступу показує:

[26/Sep/2013:09:46:07 -0400] "GET /ws://localhost:9000/ws HTTP/1.1" 400 317

Отже, ви не можете використовувати 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 недоступні) та запиту для клієнтської бібліотеки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.