A criar um websocket no Apache?
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?
3 answers
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.
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
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.