HTTP e websocket na mesma porta e domínio atrás do proxy reverso

HTTP e websocket na mesma porta e domínio atrás do proxy reverso

Eu queria experimentar o Node-Red e instalá-lo no meu servidor Ubuntu. Este servidor executa um proxy reverso Apache, mas não consigo fazê-lo funcionar corretamente. Se eu criar um host virtual para a conexão HTTP, posso acessar minha interface Node-Red perfeitamente, mas ela não mostra nenhuma atividade, como servidores MQTT online ou mensagens de depuração. Depois de pesquisar no Google, descobri que isso ocorre porque ele também usa websockets e eles também precisam ser passados.

E aqui está o quebra-cabeça que não consegui resolver: posso passar tanto por HTTP quanto por websockets, mas não ao mesmo tempo. Se eu passar por HTTP, carregar a interface da web Node-Red e, em seguida, alterar as configurações de proxy reverso para passagem WS, obtenho funcionalidade completa. No entanto, não consigo recarregar ou reconectar-me à página Node-Red porque a passagem HTTP foi removida.

Como adiciono ambos no mesmo domínio e porta? ou isso não é possível? Aqui estão algumas das minhas configurações do 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>

Se eu adicionar um local com ProxyPass ws:// e assim por diante, as informações ao vivo e o depurador funcionarão, mas a interface da web não estará mais acessível. Como modifico meu arquivo de configuração do Apache de uma forma que ambos funcionem?

Responder1

Parece que você também precisa fazer proxy de conexões de soquete da web com base emesta resposta anterior.

Tente algo assim para sua configuração.

<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>

Responder2

Para ativar o tráfego HTTP e WebSocket para Node-Red por meio do proxy reverso Apache, você precisa fazer algumas modificações na configuração do Apache. Aqui está o que você pode tentar:

  1. Habilite o proxy WebSocket adicionando as seguintes linhas à seção VirtualHost para Node-Red:
    <Location /ws>
      ProxyPass ws://localhost:1880/ws
      ProxyPassReverse ws://localhost:1880/ws
    </Location>

Isso diz ao Apache para fazer proxy de todo o tráfego WebSocket para o Node-Red.

  1. Modifique as diretivas ProxyPass e ProxyPassReverse existentes para excluir o endpoint WebSocket. Adicione a seguinte linha após a tag da etapa anterior:
    ProxyPassMatch "^/(?!ws)(.*)" "http://localhost:1880/$1"

Isso diz ao Apache para fazer proxy de todo o tráfego HTTP para Node-Red, exceto para o endpoint WebSocket.

A seção VirtualHost modificada deve ficar assim:

<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 o Apache para que as alterações tenham efeito:

sudo systemctl restart apache2

Com essas mudanças, o tráfego HTTP e WebSocket deve ser proxy corretamente para o Node-Red por meio do proxy reverso Apache.

informação relacionada