
ubuntu-instance(Ubuntu 20.04.1 LTS) 및 apache2(Apache/2.4.41(Ubuntu))에 문제가 있습니다. 하나의 가상 호스트는 마운트된 cifs-share에서 일부 html 파일과 문서를 제공합니다. cifs-share가 정상적으로 작동하고 있으며 파일 시스템에서 파일이 정확합니다.
그러나 아파치는 바이너리로 제공되는 모든 파일 형식(예: 이미지, 단어 문서, 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의 조합에 일부 문제가 있어 해당 오류가 발생한다고 가정합니다.
공유 마운트와 관련하여 이미 다양한 옵션을 시도했지만 파일이 아파치 없이 파일 시스템에서 직접 작동하기 때문에 제 생각에는 맞습니다.
공유는 /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 구성도 기본 구성이며 우분투 20과 함께 제공되며 특별히 추가되거나 변경된 사항은 없습니다. 나는 MIME 유형에 대해 약간 경험했지만 Apache는 기본적으로 이미지를 제공할 수 있어야 합니다.
또한 해당 디렉토리에서 테스트하기 위해 php-webserver( php -S 192.168.0.2:8000
)를 시작했습니다. 이는 올바른 바이너리 파일을 반환하므로 오류가 아파치 어딘가에 있다는 것을 확실히 알 수 있습니다.
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
EnableMMAP off와 Enable Sendfile Off를 모두 사용한 두 번째 답변이 문제를 해결한 것 같습니다.
이 지시문은 httpd가 파일 내용을 클라이언트에 전송하기 위해 커널의 sendfile 지원을 사용할 수 있는지 여부를 제어합니다. 기본적으로 요청 처리 시 파일 내의 데이터에 대한 액세스가 필요하지 않은 경우(예: 정적 파일을 전달할 때) Apache httpd는 OS가 지원하는 경우 파일을 읽지 않고 sendfile을 사용하여 파일 내용을 전달합니다.
이 기능을 끄면 커널 sendfile 호출에서 기능이 다르거나 작동하지 않아 문제가 발생할 가능성이 제거됩니다.
이는 RHEL 8 4.18.0-305.3.1.el8_4.x86_64의 문제였습니다.