apache2 は cifs-share の使用時に破損した応答を送信します

apache2 は cifs-share の使用時に破損した応答を送信します

ubuntu インスタンス (Ubuntu 20.04.1 LTS) と apache2 (Apache/2.4.41 (Ubuntu)) に問題があります。 1 つの仮想ホストがマウントされた cifs 共有からいくつかの html ファイルとドキュメントを提供しています。 cifs 共有は正常に動作しており、ファイルはファイルシステム上で正しいです。

しかし、Apache はバイナリで提供されるすべてのファイルタイプ (画像、Word 文書、PDF など) に対して適切な応答を生成できません。たとえば、画像をダウンロードすると、image.gifファイルはダウンロードされてクライアントに保存されます。クライアントのテキスト エディターでファイルを開くと、次のようになります。

grade, Keep-Alive
Last-Modified: Thu, 12 Nov 2020 10:01:47 GMT
ETag: "b6b-5b3e600040144"
Accept-Ranges: bytes
Content-Length: 2923
Keep-Alive: timeout=5, max=100
Content-Type: image/gif

GIF89av[binary-string starting...]

そのため、レスポンス ヘッダーの一部がダウンロードされたファイルに含まれるようになりましたが、これは決して起きてはならないことです。ダウンロードされたファイルは、GIF89avなどで始まることを期待しています。テキストベースのファイル (html など) の提供は問題なく、期待どおりに機能します。ただし、マウントされた cifs-share を使用しない同じサーバー上の別の仮想ホストのドキュメント ルートに同じファイルをコピーすると、ファイルは正しく提供されます (レスポンス ヘッダーなし)。したがって、マウントされた cifs-share と apache2 の組み合わせに何らかの問題があり、それがこのエラーの原因になっていると推測します。

共有のマウントに関してすでにさまざまなオプションを試しましたが、ファイルは Apache なしでファイルシステム上で直接動作しているので、これは正しいと思います。

シェアは/etc/fstab次のようにマウントされます

//192.168.0.1/share$ /mnt/share cifs username=user,password=pass,dom=contoso.local 0 0

これは、最も基本的な方法です。 などのオプションを試しiocharset=utf8、さまざまなバージョン (vers=1.0またはvers=3.1) を試しましたが、何も変わりませんでした。 apache-configuration も基本的なもので、ubunutu 20 に同梱されており、特別な追加や変更はありません。 mime-types について少し経験しましたが、apache はすぐに画像を提供できるはずです。

さらに、そのディレクトリでテスト用に php-webserver ( php -S 192.168.0.2:8000) を起動しました。正しいバイナリ ファイルが返されるので、エラーが Apache のどこかにあると確信できます。

Apache からの応答が破損する原因は何ですか? また、これを修正するにはどうすればいいですか?

答え1

私も同じ問題を抱えています。この問題は最近のもので、カーネル バージョン 20.04 に関連している可能性があります。プレーン テキスト ファイルでも問題が発生しています。解決策や回避策は見つかりましたか? (申し訳ありませんが、コメントを投稿する権限がありません)

編集: ここでバグレポートを見つけることができました: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=900821 Apache 設定で EnableMMAP をオフにするとうまくいきました:

EnableMMAP off

答え2

「/etc/apache2/apache2.conf」に以下を追加します。

EnableSendfile Off
EnableMMAP off

これで命が救われたよ〜

答え3

2 番目の回答で、EnableMMAP と Enable Sendfile の両方をオフにすると、問題は解決したようです。

このディレクティブは、httpd がカーネルの sendfile サポートを使用してファイルの内容をクライアントに送信するかどうかを制御します。デフォルトでは、リクエストの処理でファイル内のデータにアクセスする必要がない場合 (たとえば、静的ファイルを配信する場合)、Apache httpd は、OS がサポートしていれば、sendfile を使用してファイルを読み取らずにファイルの内容を配信します。

これをオフにすると、カーネルの sendfile 呼び出しで異なる機能や動作しない機能によって問題が発生する可能性がなくなります。

これはRHEL 8 4.18.0-305.3.1.el8_4.x86_64の問題でした。

関連情報