Implementé / intenté implementar un websocket para la comunicación entre usuarios en una instancia ec2 que ejecuta Linux con un servidor web apache. Lo tenía funcionando cuando lo configuré por primera vez donde mi websocket de trinquete apuntaba al puerto 8081 sin ningún TLS. Con esta configuración, pude actualizar a un websocket y enviar/recibir datos, a través de un websocket no seguro. Sin embargo, esto solo fue posible a través de la dirección IP y no a través de la URL real. Estoy ejecutando el websocket en un subdominio.
<VirtualHost *:443> DocumentRoot "/var/www/html/video" ServerName video.domain.com SSLEngine on SSLCertificateFile ./certs/server.crt SSLCertificateKeyFile ./certs/server.key # ProxyPass /ratchet/ ws://video.domain.com:8081/ <Directory "/var/www/html/video"> AllowOverride All Require all granted </Directory> </VirtualHost>
La solución anterior funciona cuando uso la conexión websocket basada en ip para conectarme al websocket a través de la API JS websocket.
He probado WSS, WS, con y sin puertos, etc. para la API de websocket, pero aún así el código escrito debajo es el único que puedo trabajar.
let socket = new WebSocket("ws://server_ip:8081");
He leído muchas preguntas de stackoverflow con respecto a agregar un proxypass al VH, pero no actualiza la solicitud. Además, he intentado crear su propio host virtual y tampoco funciona.
Creo que vale la pena mencionar que tengo un CDN de Cloudflare a través del cual se envían las solicitudes. Espero conseguir algunos ojos nuevos. Ha estado atascado por un tiempo.
No tengo suficiente representante para un comentario, así que responda.
Ha pasado un tiempo desde que me metí en esto, y mi primer pensamiento fue que de hecho necesitas un ProxyPass, pero cuando miré mi configuración, este no es el caso.
Voy a arriesgarme y supongo que su VH es el problema aquí, está escuchando explícitamente en el puerto 443 (https) pero creo que wss tiene otro puerto en el que escucha, así que tal vez podría probar con otro puerto. Aparte de eso, también podría intentar hacer un new WebSocket('https://video.domain.com')
y habilitar el proxy en el VH, de esta manera la capa http maneja la conexión segura. Pero dado que el navegador intentará actualizar la solicitud a un socket, dudo que esto funcione.
Debo mencionar que en mi caso usé websockets para abrir una conexión mqtt, ya que el navegador no implementa mqtt, esto se hace a través de wss.
Si nada de esto funciona, podría intentar profundizar en el funcionamiento interno de mqtt lib que uso para analizar cómo se configura la conexión.
Espero que algo de esto ayude :D
Como no había suficiente espacio en los comentarios, lo colocaré aquí:
no está relacionado con sockets sino con apache y proxies: la directiva ProxyPass
tiene una contraparte ProxyPassReverse
para ese mismo objetivo.
<virtualhost IPv4:443 [IPv6]:443> Servername knowledge.domain.com:443 ServerAlias knowledge.domain.com ServerAdmin webmaster@domain.com DocumentRoot /path/to/documentRoot <Directory /path/to/documentRoot> Options -Indexes -FollowSymLinks -SymLinksIfOwnerMatch </Directory> SSLEngine On SSLCertificateFile /path/to/ssl.crt SSLCertificateKeyFile /path/to/ssll.key SSLCACertificateFile /path/to/ssll.cer Header always set Strict-Transport-Security: "max-age=31536000; includeSubDomains; preload" Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure" ProxyRequests Off ProxyPreserveHost On ProxyVia Full <Proxy *> Require all granted </Proxy> <Location /> ProxyPass http://127.0.0.1:3000/ ProxyPassReverse http://127.0.0.1:3000/ </Location> <Directory /> Options -FollowSymLinks -Indexes -SymLinksIfOwnerMatch </Directory> CustomLog "/path/to/logs/access.log" combined ErrorLog "/path/to/logs/error.log" LogLevel warn </virtualhost>
este es un ejemplo de mi proxy conf para una aplicación nodejs