Apache2 envía respuestas corruptas cuando se utiliza un recurso compartido cifs

Apache2 envía respuestas corruptas cuando se utiliza un recurso compartido cifs

Tengo un problema con una instancia de ubuntu (Ubuntu 20.04.1 LTS) y apache2 (Apache/2.4.41 (Ubuntu)). Un host virtual sirve algunos archivos html y documentos desde un recurso compartido cifs montado. Cifs-share funciona normalmente, los archivos son correctos en el sistema de archivos.

Sin embargo, Apache no genera respuestas adecuadas para cada tipo de archivo que se sirve en binario (como imágenes, documentos de Word, PDF, ...). Por ejemplo, cuando descargo una imagen, image.gifel archivo se descarga y se guarda en el cliente. Al abrir el archivo con un editor de texto en el cliente, se ve como sigue:

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...]

Entonces, una parte de los encabezados de respuesta ahora están en el archivo descargado, lo que nunca debería suceder. Espero el archivo descargado que comienza con GIF89avy así sucesivamente. Servir archivos basados ​​en texto (como html) no es un problema y funciona como se esperaba. Sin embargo, cuando copio el mismo archivo en la raíz del documento de otro host virtual en el mismo servidor que no usa el recurso compartido cifs montado, el archivo se entrega correctamente (sin encabezados de respuesta). Entonces supongo que hay algún problema en esta combinación de cifs-share y apache2 montados, lo que conduce a ese error.

Ya probé varias opciones con respecto al montaje del recurso compartido, pero en mi opinión es correcto, ya que los archivos funcionan directamente en el sistema de archivos sin Apache.

La acción se monta de /etc/fstabla siguiente manera.

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

que es prácticamente la forma más básica de hacerlo. Experimenté con opciones como iocharset=utf8, probé diferentes versiones ( vers=1.0o vers=3.1) pero eso no cambió nada. La configuración de Apache también es la básica, se envía con Ubuntu 20, no se agregó ni cambió nada especial allí. Experimenté un poco con los tipos mime, pero Apache debería ser capaz de mostrar una imagen lista para usar.

Además, inicié un servidor web php ( php -S 192.168.0.2:8000) para realizar pruebas en ese directorio, que devuelve archivos binarios correctos, lo que me deja bastante seguro de que el error está en algún lugar de Apache.

¿Qué está provocando estas respuestas corruptas de Apache y cómo puedo solucionarlo?

Respuesta1

Tengo el mismo problema, parece que este problema es reciente, posiblemente relacionado con la versión del kernel 20.04. También veo el problema con los archivos de texto sin formato. ¿Pudiste encontrar una solución/solución alternativa? (Lo siento, no tengo representante para publicar un comentario)

Editar: pude encontrar un informe de error aquí: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=900821 Desactivar EnableMMAP en la configuración de Apache funcionó para mí:

EnableMMAP off

Respuesta2

En "/etc/apache2/apache2.conf", agregue:

EnableSendfile Off
EnableMMAP off

Esto me salvó la vida~

Respuesta3

La segunda respuesta con EnableMMAP desactivado y Enable Sendfile desactivado parece haber solucionado el problema.

Esta directiva controla si httpd puede usar el soporte de envío de archivos del kernel para transmitir el contenido del archivo al cliente. De forma predeterminada, cuando el manejo de una solicitud no requiere acceso a los datos dentro de un archivo (por ejemplo, cuando se entrega un archivo estático), Apache httpd usa sendfile para entregar el contenido del archivo sin siquiera leerlo si el sistema operativo lo admite.

Desactivar esto elimina la posibilidad de que una funcionalidad diferente o que no funcione en la llamada del archivo de envío del kernel cause problemas.

Este fue un problema para RHEL 8 4.18.0-305.3.1.el8_4.x86_64

información relacionada