HTTP y websocket en el mismo puerto y dominio detrás del proxy inverso

HTTP y websocket en el mismo puerto y dominio detrás del proxy inverso

Quería probar Node-Red y lo instalé en mi servidor Ubuntu. Este servidor ejecuta un proxy inverso de Apache pero no consigo que funcione correctamente. Si creo un host virtual para la conexión HTTP, puedo acceder a mi interfaz Node-Red sin problemas, pero no me muestra ninguna actividad, como servidores MQTT en línea o mensajes de depuración. Después de buscar en Google, descubrí que esto se debe a que también usa websockets y esos también deben pasarse.

Y aquí está el enigma que no logré resolver: puedo pasar por HTTP o por websockets, pero no al mismo tiempo. Si paso a través de HTTP, cargo la interfaz web de Node-Red y luego cambio la configuración del proxy inverso al paso a través de WS, obtengo una funcionalidad completa. Sin embargo, no puedo recargar ni volver a conectarme a la página Node-Red porque se eliminó el paso HTTP.

¿Cómo agrego ambos en el mismo dominio y puerto? ¿O esto no es posible en absoluto? Aquí está parte de mi configuración de Apache2:

<VirtualHost *:80>
ServerName nr.domain.com
Redirect permanent / https://nr.domain.com/
RewriteEngine on
RewriteCond %{SERVER_NAME} =nr.domain.com
RewriteRule ^https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
ServerName nr.domain.com
SSLEngine On
<Location />
ProxyPass http://localhost:1880/
ProxyPassReverse http://localhost:1880/
</Location>

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/nr.domain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/nr.domain.com/privkey.pem
</VirtualHost>

Si agrego una ubicación con ProxyPass ws:// y así sucesivamente, la información en vivo y el depurador funcionan, pero ya no se puede acceder a la interfaz web. ¿Cómo modifico mi archivo de configuración de Apache de manera que ambos funcionen?

Respuesta1

Parece que también necesitas proxy de conexiones de socket web segúnesta respuesta anterior.

Pruebe algo como esto para su configuración.

<VirtualHost *:80>
  ServerName nr.domain.com
  Redirect permanent / https://nr.domain.com/
  RewriteEngine on
  RewriteCond %{SERVER_NAME} =nr.domain.com
  RewriteRule ^https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
  ServerName nr.domain.com
  SSLEngine On
  <Location />
    ProxyPass http://localhost:1880/
    ProxyPassReverse http://localhost:1880/
  </Location>

  # New web socket proxy
  <Location /comms>       
    ProxyPass ws://localhost:1880/comms
    ProxyPassReverse ws://localhost:1880/comms
  </Location>

  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateFile /etc/letsencrypt/live/nr.domain.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/nr.domain.com/privkey.pem
</VirtualHost>

Respuesta2

Para habilitar el tráfico HTTP y WebSocket para Node-Red a través de su proxy inverso Apache, debe realizar algunas modificaciones en su configuración de Apache. Esto es lo que puedes probar:

  1. Habilite el proxy WebSocket agregando las siguientes líneas a la sección VirtualHost para Node-Red:
    <Location /ws>
      ProxyPass ws://localhost:1880/ws
      ProxyPassReverse ws://localhost:1880/ws
    </Location>

Esto le dice a Apache que envíe todo el tráfico de WebSocket a Node-Red.

  1. Modifique las directivas ProxyPass y ProxyPassReverse existentes para excluir el punto final WebSocket. Agregue la siguiente línea después de la etiqueta del paso anterior:
    ProxyPassMatch "^/(?!ws)(.*)" "http://localhost:1880/$1"

Esto le indica a Apache que envíe todo el tráfico HTTP a Node-Red excepto el punto final WebSocket.

La sección VirtualHost modificada debería verse así:

<VirtualHost *:443>
  ServerName nr.domain.com
  SSLEngine On

  <Location /ws>
    ProxyPass ws://localhost:1880/ws
    ProxyPassReverse ws://localhost:1880/ws
  </Location>

  <Location />
    ProxyPassMatch "^/(?!ws)(.*)" "http://localhost:1880/$1"
    ProxyPassReverse http://localhost:1880/
  </Location>

  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateFile /etc/letsencrypt/live/nr.domain.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/nr.domain.com/privkey.pem
</VirtualHost>

Reinicie Apache para que los cambios surtan efecto:

sudo systemctl restart apache2

Con estos cambios, tanto el tráfico HTTP como el WebSocket deberían enviarse correctamente a Node-Red a través de su proxy inverso Apache.

información relacionada