リバースプロキシの背後にある同じポートとドメイン上の HTTP と Websocket

リバースプロキシの背後にある同じポートとドメイン上の HTTP と Websocket

Node-Red を試したかったので、Ubuntu サーバーにインストールしました。このサーバーは Apache リバース プロキシを実行していますが、正常に動作しません。HTTP 接続用の仮想ホストを作成すると、Node-Red インターフェイスに問題なくアクセスできますが、オンライン MQTT サーバーやデバッグ メッセージなどのアクティビティは表示されません。グーグルで調べたところ、これは Websocket も使用しているため、それらも通過させる必要があることが分かりました。

そして、私が解決できなかったパズルがこれです。HTTP または Websocket のいずれかをパススルーできますが、同時にはパススルーできません。HTTP をパススルーし、Node-Red Web インターフェイスをロードしてから、リバース プロキシ設定を WS パススルーに変更すると、完全な機能を利用できます。ただし、HTTP パススルーが削除されたため、Node-Red ページを再ロードしたり再接続したりすることはできません。

両方を同じドメインとポートに追加するにはどうすればよいですか? それとも、これはまったく不可能ですか? 以下は私の 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>

ProxyPass ws:// などで場所を追加すると、ライブ情報とデバッガーは機能しますが、Web インターフェイスにはアクセスできなくなります。両方が機能するように Apache 構成ファイルを変更するにはどうすればよいですか?

答え1

ウェブソケット接続もプロキシする必要があるようです。この前の回答

設定には次のようなものを試してください。

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

答え2

Apache リバース プロキシを介して Node-Red の HTTP トラフィックと WebSocket トラフィックの両方を有効にするには、Apache 構成にいくつかの変更を加える必要があります。次の操作を試してみてください。

  1. Node-Red の VirtualHost セクションに次の行を追加して、WebSocket プロキシを有効にします。
    <Location /ws>
      ProxyPass ws://localhost:1880/ws
      ProxyPassReverse ws://localhost:1880/ws
    </Location>

これにより、Apache はすべての WebSocket トラフィックを Node-Red にプロキシするように指示されます。

  1. 既存の ProxyPass および ProxyPassReverse ディレクティブを変更して、WebSocket エンドポイントを除外します。前の手順のタグの後に次の行を追加します。
    ProxyPassMatch "^/(?!ws)(.*)" "http://localhost:1880/$1"

これは、WebSocket エンドポイントを除くすべての HTTP トラフィックを Node-Red にプロキシするように Apache に指示します。

変更された VirtualHost セクションは次のようになります。

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

変更を有効にするには、Apache を再起動します。

sudo systemctl restart apache2

これらの変更により、HTTP トラフィックと WebSocket トラフィックの両方が Apache リバース プロキシを介して Node-Red に正しくプロキシされるようになります。

関連情報