IIS / ARR で Open WebUI をリバースプロキシする設定メモ

IIS

概要

Windows Server の IIS / ARR / URL Rewrite を使って、Open WebUI を HTTPS で公開する。

構成は次の通り。

クライアント
  ↓ HTTPS
IIS / ARR
  ↓ HTTP
Open WebUI : http://127.0.0.1:8080

Open WebUI は WebSocket を使用するため、通常のリバースプロキシ設定だけでは、チャット送信後に応答が自動表示されないことがある。

この環境では、IIS / ARR 経由の WebSocket で Sec-WebSocket-Extensions の扱いが問題になったため、URL Rewrite でヘッダー値を調整する。

事前に入れておく IIS 機能

Windows Server の「役割と機能の追加」で、少なくとも次を入れる。

Web サーバー IIS
URL 書き換え
Application Request Routing
WebSocket プロトコル
失敗した要求トレース

IIS マネージャーで、ARR のプロキシ機能も有効化しておく。

Application Request Routing Cache
  → Server Proxy Settings...
  → Enable proxy: 有効

ARR の設定

IIS マネージャーでサーバー名を選択する。

Application Request Routing Cache
  → Server Proxy Settings...

設定例:

Enable proxy: 有効
Time-out: 600
Response buffer (KB): 1
Response buffer threshold (KB): 0
Enable disk cache: 無効
Enable request consolidation: 無効

さらに、構成エディターで Host ヘッダー保持を有効にする。

構成エディター
  → system.webServer/proxy
  → preserveHostHeader = True

URL Rewrite のサーバー変数を許可する

IIS マネージャーで対象サイトを選択する。

URL 書き換え
  → サーバー変数の表示...
  → 追加...

次を追加する。

HTTP_SEC_WEBSOCKET_EXTENSIONS

これを許可しておかないと、URL Rewrite ルール内で WebSocket 関連ヘッダーを書き換えられない。

URL Rewrite ルール

対象サイトの web.config に、以下のような受信規則を設定する。

<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="OpenWebUI Reverse Proxy" enabled="true" stopProcessing="true">
          <match url="(.*)" />
          <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
          <serverVariables>
            <set name="HTTP_SEC_WEBSOCKET_EXTENSIONS" value="permessage-deflate; level=0" />
          </serverVariables>
          <action type="Rewrite" url="http://127.0.0.1:8080/{R:1}" appendQueryString="true" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

重要なのは次の部分。

<serverVariables>
  <set name="HTTP_SEC_WEBSOCKET_EXTENSIONS" value="permessage-deflate; level=0" />
</serverVariables>

IIS / ARR 経由で WebSocket が切断される場合、この設定により Open WebUI のチャット応答が自動表示されるようになることがある。

不要な専用ルールは作らない

/ws/socket.io/ 専用ルールや、WebSocket 専用ルールは最終的には不要。

残すルールは、通常のリバースプロキシルール1本だけでよい。

OpenWebUI Reverse Proxy

試行中に作った次のようなルールは削除、または無効化しておく。

OpenWebUI SocketIO
OpenWebUI WebSocket
OpenWebUI WebSocket Upgrade

Open WebUI 側の環境変数

Open WebUI を NSSM などでサービス起動している場合、必要に応じて起動時の環境変数に外部URLを指定する。

例:

$env:WEBUI_URL='https://xxx.xxxxx.net';
$env:CORS_ALLOW_ORIGIN='https://xxx.xxxxx.net;http://xxx.xxxxx.net:8080';
$env:ENABLE_WEBSOCKET_SUPPORT='true';

ENABLE_WEBSOCKET_SUPPORT=false にはしない。
これを false にすると、直接アクセス時の自動応答表示にも影響する。

反映

設定変更後、IIS を再起動する。

iisreset

Open WebUI 側の環境変数を変更した場合は、Open WebUI のサービスも再起動する。

Restart-Service <OpenWebUIのサービス名>

最終形

IIS / ARR / URL Rewrite で Open WebUI を公開する場合、最終的には次の構成にする。

IIS HTTPS 443
  ↓ ARR / URL Rewrite
http://127.0.0.1:8080

URL Rewrite ルールは1本。

<rule name="OpenWebUI Reverse Proxy" enabled="true" stopProcessing="true">
  <match url="(.*)" />
  <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
  <serverVariables>
    <set name="HTTP_SEC_WEBSOCKET_EXTENSIONS" value="permessage-deflate; level=0" />
  </serverVariables>
  <action type="Rewrite" url="http://127.0.0.1:8080/{R:1}" appendQueryString="true" />
</rule>

この設定で、Open WebUI のチャット応答が HTTPS 経由でも自動表示される。

コメント

スポンサーリンク
タイトルとURLをコピーしました