1 votes

Apache proxy toutes les connexions ws sur un port différent

Dans mon serveur virtuel Apache 2.4, j'essaie d'obtenir toutes les informations suivantes https:// le trafic est transféré sur le port 443, mais toutes les ws:// le trafic à transférer sur ws://*:6969 .

Eg :

https://example.com/index se contenterait d'aller à https://example.com/index:443 comme d'habitude.

ws://example.com/anypathhere/ serait transmise à ws://example.com/anypathhere:6969

Jusqu'à présent, j'ai essayé les valeurs commentées dans le serveur virtuel.

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/pki/tls/certs/ca.crt
    SSLCertificateKeyFile /etc/pki/tls/private/ca.key
    DocumentRoot /var/www/html/

    RewriteOptions Inherit
    AccessFileName .htaccess
    AllowEncodedSlashes NoDecode

    DirectoryIndex disabled

    <Directory /var/www/html>
            Options +FollowSymlinks
            RewriteEngine On
            AllowOverride All
            Require all granted
            RewriteCond %{REQUEST_FILENAME} -d
            RewriteRule .* %{REQUEST_URI}index.php [L]
    </Directory>

    ServerName localhost.localdomain

  #ProxyPreserveHost On
  #ProxyRequests Off
  #ProxyPassMatch / ws://192.16.4.177:6969/ retry=0
  #ProxyPassReverse ws:// ws://192.16.4.177:6969/
  #ProxyPass ws:// ws://192.16.4.177:6969/
  #RewriteEngine On
  #RewriteRule ws:// ws://%{HTTP_HOST}/$1:6969 [NC,R=301,L]

Tous ces éléments se traduisent par

Firefox can't establish a connection to the server at ws://192.16.4.177:443

ou une erreur 400.

3voto

JinnFox Points 84

Vous devez vraiment ajouter un serveur virtuel pour le trafic ws qui écoute sur *:80

Il y a un point qui échoue soit avec RewriteCond ou avec ProxyPass au mauvais fichier VHost. Votre trafic est crypté par le certificat que vous utilisez. Par conséquent, la connexion ne sera pas établie correctement. Votre hôte distant ne peut pas le lire.

Sur la base de la documentation contenue dans wikipedia :

Les communications se font sur le port TCP numéro 80 [ ]

Votre fichier VHost supplémentaire devrait ressembler à ceci :

<VirtualHost *:80>
  ServerName localhost.localdomain
  ProxyPreserveHost On
  ProxyRequests Off
  ProxyPassReverse / ws://192.16.4.177:6969/
  ProxyPass / ws://192.16.4.177:6969/
</VirtualHost>

En guise d'explication. Toutes les requêtes passant par http:80 sont redirigées vers ws:6969.

2voto

Peter Points 2426

La meilleure façon de procéder serait de dire au client d'utiliser le bon port... mais si vous voulez faire un proxy ou une redirection lorsqu'il utilise le mauvais port :

Je ne sais rien de ws://, mais je pense qu'il faut utiliser un élément de type RewriteCond pour cela, puisque a RewriteRule et similaires ne contiennent pas le schéma de correspondance. Voir l'article référence de la directive . Cela ne fonctionnera probablement que si les requêtes ws:// ressemblent à des requêtes HTTP, ou si vous avez un module qui gère spécialement les requêtes ws://. (Pour utiliser RewriteCond vous pouvez l'énumérer autant de fois que vous le souhaitez, et elle ne s'applique qu'à la prochaine RewriteRule [ou similaire ?])

par exemple pour la procuration :

RewriteEngine On
ProxyRequests Off
ProxyPreserveHost On

RewriteCond %{REQUEST_SCHEME} "^ws$"
RewriteRule "^(/?.*)$" ws://otherhost:6969/$1 [P]

2voto

hytgbn Points 11

Malheureusement, je ne pense pas qu'il existe un moyen simple de le faire. La réponse de Peter ne fonctionne pas parce que les Websockets se greffent sur HTTP(S) en tant que requête GET avec la commande en-têtes spéciaux . Quelle que soit la logique mod_rewrite utilise pour détecter le schéma d'URL n'est pas assez intelligent pour détecter cela, de sorte que le schéma apparaît toujours sous la forme suivante http o https .

En théorie, vous pouvez rechercher les en-têtes vous-même, avec quelque chose comme la syntaxe suivante :

RewriteCond %{HTTP:Upgrade} ^websocket$ [nocase]
RewriteRule ^(.*)$ ws://192.16.4.177:6969/$1 [proxy]

Cependant, bien que cette règle corresponde à la poignée de main d'ouverture du client (confirmée dans mes journaux), cela ne me donne pas une redirection Websocket qui fonctionne. Je soupçonne que mod_rewrite ne comprend pas vraiment comment proxyer les connexions Websocket, même si vous pouvez faire en sorte que la poignée de main aille au bon endroit.

Il nous reste donc la réponse de JinnFox. Si vous êtes en mesure de déplacer votre point de terminaison Websockets à un endroit autre que / Cela pourrait être une solution acceptable.

P.S. Entre-temps, j'ai découvert que NGINX gère ce cas de manière presque transparente (descendez à l'étape 6 pour trouver un extrait de code qui fonctionne à la fois pour HTTP et WS).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X