J'essaie de configurer nginx en tant que proxy inversecela fait l'authentification et websockets. Le proxy transmet la requête à apache (/ auth / wsgi) pour s’authentifier. Une fois que cela réussit, il est ensuite transmis au serveur Web à l’arrière, qui est un point de terminaison Websocket basé sur Java sur tomcat 8.
location /basic/alerting/websocket {
auth_request /auth/wsgi;
proxy_pass http://backend.com:8080/websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade "Websocket";
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
}
L'authentification sur Apache réussit. Cependant, sur le tomcat backend, j'obtiens cette erreur:
12572237 [http-nio-8080-exec-10] ERREUR org.springframework.web.socket.server.support.DefaultHandshakeHandler - handleWebSocketVersionNotSupported () La prise de contact a échoué en raison d'une version de WebSocket non prise en charge: null. Versions prises en charge: [13]
Il semble que cet échec soit dû au fait que le serveur attend l'en-tête ("Sec-WebSocket-Version") qui n'est pas transmis. Je vois même dans les journaux nginx:
2015/03/17 17:28:12 [debug] 20261 # 0: * En-tête de proxy http 718: "Sec-WebSocket-Version: 13"
Dois-je faire quelque chose dans la configuration de nginx? J'apprécie beaucoup votre aide.
Réponses:
1 pour la réponse № 1Le problème est que Nginx ne "passe pas tous les en-têtes" Sec-WebSocket- * ". Ensuite, la méthode AbstractHandshakeHandler.java # handleWebSocketVersionNotSupported () va jeter l'exception.
Le correctif est que Nginx copie tous les en-têtes "Sec-WebSocket- *". En-têtes de demande: Sec-WebSocket-Extensions
, Sec-WebSocket-Key
, Sec-WebSocket-Protocol
, Sec-WebSocket-Version
En-têtes de réponse: Sec-WebSocket-Accept
, Sec-WebSocket-Extensions
, Sec-WebSocket-Protocol
Pour copier un en-tête Nginx personnalisé, vous devez procéder comme suit:
proxy_set_header Sec-WebSocket-Protocol $http_sec_websocket_protocol