Cài đặt ColdFusion để tải lên tệp lớn


8

Tôi đang cố gắng thiết lập một máy chủ Coldfusion để chấp nhận tải lên các tệp lớn và tôi đang va vào một số giới hạn. Đây là những gì tôi đã quan sát cho đến nay:

Có hai cài đặt trong Quản trị viên ColdFusion giới hạn kích thước tải lên: "Kích thước tối đa của dữ liệu bài đăng" và "Bộ nhớ điều tiết yêu cầu". Nếu kích thước tải lên của bạn (bao gồm cả chi phí HTTP) lớn hơn một trong những cài đặt đó, thì tải lên sẽ bị từ chối. Tôi không thể hiểu tại sao chúng ta cần 2 trong số này; cái nào được đặt cao hơn sẽ không có tác dụng như tôi có thể nói. Người nào thấp hơn sẽ thắng.

Khi ai đó cố tải lên một tệp quá lớn, họ sẽ không nhận được thông báo lỗi hay. Việc tải lên chỉ bị treo mãi mãi sau khi gửi khoảng 1 cửa sổ dữ liệu TCP. Và nó bị treo một cách thực sự tồi tệ. Ngay cả sau khi máy khách bỏ cuộc và ngắt kết nối, luồng apache liên quan vẫn bị trói (tôi có thể thấy điều này bằng cách sử dụng mod_status). Các luồng bị kẹt chỉ tiếp tục xây dựng cho đến khi không còn yêu cầu mới và máy chủ phải được khởi động lại.

"Yêu cầu điều tiết" là một điều tôi thực sự không hiểu. Tất cả tài liệu về nó nói về nó như kích thước của một vùng nhớ. Nếu đó là cái gì thì tôi không thể thấy nó liên quan đến kích cỡ tập tin như thế nào. Nó gợi ý về một điều mà tôi không muốn tin: rằng ColdFusion nhét toàn bộ tệp đã tải lên vào bộ nhớ trước khi ghi bất kỳ tệp nào vào đĩa. Không có người tỉnh táo sẽ làm điều đó, khi một vòng lặp tải lên (đọc một khối có kích thước trung bình, ghi nó vào đĩa, lặp lại cho đến khi hoàn thành) rất dễ dàng. (Tôi biết cấu trúc của một bài đăng đa dữ liệu / biểu mẫu dữ liệu HTTP làm cho nó khó hơn một chút nhưng ... chắc chắn một công ty lớn như Adobe với sản phẩm phát triển web có thể hiểu điều này ... phải không?)

Nếu toàn bộ tập tin thực sự là những gì đang diễn ra, làm thế nào để họ mong đợi chúng tôi chọn giới hạn kích thước hoàn toàn khả thi? Cho phép một gigabyte và một vài người dùng đồng thời có thể chạy máy chủ của bạn ra khỏi bộ nhớ mà không cần thử. Và chúng ta sẽ làm gì, không cho phép tải lên gigabyte? Mọi người có video để đăng và không có thời gian để chỉnh sửa chúng!

THÔNG TIN THÊM

Dưới đây là một số số phiên bản.

Máy chủ web:

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)

THÔNG TIN THÊM # 2

Tôi không biết tại sao bạn muốn biết những giá trị nào tôi đã đặt trong các trường giới hạn, nhưng cả hai đều được đặt thành 200 MB trong một thời gian. Tôi đã tăng "Kích thước tối đa của dữ liệu bài đăng" lên 2000 MB và nó không có hiệu lực. Tôi đã nhận ra rằng nếu tôi tăng "Bộ nhớ điều tiết yêu cầu" lên 2000 MB thì nó sẽ cho phép tải lên lớn hơn. Những gì tôi đang tìm kiếm ở đây không phải là một "số lượng lớn hơn trong đó!" trả lời, nhưng một lời giải thích chi tiết về ý nghĩa của các cài đặt này và ý nghĩa của chúng đối với việc sử dụng bộ nhớ máy chủ.

Tại sao luồng máy chủ bị treo mãi mãi thay vì trả về một thông báo lỗi khi vượt quá giới hạn có thể là câu hỏi riêng biệt. Tôi cho rằng đây sẽ là một vấn đề nổi tiếng. Có lẽ tôi nên hỏi trước xem có ai có thể sao chép nó không. Tôi chưa bao giờ thấy một thông báo lỗi "tệp quá lớn" được trả về cho khách hàng từ ColdFusion. Nó có phải là có một?

THÔNG TIN BỔ SUNG # 3 Một số thử nghiệm đã đưa tôi đến một câu trả lời một phần. Điều đầu tiên tôi thiếu là "Bộ nhớ điều tiết yêu cầu" (RTM) thực hiện một cái gì đó hữu ích nếu nó được đặt cao hơn "Kích thước tối đa của dữ liệu bài đăng" (MSOPD). Trong vòng thử nghiệm đầu tiên của tôi, không có manh mối nào về mối quan hệ giữa họ, tôi đã có họ theo cách khác. Với sự hiểu biết mới của tôi, tôi có thể thấy rằng tỷ lệ RTM / MSOPD là số lượng tải lên đồng thời sẽ được phép nếu tất cả chúng đều ở gần kích thước tối đa.

Giả sử rằng "Bộ nhớ điều tiết yêu cầu" thực sự là bộ nhớ đệm và không phải là tệp tạm thời, điều này có nghĩa là nỗi sợ hãi tồi tệ nhất của tôi là chính xác. Mỗi tệp được lưu giữ hoàn toàn trong bộ nhớ trong toàn bộ thời gian tải lên. Không ai nói bất cứ điều gì để khiến tôi tin theo cách khác (mặc dù tôi cũng không thấy ai nhảy lên nói "vâng, họ đã làm điều ngu ngốc này")

Cũng với sự hiểu biết mới này, việc tải lên bị đình trệ có ý nghĩa. Máy chủ không có sẵn bộ nhớ để chấp nhận tải lên, vì vậy nó chỉ không đọc được từ ổ cắm. Bộ đệm TCP lấp đầy, kích thước cửa sổ trở thành 0 và máy khách chờ nó mở lại, điều này sẽ xảy ra ngay khi máy chủ bắt đầu đọc yêu cầu. Nhưng trong trường hợp của tôi, vì một số lý do, điều đó không bao giờ xảy ra. Máy chủ quên hoàn toàn yêu cầu để nó chỉ tồn tại.

Trường hợp "Kích thước tối đa của dữ liệu bài đăng" bị tấn công vẫn còn là một bí ẩn. Các yêu cầu đạt đến giới hạn cứng không nên được xếp hàng, chỉ cần từ chối. Và tôi nhận được một tin nhắn từ chối ("Kích thước bài đăng vượt quá giới hạn tối đa 200 MB.") Trong server.log. Nhưng một lần nữa trong trường hợp này, máy chủ dường như quên mất yêu cầu mà không bao giờ gửi lỗi đến máy khách.


Hai câu hỏi: 1. Bạn có chắc chắn đó là Cold Fusion chứ không phải máy chủ web? và 2. Bạn đã xem hết thời gian yêu cầu chưa?
Kinda Villyard

1
Tôi chắc chắn. Không có thời gian chờ (quá trình tải lên lấp đầy một cửa sổ TCP và sau đó dừng lại. Đã được chứng minh bằng wireshark. Cắt một vài byte ở cuối tệp và nó sẽ gửi trong 13 giây.) Và tôi có thể đăng tải lên một trang HTML tĩnh và nó sẽ gửi tốt (nó không được lưu ở bất cứ đâu vì không có gì xử lý dữ liệu biểu mẫu, nhưng vấn đề là nó không bị đình trệ.)

Câu trả lời:


1

Tôi cũng sẽ cố gắng giải thích các cài đặt để điều chỉnh: -

  • Số lượng tham số yêu cầu POST tối đa - Điều này đề cập đến số lượng thuộc tính / tham số tối đa được gửi qua một yêu cầu cụ thể. Được sử dụng đặc biệt, trong khi đăng dữ liệu trên một hình thức.
  • Kích thước tối đa của dữ liệu bài đăng - Đây là dữ liệu tối đa có thể được đăng trên máy chủ. Đây là tổng của tất cả các dữ liệu trong một hình thức cụ thể trong một yêu cầu POST.
  • Ngưỡng yêu cầu - ColdFusion có thể điều tiết (làm chậm mạnh mẽ) các yêu cầu đến nếu cần. Tuy nhiên, các yêu cầu thực sự nhỏ (những yêu cầu có tải trọng nhỏ) có thể được cho phép thông qua bất kể trạng thái bướm ga. Để cho phép các yêu cầu nhỏ được xử lý, chỉ định kích thước tối đa được phép (mặc định là tối đa 4 MB).
  • Bộ nhớ bướm ga yêu cầu - Để điều tiết các yêu cầu, chỉ định lượng bộ nhớ tối đa được phân bổ cho van tiết lưu. Nếu không đủ tổng bộ nhớ khả dụng, ColdFusion sẽ yêu cầu hàng đợi cho đến khi đủ bộ nhớ trống (mặc định là 200 MB). Nó không muốn dành bộ nhớ cho Req1, vì nó thấp hơn Ngưỡng.

Hãy xem xét rằng có ba yêu cầu đồng thời Req1 (3 MB), Req2 (6 MB) và Req3 (9 MB). Với các cài đặt mặc định, Ngưỡng yêu cầu được đặt thành 4MB, ColdFusion sẽ dự trữ (6 + 9 = 15MB) trong Bộ nhớ điều tiết. Tương tự, nó sẽ tiếp tục thêm Bộ nhớ điều tiết yêu cầu cho tất cả các yêu cầu đồng thời và giới hạn là những gì chúng tôi đã đặt cho Bộ nhớ điều tiết yêu cầu (mặc định là 200 MB)

Hi vọng điêu nay co ich.


Điều này tương tự với tất cả các mô tả khác mà tôi tìm thấy thông qua google. Tất cả đều bỏ qua một điều tôi cần biết: Bộ nhớ điều tiết yêu cầu được cho là lớn hơn kích thước tối đa của dữ liệu bài đăng. Và tôi cũng chỉ đoán rằng Bộ nhớ điều tiết yêu cầu phải nhỏ hơn JVM Heap Size, khiến cho không thể tải lên các tệp thực sự lớn (gần hoặc lớn hơn RAM của máy chủ của bạn). Tuy nhiên, đây là câu trả lời tốt nhất cho đến nay, vì vậy tôi ủng hộ nó và tôi sẽ chấp nhận nếu không có gì khác xảy ra trước khi tiền thưởng kết thúc

1

Bạn có thể sử dụng cftry-Catch để ghi lại lỗi và hiển thị thông báo tùy chỉnh cho người dùng của bạn. Phải nói rằng, các giá trị được đặt cho số lượng tham số yêu cầu POST tối đa là bao nhiêu, Kích thước tối đa của dữ liệu bài đăng, Ngưỡng yêu cầu và Bộ nhớ điều tiết yêu cầu . Bạn đang sử dụng CF Std hoặc Ent và phiên bản ColdFusion là gì?


Không thể bắt lỗi với cftry. Kết nối bị treo mà không bao giờ thực hiện dòng đầu tiên của cfm. (Tôi đặt một cflog ở đó để tìm hiểu xem nó có đi xa đến vậy không.) Tôi sẽ thêm một số thông tin phiên bản vào câu hỏi.

Thông báo lỗi "Tệp quá lớn" thường được máy chủ web ném, không phải ColdFusion. Nếu bạn không tìm thấy bất cứ điều gì trong nhật ký CF, thì vui lòng kiểm tra nhật ký Trình xem sự kiện. Chắc chắn sẽ có một số tài liệu tham khảo cho lỗi. Bạn đã thử "LimitRequestBody" từ Apache . Bạn cũng có thể chỉ định kích thước tệp ở cuối máy chủ web.
Anit Kumar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.