apache2 отправляет поврежденные ответы при использовании cifs-share

apache2 отправляет поврежденные ответы при использовании cifs-share

У меня проблема с экземпляром ubuntu (Ubuntu 20.04.1 LTS) и apache2 (Apache/2.4.41 (Ubuntu)). Один виртуальный хост обслуживает некоторые html-файлы и документы из смонтированного cifs-share. cifs-share работает нормально, файлы в файловой системе корректны.

Однако Apache не может сгенерировать правильные ответы для каждого типа файла, который обслуживается в двоичном формате (например, изображения, текстовые документы, 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) не является проблемой и работает так, как и ожидалось. Однако, когда я копирую тот же файл в document-root другого виртуального хоста на том же сервере, который не использует смонтированный 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 также является базовой, поставляется с Ubuntu 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 Мне помогло отключение EnableMMAP в конфигурации Apache:

EnableMMAP off

решение2

В «/etc/apache2/apache2.conf» добавьте:

EnableSendfile Off
EnableMMAP off

Это спасло мне жизнь~

решение3

Второй ответ с отключенными EnableMMAP и Enable Sendfile, похоже, решил проблему для меня.

Эта директива контролирует, может ли httpd использовать поддержку sendfile из ядра для передачи содержимого файла клиенту. По умолчанию, когда обработка запроса не требует доступа к данным внутри файла, например, при доставке статического файла, Apache httpd использует sendfile для доставки содержимого файла, даже не читая файл, если ОС поддерживает это.

Отключение этого параметра исключает вероятность возникновения проблем из-за различных или неработающих функций в вызове sendfile ядра.

Это была проблема для RHEL 8 4.18.0-305.3.1.el8_4.x86_64

Связанный контент