Installer un websocket sur Apache?

donc je fais quelques recherches sur les websockets, et j'ai quelques questions que je ne trouve pas de réponse définitive pour:

  • comment configurer une socket web sur mon serveur Linux? Y a-t-il un module Apache? Aurais-Je pour utiliser un code PHP tiers ou similaire?

  • y a-t-il des inconvénients à la méthode décrite à la question 1 Que je devrais connaître autre que le navigateur compatibilité?

  • Comment puis-je" mettre à niveau " mon installation websocket pour une installation websocket sécurisée (ws:// à wss://)? Cela serait-il plus facile ou plus difficile si SSL était déjà installé sur mon serveur Apache?

  • y a-t-il un langage que je pourrais utiliser pour me connecter à mon socket Web autre que JavaScript?

  • Quelle est la méthode de requête par défaut pour une socket web?

23
demandé sur eepp 2013-06-27 08:03:09

3 réponses

Je ne peux pas répondre à toutes les questions, mais je ferai de mon mieux.

comme vous le savez déjà, WS n'est qu'une connexion TCP full-duplex persistante avec des messages encadrés dont la prise en main initiale ressemble à du HTTP. Vous avez besoin d'un serveur qui écoute les requêtes WS entrantes et qui lie un gestionnaire à ces requêtes.

maintenant, cela pourrait être possible avec le serveur HTTP Apache, et j'ai vu quelques exemples, mais il n'y a pas de support officiel et cela devient compliqué. Que ferait Apache? Où serait votre gestionnaire? Il y a un module qui transmet les demandes WS entrantes à une bibliothèque partagée externe, mais ce n'est pas nécessaire avec les autres grands outils pour travailler avec WS.

serveur WS tendances comprennent maintenant: Autoroute (Python) et Socket.IO (Nœud.js = JavaScript sur le serveur). Ce dernier supporte également d'autres connexions "persistantes" hackish comme les sondages longs et tous les comète trucs. Il y a d'autres serveurs WS peu connus des cadres comme Ratchet (PHP, si vous êtes familier avec que).

dans tous les cas, vous aurez besoin d'écouter sur un port, et bien sûr ce port ne peut pas être le même que le serveur HTTP Apache qui tourne déjà sur votre machine (par défaut = 80). Vous pourriez utiliser quelque chose comme 8080, mais même si celui-ci est un choix populaire, certains pare-feu pourrait encore le bloquer car il n'est pas censé être du trafic Web. C'est pourquoi beaucoup de gens choisissent 443, qui est le HTTP Sécurisé port que, pour des raisons évidentes, les pare-feu ne bloquent pas. Si vous n'utilisez pas SSL, vous pouvez utiliser 80 pour HTTP et 443 pour WS. Le serveur WS n'a pas besoin d'être sécurisé; nous n'utilisons que le port.

Modifier: selon Iharob Al Asimi, le paragraphe précédent est erroné. Je n'ai pas le temps d'enquêter sur ce, merci donc de voir son travail pour plus de détails.

au sujet du protocole, comme Wikipedia montre, il ressemble à ceci:

le Client envoie:

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

le Serveur répond:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

et maintient en vie. Si vous pouvez mettre en œuvre ce handshaking et le cadrage de base du message (encapsuler chaque message avec un petit en-tête le décrivant), alors vous pouvez utiliser n'importe quel langage côté client que vous voulez. JavaScript est seulement utilisé dans les navigateurs Web parce qu'il est intégré.

comme vous pouvez le voir, la "méthode de requête" par défaut est un GET HTTP initial, bien que ce ne soit pas vraiment HTTP et Loose tout en commun avec HTTP après cette handshaking. Je suppose que les serveurs qui ne supportent

Upgrade: websocket
Connection: Upgrade

répondra avec une erreur ou avec un contenu de page.

19
répondu eepp 2017-03-10 22:21:39

la nouvelle version 2.4 du serveur HTTP Apache a un module appelé mod_proxy_wstunnel qui est un mandataire websocket.

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

21
répondu Udo 2014-06-04 15:58:45

j'ai eu du mal à comprendre les paramètres proxy pour websockets pour https permettez-moi donc de clarifier ce que j'ai réalisé.

vous devez d'Abord activer proxy et proxy_wstunnel les modules apache et le fichier de configuration apache ressembleront à ceci.

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

dans votre application frontend utilisez l'url "wss://example.com/wss/" c'est très important la plupart du temps si vous êtes coincé avec des websockets, vous pourriez faire une erreur dans l'url front end. Vous mettez probablement url à tort comme ci-dessous.

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

autre partie intéressante: la dernière /wss/ est comme proxypass valeur si vous l'écriture proxypass /ws/ alors à l'avant vous devez écrire /ws/ à la fin de l'url.

0
répondu Sunil Kumar 2018-08-09 15:26:48