A criar um websocket no Apache?

Então, estou fazendo algumas pesquisas em WebSocket, e tenho algumas perguntas que não consigo encontrar uma resposta definitiva para:

  • Como posso configurar um 'socket' web no meu servidor Linux? Há algum módulo Apache? Eu teria para usar código PHP de terceiros ou similar?

  • há algum tipo de inconvenientes no método descrito na Pergunta 1 que eu deva ter conhecimento de outros que não a compatibilidade com o navegador?

  • Como poderia "atualizar" o meu websocket instalação numa instalação segura websocket (ws:// to wss://)? Isto seria mais fácil ou mais difícil se o SSL já estivesse instalado no meu servidor Apache?

  • há alguma linguagem que eu possa usar para conectar ao meu socket web que não o JavaScript?

  • Qual é o método padrão de pedido para um socket web?

Author: eepp, 2013-06-27

3 answers

Não posso responder a todas as perguntas, mas farei o meu melhor.

Como já sabe, o WS é apenas uma ligação TCP full-duplex persistente com mensagens emolduradas, onde o handshaking inicial é semelhante ao HTTP. Precisas de um servidor que esteja a ouvir os pedidos de WS e que ligue um controlador a eles.

Agora pode ser possível com o Servidor HTTP Apache, e eu vi alguns exemplos, mas não há suporte oficial e fica complicado. O que faria o Apache? Onde estaria a tua handler? Há um módulo que encaminha os pedidos de WS recebidos para uma biblioteca compartilhada externa, mas isso não é necessário com as outras grandes ferramentas para trabalhar com WS.

As tendências dos servidores de WS incluem agora: Autobahn (Python) e Socket.IO (nó.js = JavaScript no servidor). Este último também suporta outras conexões hackish "persistentes" como sondagens longas e todas as coisas do cometa . Existem outros frameworks pouco conhecidos do servidor WS como Ratchet (PHP, se você só está familiarizado com isso).

Em qualquer caso, terá de ouvir numa porta, e é claro que essa porta não pode ser a mesma que o Servidor HTTP Apache que já está a correr na sua máquina (por omissão = 80). Você poderia usar algo como 8080, mas mesmo que este em particular é uma escolha popular, alguns firewalls ainda pode bloqueá-lo, uma vez que não é suposto ser tráfego Web. É por isso que muitas pessoas escolhem 443, que é a porta HTTP Secure que, por razões óbvias, firewalls fazem não é o block. Se você não estiver usando SSL, você pode usar 80 para HTTP e 443 para WS. O servidor WS não precisa de ser seguro, estamos apenas a usar a porta.

Editar : de acordo com Iharob Al Asimi, o parágrafo anterior está errado. Não tenho tempo para investigar isto, por isso, por favor, veja o trabalho dele para mais detalhes.

Sobre o protocolo, como a Wikipédia mostra , parece-se com isto:

O Cliente envia:

GET /mychat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
Origin: http://example.com

Respostas do Servidor:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
E mantém a ligação vivo. Se você pode implementar este handshaking e o framing básico de mensagem (encapsulando cada mensagem com um pequeno cabeçalho descrevendo-o), então você pode usar qualquer linguagem do lado do cliente que você quiser. JavaScript só é usado em navegadores Web porque é incorporado.

Como você pode ver, o "método de pedido" padrão é uma obtenção HTTP inicial, embora este não é realmente HTTP e perde tudo em comum com HTTP após este aperto de mão. Acho que os servidores que não suportam

Upgrade: websocket
Connection: Upgrade

Responderei com um erro ou com um conteúdo de página.

 19
Author: eepp, 2017-03-10 22:21:39

A nova versão 2.4 do Servidor HTTP Apache tem um módulo chamado mod_ proxy_ wstunnel que é um proxy websocket.

Http://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html

 21
Author: Udo, 2014-06-04 15:58:45

Eu me esforcei para entender as configurações de proxy para {[[11]}websockets para https portanto, deixe-me colocar clareza aqui o que eu percebi.

Primeiro tem de activar os módulos proxy e proxy_wstunnel apache e o ficheiro de configuração do apache ficará assim.

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
      ServerName www.example.com
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/your_project_public_folder

      SSLEngine on
      SSLCertificateFile    /etc/ssl/certs/path_to_your_ssl_certificate
      SSLCertificateKeyFile /etc/ssl/private/path_to_your_ssl_key

      <Directory /var/www/your_project_public_folder>
              Options Indexes FollowSymLinks
              AllowOverride All
              Require all granted
              php_flag display_errors On
      </Directory>
      ProxyRequests Off 
      ProxyPass /wss/  ws://example.com:port_no

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>
</IfModule>

Na sua aplicação frontend use o url "wss://example.com/wss/" Isto é muito importante, principalmente se estiver preso com websockets, poderá estar a cometer erros no url front end. Provavelmente está a colocar o url de forma errada abaixo.

wss://example.com:8080/wss/ -> port no should not be mentioned
ws://example.com/wss/ -> url should start with wss only.
wss://example.com/wss -> url should end with / -> most important

Também a parte interessante é que o último /wss/ é o mesmo que proxypass Se você escrever proxypass /ws/, então na parte da frente você deve escrever /ws/ no fim do url.

 0
Author: Sunil Kumar, 2018-08-09 15:26:48