Configurare Apache2 per proxy WebSocket?


40

Il protocollo WebSocket è un'estensione del protocollo HTTP. Tuttavia, il modulo proxy di Apache2 non sembra conoscerlo e getta via le intestazioni cruciali, convertendo la chiamata in una chiamata HTTP standard.

C'è un modo per far capire a Apache2 (1) WebSocket o (2) semplicemente passare ciecamente su qualunque cosa ottenga?

Risposte:


23

Ora c'è un modulo nel trunk Apache chiamato mod_proxy_wstunnel che consente a mod_proxy (ProxyPass / ProxyPassReverse) di passare attraverso il traffico WebSocket. Qualcuno ha scritto un post sul blog sul back-port mod_proxy_wstunnel su Apache 2.4 / 2.2 e ha fornito una patch per farlo.

Ho scoperto istruzioni concrete per configurare mod_proxy_wstunnel su Ubuntu (testato con Ubuntu Server 11.10 e Apache 2.2.20) e le ho pubblicate sul mio blog. Li ho copiati di seguito:

# 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
Quando ho seguito la tua guida, c'era un passo che non avevi. Dopo aver effettuato i controlli apr ho dovuto correre ./buildconfigper creare il file di configurazione. E c'erano un paio di dipendenze che mi ha detto di installare.
notbad.jpeg,

fa questo con Glassfish 4 su wss: (SSL)
Archimedes Trajano il

1
@ notbad.jpeg: probabilmente intendi ./buildconf (non ./buildconfig) :-)
Erik Forsberg,

1
Solo il mio feedback ... questo installato e caricato in apache 2.2.22-1ubuntu1.10 da Ubuntu 12.04, ma alla fine non ha funzionato per me. Il proxy stava rimuovendo l'intestazione "Upgrade" (il codice sorgente dice "RFC2616 13.5.1 dice che dovremmo rimuovere queste intestazioni"), che è un'intestazione che il server si aspetta, non solo un hop, quindi non ha funzionato per me, e l'ho sostituito con una regola DNAT di iptables.
Peter,



3

Dai un'occhiata a http://github.com/disconnect/apache-websocket

Il modulo apache-websocket è un modulo server Apache 2.x che può essere utilizzato per elaborare le richieste utilizzando il protocollo WebSocket da un server Apache 2.x.


Ho guardato il progetto github sopra. Non funge da proxy. citazioneThe module consists of a plugin architecture ...
Guettli,

1

Questa aggiunta alla risposta di @Andrew Moss su come configurare correttamente il VirtualHostfunzionamento con socket.io 1.0! Sentiti libero di saltare la parte su CentOS!


Se sei bloccato su CentOS 6, ecco come farlo:

  1. Scarica la fonte backport per il mod_proxy_wstunnelmodulo qui (o clone del Gist o scaricare i file singolarmente)
  2. Installa tutto il necessario per compilare: yum install make gcc httpd-devel
  3. Imposta un ambiente RPM Build (sostanzialmente un utente non privilegiato e alcune directory)
  4. Copia il .c-file nella SOURCESsottocartella dell'ambiente e il .spec-file nella SPECSsottocartella.
  5. Correre rpmbuild -ba mod_proxy_wstunnel.spec
  6. Il pacchetto è ora nella SRPMSsottocartella
  7. Installa il pacchetto: rpm -i /path/to/package.rpm
  8. Profitto

Questo caricherà anche automaticamente il modulo in Apache, quindi devi solo riavviarlo con service httpd restart.


Configurare a VirtualHostper servire effettivamente il server Socket.io e lo script client (che per impostazione predefinita è disponibile in http://your.server/socket.io/socket.io.js) è un po 'più complicato su Apache 2.2, a causa di un bug nel mod_proxymodulo :

Data la seguente regola di riscrittura:

RewriteRule    ^/ws(.*)$  ws://localhost:9000/ws  [P]

mod_rewrite considera questo un percorso file in modo che il registro di accesso mostri:

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

Pertanto, non è possibile utilizzare il wsprotocollo in una regola di riscrittura , perché si trasformerà internamente in una richiesta GET HTTP.

C'è una soluzione alternativa però:

<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>

Questo si assicura che tutto ciò che viene inviato /socket.iovada al ws://protocollo, tranne la richiesta di polling lungo (che è un meccanismo di fallback quando WebSocket non è disponibile) e la richiesta per la libreria client.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.