Configurando o Apache2 para o proxy WebSocket?

40

O protocolo WebSocket é uma extensão do protocolo HTTP. No entanto, o módulo proxy do Apache2 não parece saber sobre isso, e joga fora os cabeçalhos cruciais, convertendo a chamada para uma chamada HTTP padrão.

Existe uma maneira de fazer o Apache2 (1) entender o WebSocket ou (2) simplesmente transmitir cegamente o que quer que seja obtido?

    
por Blixt 13.07.2011 / 22:28

5 respostas

23

Existe agora um módulo no tronco do Apache chamado mod_proxy_wstunnel que permite ao mod_proxy (ProxyPass / ProxyPassReverse) passar pelo tráfego do WebSocket. Alguém escreveu uma postagem no blog sobre portando o mod_proxy_wstunnel para o Apache 2.4 / 2.2 e forneceu um patch para isso.

Eu descobri instruções concretas para configurar o mod_proxy_wstunnel em Ubuntu (testado com o Ubuntu Server 11.10 e Apache 2.2.20) e postei no meu blog. Eu os copiei abaixo:

# 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
    
por 08.06.2013 / 18:57
11

Não existe nada para indicar O Apache httpd irá apoiá-los em breve.

Se você precisar executar websockets por meio do apache, tente mod_pywebsocket . Eu tentei e funciona.

Aqui estão algumas alternativas que eu prefiro:

por 23.07.2011 / 18:01
6

Parece que com uma combinação do plug-in de desconexão e algum código extra isso agora é possível:

link

    
por 23.03.2012 / 14:51
3

Por favor, dê uma olhada no link

The apache-websocket module is an Apache 2.x server module that may be used to process requests using the WebSocket protocol by an Apache 2.x server.

    
por 21.10.2011 / 20:57
1

Esta resposta adiciona a @Andrew Moss 'como configurar corretamente o VirtualHost para trabalhar com o socket.io 1.0! Sinta-se à vontade para pular a parte sobre o CentOS!

Se você está preso no CentOS 6, aqui está como fazê-lo:

  1. Faça o download da origem backported para o módulo mod_proxy_wstunnel aqui (clone a Gist ou baixe os arquivos individualmente)
  2. Instale tudo o que for necessário para criar: yum install make gcc httpd-devel
  3. Configure um ambiente de criação de RPM (basicamente um usuário não privilegiado e alguns diretórios)
  4. Copie o .c -file para a subpasta SOURCES do ambiente e o .spec -file para a subpasta SPECS .
  5. Executar rpmbuild -ba mod_proxy_wstunnel.spec
  6. O pacote agora está na subpasta SRPMS
  7. Instale o pacote: rpm -i /path/to/package.rpm
  8. Lucro

Isso também carregará automaticamente o módulo no Apache, então você só precisa reiniciá-lo com service httpd restart .

Configurar um VirtualHost para realmente servir o servidor Socket.io e o script cliente (que por padrão está disponível em http://your.server/socket.io/socket.io.js ) é um pouco mais complicado no Apache 2.2, por causa de um Bug no módulo mod_proxy :

Given the following rewrite rule:

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

mod_rewrite treats this a filepath so the access log shows:

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

Portanto, você não pode usar o ws -protocol em uma regra de reescrita , porque isso se transformará internamente em uma solicitação HTTP GET.

Existe uma solução alternativa:

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

Isso garante que tudo enviado para /socket.io vá para o ws:// -protocol, exceto a solicitação de sondagem longa (que é um mecanismo de fallback quando WebSockets não estão disponíveis) e a solicitação para a biblioteca-cliente.

    
por 03.05.2017 / 13:42