概要
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 経由でも自動表示される。

コメント