Règles de redirection Apache pour le serveur principal avec WebSockets

J’essaie de comprendre comment configurer correctement les règles de redirection apache pour le serveur principal CherryPy qui implémente websocket (fait via le module ws4py). Le problème est que si vous utilisez le moteur de réécriture ou le proxypass, il supprime l’en-tête de mise à jour dans la requête redirigée et par conséquent les plaintes du serveur CherryPy à ce sujet et échoue à l’étape de la négociation.

Le scénario que j’ai est le suivant. J’ai un serveur CherryPy avec le module ws4py qui configure WebSockets. Il fonctionne sur localhost: 9000. Je veux avoir apache front-end qui redirige simplement la requête entrante vers le serveur principal (cela fait plus que ça, mais pour plus de simplicité, cela devrait être fait).

La règle d’Apache que j’ai est simple

RewriteRule ^(/websocket(/.*)?)$ http://some_host:9000$1 [P,L] 

donc pour toutes les requêtes commençant par / websocket, il les redirige vers le serveur principal fonctionnant sur le port 9000. L’indicateur P signifie Proxy, le L arrête le processus de réécriture (voir http://borkweb.com/story/apache-rewrite-cheatsheet )

Si le client envoie une requête avec l’en-tête HTTP Upgrade: websocket, le moteur apache (module de réécriture) le supprime, ce qui provoque l’échec de l’établissement de liaison WebSocket.

Existe-t-il un moyen de corriger la règle de réécriture pour permettre la présence de l’en-tête Upgrade ?

Malheureusement, Apache n’a pas encore la capacité d’inverser les connexions proxy WebSocket (c’est absolument indispensable!). Mais il existe une solution qui permet de gérer les requêtes Web en utilisant les connexions Apache et WebSocket pour qu’elles soient traitées par quelque chose. Cette solution consiste à utiliser HAProxy comme interface avec Apache et votre serveur WebSocket.

Voici quelques liens pertinents pour vous aider à démarrer: