대용량 파일 업로드를 허용하도록 coldfusion 서버를 설정하려고하는데 한계에 부딪 치고 있습니다. 지금까지 내가 관찰 한 내용은 다음과 같습니다.
업로드 크기를 제한하는 ColdFusion Administrator에는 “게시 데이터의 최대 크기”및 “스로틀 메모리 요청”의 두 가지 설정이 있습니다. 업로드 크기 (HTTP 오버 헤드 포함)가 해당 설정 중 하나보다 큰 경우 업로드가 거부됩니다. 왜이 중 2 개가 필요한지 알 수 없습니다. 더 높은 값을 설정하면 내가 알 수있는 한 아무런 영향을 미치지 않습니다. 낮은 쪽이 이깁니다.
누군가 너무 큰 파일을 업로드하려고하면 멋진 오류 메시지가 표시되지 않습니다. 약 1 개의 TCP 창에 해당하는 데이터를 보낸 후 업로드가 영원히 중단됩니다. 그리고 그것은 정말로 나쁜 방식으로 매달려 있습니다. 클라이언트가 포기하고 연결을 끊은 후에도 관련 아파치 스레드가 여전히 묶여 있습니다 (mod_status를 사용하여 볼 수 있음). 중단 된 스레드는 새 요청을 수행 할 서버가없고 서버를 다시 시작해야 할 때까지 계속 빌드됩니다.
“요청 스로틀”은 내가 정말로 이해하지 못하는 것입니다. 그것에 관한 모든 문서는 메모리 영역의 크기라고 말합니다. 그것이 그것이 그렇다면 파일 크기와 어떻게 관련이 있는지 볼 수 없습니다. ColdFusion은 업로드 된 전체 파일을 디스크에 쓰기 전에 메모리에 넣습니다. 업로드 루프 (중간 크기의 블록을 읽고 디스크에 쓰고, 끝날 때까지 반복)가 너무 쉬운 경우에는 그렇게 할 수 없습니다. (HTTP multipart / form-data post의 구조는 조금 더 어려워 지지만 웹 개발 제품을 갖춘 Adobe와 같은 대기업은 이것을 올바르게 얻을 수 있습니다 … 그렇지 않습니까?)
전체 파일 슬러 핑이 실제로 진행 중이라면 어떻게 처리 가능한 크기 제한을 선택할 것으로 예상합니까? 기가 바이트를 허용하면 몇 명의 동시 사용자가 시도하지 않고도 서버를 메모리에서 실행할 수 있습니다. 기가 바이트 업로드를 허용 하지 않으면 어떻게해야 합니까? 사람들은 게시 할 동영상이 있으며 편집 할 시간이 없습니다!
추가 정보
다음은 일부 버전 번호입니다.
웹 서버:
Server: Apache/2.2.24 (Win64) mod_jk/1.2.32
ColdFusion :
Server Product ColdFusion
Version ColdFusion 10,285437
Tomcat Version 7.0.23.0
Edition Enterprise
Operating System Windows Server 2008 R2
OS Version 6.1
Update Level /E:/ColdFusion10/cfusion/lib/updates/chf10000011.jar
Adobe Driver Version 4.1 (Build 0001)
추가 정보 # 2
제한 필드에 어떤 값을 입력했는지 알고 싶은 이유는 모르겠지만 둘 다 200MB로 설정되었습니다. “포스트 데이터의 최대 크기”를 2000MB로 늘 렸는데 효과가 없었습니다. “Request Throttle Memory”를 2000MB로 늘리면 더 큰 업로드가 가능하다는 것을 이미 알았습니다. 내가 여기서 찾고있는 것은 “더 큰 숫자가있는 것”이 아닙니다. 이 설정이 실제로 의미하는 것과 서버 메모리 사용에 미치는 영향에 대한 자세한 설명.
한계를 초과했을 때 오류 메시지를 반환하는 대신 서버 스레드가 영구적으로 중단되는 이유는 별도의 질문 일 수 있습니다. 나는 이것이 잘 알려진 문제라고 생각했다. 다른 사람이 그것을 재생할 수 있는지 먼저 물어봐야 할 것입니다. ColdFusion에서 “파일이 너무 큽니다”오류 메시지가 클라이언트에 반환 된 적이 없습니다. 이되어 가정 을 가지고?
추가 정보 # 3
일부 실험을 통해 부분적인 답변을 얻었습니다. 내가 놓친 첫 번째는 “RTM (Request Throttle Memory)” 이 “MSOPD (Maximum size of post data)”보다 높게 설정된 경우 유용한 기능을 수행한다는 것 입니다. 테스트의 첫 라운드에서, 그들 사이의 관계에 대한 실마리는 없었지만, 나는 다른 방법으로 테스트했습니다. 새로운 이해로, RTM / MSOPD 비율이 모두 최대 크기에 가까울 경우 허용되는 동시 업로드 수임을 알 수 있습니다.
“스로틀 메모리 요청”이 실제로는 임시 파일이 아니라 메모리 버퍼라고 가정하면 최악의 두려움이 맞았 음을 의미합니다. 모든 파일은 전체 업로드 기간 동안 완전히 메모리에 보관됩니다. 아무도 내가 믿지 않게 할 말을 한 적이 없다. (그러나 나는 “그렇다.이 바보 같은 짓을했다”
또한이 새로운 이해로, 정지 된 업로드는 의미가 있습니다. 서버에 업로드를 허용하는 데 사용할 수있는 메모리가 없으므로 소켓에서 읽지 않습니다. TCP 버퍼가 채워지고 창 크기가 0이되고 클라이언트가 다시 열리기를 기다립니다. 이는 서버가 요청을 읽기 시작하자마자 발생합니다. 그러나 내 경우에는 어떤 이유로 든 결코 일어나지 않습니다. 서버는 요청을 완전히 잊어 버려서 계속 남아 있습니다.
“최대 데이터 크기의 포스트 데이터”가 발생하는 경우 여전히 미스터리입니다. 하드 한계에 도달 한 요청은 대기하지 말고 거부해야합니다. 그리고에 거부 메시지 ( “게시물 크기가 최대 한도 인 200MB를 초과합니다.”)가 표시됩니다 server.log
. 그러나이 경우에도 서버는 클라이언트에게 오류를 보내지 않고 요청을 잊어 버린 것 같습니다.
답변
또한 튜닝 설정을 설명하려고합니다.
- 최대 POST 요청 매개 변수 수 -특정 요청을 통해 전송 된 최대 속성 / 매개 변수 수를 나타냅니다. 양식에 데이터를 게시하는 동안 특히 사용됩니다.
- 게시 데이터의 최대 크기 -서버에 게시 할 수있는 최대 데이터입니다. 이것은 POST 요청 중 특정 형식의 모든 데이터의 합계입니다.
- 요청 조절 임계 값 -ColdFusion은 필요한 경우 수신 요청을 조절할 수 있습니다 (강제적으로 느리게 할 수 있음). 그러나 스로틀 상태에 관계없이 실제로 작은 요청 (작은 페이로드가있는 요청)을 허용 할 수 있습니다. 작은 요청을 처리하려면 허용되는 최대 크기를 지정하십시오 (기본값은 최대 4MB).
- 요청 스로틀 메모리 – 요청을 스로틀 하려면 스로틀에 할당 된 최대 메모리 양을 지정하십시오. 사용 가능한 총 메모리가 충분하지 않으면 ColdFusion은 충분한 메모리가 확보 될 때까지 요청을 대기열에 넣습니다 (기본값은 200MB). 임계 값보다 낮은 Req1에 대한 메모리를 예약하지 않습니다.
Req1 (3MB), Req2 (6MB) 및 Req3 (9MB)의 동시 요청이 3 개 있다고 가정합니다. 기본 설정 인 Request Throttle Threshold가 4MB로 설정되면 ColdFusion은 스로틀 메모리에 (6 + 9 = 15MB)를 예약합니다. 마찬가지로 모든 동시 요청에 대해 요청 스로틀 메모리를 계속 추가하고 제한은 요청 스로틀 메모리에 대해 설정 한 것입니다 (기본값은 200MB).
도움이 되었기를 바랍니다.
답변
cftry-catch를 사용하여 오류를 캡처하고 사용자에게 사용자 정의 메시지를 표시 할 수 있습니다. 이미 말했지만, 최대 POST 요청 매개 변수 수, 최대 포스트 데이터 크기, 요청 스로틀 임계 값 및 요청 스로틀 메모리에 설정된 값은 무엇입니까 ? CF Std 또는 Ent를 사용하고 있으며 ColdFusion 버전은 무엇입니까?