>  기사  >  php教程  >  Apache 사이트에서 대용량 파일이 불완전하게 다운로드되는 이유 및 해결 방법

Apache 사이트에서 대용량 파일이 불완전하게 다운로드되는 이유 및 해결 방법

黄舟
黄舟원래의
2016-12-21 11:34:362229검색

오늘 JQuery 플러그인을 로컬에서 테스트했는데 브라우저에서 JQuery 파일의 x 줄에 "}"가 없다는 메시지가 계속 표시되었습니다.

처음에는 js 파일에 문제가 있는 줄 알고 공식 홈페이지에서 JQuery를 다시 다운로드했는데, 코드를 다시 확인해 보니 문제가 없었습니다.

그래서 Firefox로 테스트했는데 같은 오류가 발생했습니다. 그래서 FireBug를 이용하여 HTTP 요청을 확인해 보았는데 모두 200개라서 문제가 없었습니다.

그런데 jquery 파일을 요청한 응답 결과를 살펴보니 파일이 불완전하고 원본 파일의 일부만 반환된 것을 발견했습니다.

그런 다음 Xunlei를 사용하여 요청한 주소에서 js 파일을 다운로드할 수 있습니다. 그러나 다운로드한 파일의 크기도 정확합니다. 파일이 원본 파일과 다릅니다. 일부 코드를 추가한 후 다시 요청한 파일은 원본 파일의 일부일 뿐인 것으로 나타났습니다. 그러다가 작은 파일을 여러 개 다운로드해 보니 문제가 없는 것으로 나타났습니다. 하지만 100KB가 넘는 파일 등 약간 큰 파일은 불완전하게 다운로드되었습니다. 이런 종류의 문제가 발생한 것은 이번이 처음이었습니다. 문제를 찾기 위해 Baidu와 Google을 사용할 수밖에 없었습니다. Apache의 구성 문제인 것으로 밝혀졌습니다. 해결 방법은 다음과 같습니다.

Apache 구성 파일 httpd.conf의 끄기.
이 항목이 없으면 직접 추가하세요: EnableSendfile Off. 위 블록에 넣어야 합니다. 그렇지 않으면 Apache가 시작되지 않습니다.
상관되지 않는다면 EnableMMAP 이후의 값을 Off로 설정해 보세요.

원인 분석:

기본적으로 요청을 처리할 때 파일 내부의 데이터에 액세스할 필요가 없는 것으로 나타났습니다(예: 정적 파일 전송). 내용), 운영 체제에서 지원하는 경우 Apache는 sendfile을 사용하여 파일을 읽지 않고 파일 내용을 클라이언트에 직접 보냅니다. 이 sendfile 메커니즘은 별도의 읽기 및 쓰기 작업과 버퍼 할당을 방지합니다. 기본적으로 켜져 있기 때문에 일부 운영 체제에서는 sendfile 시스템 호출을 충분히 지원하지 않습니다. 따라서 일정 용량보다 큰 HTML 페이지는 전송할 수 없는 것으로 나타납니다. 이 기능을 꺼도 정상적인 사용에는 영향을 미치지 않습니다.

EnableSendfile 명령 및 EnableMMAP 명령 정보

EnableSendfile 명령


참고: 다음의 sendfile 지원을 사용하세요. 운영 체제 커널 클라이언트에 파일을 보내려면
구문: EnableSendfile On|Off
기본값: EnableSendfile On

이 지시어는 httpd가 운영 체제 커널의 sendfile 지원을 사용하여 파일을 보낼 수 있는지 여부를 제어합니다. 클라이언트에게. 기본적으로 파일 내부의 데이터에 대한 액세스가 필요하지 않은 요청(예: 정적 파일 콘텐츠 전송)을 처리할 때 운영 체제에서 지원하는 경우 Apache는 sendfile을 사용하여 파일 콘텐츠를 읽지 않고 클라이언트에 직접 보냅니다. 파일. 번역자 주: Linux2.4/2.6 커널 모두 이를 지원합니다.
이 sendfile 메커니즘은 별도의 읽기 및 쓰기 작업과 버퍼 할당을 방지하지만 일부 플랫폼이나 일부 파일 시스템에서는 일부 문제를 피하기 위해 이 기능을 비활성화하는 것이 가장 좋습니다.
일부 플랫폼에서는 컴파일 시스템 감지 기능이 있을 수 있습니다. 부적절하고 결함이 있습니다. sendfile 지원, 특히 다른 플랫폼에서 크로스 컴파일을 사용하여 얻은 바이너리가 현재 sendfile 지원에 결함이 있는 플랫폼에서 실행되는 경우.
Linux에서 IPv6가 활성화된 경우 sendfile을 사용하면 일부 네트워크 카드에서 TCP 체크섬 오프로드 버그가 발생합니다.
Linux가 Itanium 프로세서에서 실행되는 경우 sendfile은 2GB보다 큰 파일을 처리하지 못할 수 있습니다.
네트워크(예: NFS 또는 SMB)를 통해 마운트된 NFS 파일 시스템이 있는 DocumentRoot의 경우 커널은 자체 버퍼를 통해 네트워크 파일을 안정적으로 제공하지 못할 수 있습니다.
위의 상황이 발생하면 sendfile을 비활성화해야 합니다.
EnableSendfile Off
NFS 또는 SMB의 경우 이 명령은 다음 디렉터리 설정으로 재정의될 수 있습니다.
EnableSendfile Off


EnableMMAP 명령


설명: 전달 시 메모리 매핑 사용 읽기 files
구문: EnableMMAP On|Off
기본값: EnableMMAP On

이 지시문은 전달 중에 파일 내용을 읽어야 하는 경우 httpd에 메모리 매핑을 사용할 수 있는지 여부를 지시합니다. 서버 측 분석을 위해 mod_include를 사용하는 파일을 전달할 때와 같이 파일의 데이터에 대한 액세스가 필요한 요청을 처리할 때 Apache는 운영 체제에서 지원하는 경우 기본적으로 메모리 매핑을 사용합니다.
이런 종류의 메모리 매핑은 때때로 성능 향상을 가져오지만 경우에 따라 일부 운영 체제 문제를 방지하기 위해 메모리 매핑을 비활성화해야 할 수도 있습니다.
일부 다중 프로세서 시스템에서는 메모리 매핑으로 인해 일부 httpd 성능이 저하됩니다. .
NFS 마운트 DocumentRoot에서 파일이 메모리 매핑된 경우 파일을 삭제하거나 자르면 분할 오류로 인해 httpd가 중단됩니다.
이러한 문제가 발생할 수 있는 서버 구성 중에는 다음 명령을 사용하여 메모리 매핑을 비활성화해야 합니다.
MMAP 활성화 끄기
NFS 마운트 폴더의 경우 메모리 매핑을 비활성화하도록 개별적으로 지정할 수 있습니다.
EnableMMAP Off

위 내용은 Apache 사이트에서 대용량 파일을 불완전하게 다운로드하는 이유와 해결 방법입니다. 내용은 PHP 중국어 웹사이트(www.php.cn)를 참조하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.