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.