Aokashi Room

作った作品の紹介やレビュー、トラブルシューティングとか色々

MediaWiki 1.35 をリバースプロキシすると Firefox 以外で正常に閲覧できない問題

久しぶりに MediaWiki を設置してみたんですが、 Chrome だとどうしても動かない問題が発生していまして、その状況をお話しします。

追記: 2023年4月現在のバージョン 1.39 であればこの不具合は修正されています

下記に掲載している Phabricator の報告ではどのバージョンで修正されたかは明らかになっていないですが、 1.36 辺りで修正されたようです。

今から MediaWiki をリバースプロキシを介する形で設置する方は気にする必要はありません。

閲覧できない条件

  • MediaWiki 1.35 がインストールされている
  • リクエストを NGINX のリバースプロキシを活用し、 MediaWiki に転送するように設定している
  • Firefox 以外で閲覧している

どうしてこのような構成にしたのか説明しますと、自分のサイトのサーバー (VPS) はメンテナンスを容易にするために Docker を使用していまして、自分のサイトや資料集など1つ1つを Docker のコンテナとして稼働しています。となると1サイト1サーバーと言う構成になるので、 URL に応じてアクセスするサーバーを選択するにはリバースプロキシが必要になります。今回は下記の Docker イメージを活用して複数のサイトを管理できるようにしています。

github.com

症状

Chrome ではページが一切変化せず、開発者ツールでは net::ERR_HTTP2_PROTOCOL_ERROR 200 と表示されます。

IE では INET_E_DOWNLOAD_FAILURE というエラーメッセージが表示されます。

Safari については一応表示されるものの、所々レイアウト崩れが発生しているように見えました。また、開発者ツールでは kcferrordomaincfnetwork 303 と表示されます。

また、リバースプロキシを行っている NGINX サーバーのログでは下記のように出力されており、 Content-Length が実際に受け取ったレスポンスのサイズと異なることがわかります。

[warn] 29#29: *111 upstream sent more data than specified in "Content-Length" header while reading response header from upstream, client: XXX.XXX.XXX.XXX, server: xxx.aokashi.net, request: "GET / HTTP/2.0", upstream: "http://172.19.0.X:80/", host: "xxx.aokashi.net"
[alert] 29#29: *111 zero size buf in writer t:0 r:0 f:0 0000000000000000 00005645D7B3B198-00005645D7B3B198 0000000000000000 0-0 while sending to client, client: XXX.XXX.XXX.XXX, server: xxx.aokashi.net, request: "GET / HTTP/2.0", upstream: "http://172.19.0.X:80/", host: "xxx.aokashi.net"
[23/Nov/2020:07:04:07 +0000] "GET / HTTP/2.0" 301 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
[error] 29#29: *111 upstream prematurely closed connection while reading upstream, client: XXX.XXX.XXX.XXX, server: xxx.aokashi.net, request: "GET /wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8 HTTP/2.0", upstream: "http://172.19.0.X:80/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8", host: "xxx.aokashi.net"
[23/Nov/2020:07:04:08 +0000] "GET /wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8 HTTP/2.0" 200 5711 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"

解決策

PHP プログラム側のバグの可能性があります。圧縮出力を無効にしましょう。

$wgDisableOutputCompression = true;

なお、 MediaWiki 1.34 では発生しないため、 1.34 にダウングレードする手もありますが、 MediaWiki 1.34 は開発を終了しているため、おすすめはしません。

lists.wikimedia.org

原因

MediaWiki で実行されている PHP では、 gzip 圧縮を行うと Content-Length とは異なるサイズのデータが出力されるとのことだそうです。

stackoverflow.com

詳しく調べていないのでこの考えは間違っているかもしれませんが、リバースプロキシを介していない場合は Content-Length の間違いに気付かないまま正しくレスポンスを返しているのかもしれません。

なお、この不具合は MediaWiki の Phabricator でも報告されています。

phabricator.wikimedia.org

修正版のリリースを待ちましょう。

  • 2023/04/06: 修正版のリリースについて追記しました。