Tại sao bạn lại đặt MaxKeepAliveRequests thành bất cứ thứ gì nhưng không giới hạn?


11

Apache KeepAliveTimeouttồn tại để đóng kết nối duy trì nếu yêu cầu mới không được đưa ra trong một khoảng thời gian nhất định. Với điều kiện người dùng không đóng trình duyệt / tab của mình, thời gian chờ này (thường là 5-15 giây) là thứ cuối cùng sẽ đóng hầu hết các kết nối duy trì và ngăn chặn tài nguyên máy chủ bị lãng phí bằng cách giữ các kết nối vô thời hạn.

Bây giờ, lệnh MaxKeepAliveRequestsnày đặt giới hạn số lượng yêu cầu HTTP mà một kết nối TCP duy nhất (còn mở do KeepAlive) sẽ phục vụ. Đặt điều này 0có nghĩa là số lượng yêu cầu không giới hạn được cho phép.

Tại sao bạn lại đặt cái này thành bất cứ thứ gì ngoài "không giới hạn"? Với điều kiện một khách hàng vẫn đang tích cực thực hiện các yêu cầu, có hại gì khi để chúng xảy ra trên cùng một kết nối không? Khi đạt đến giới hạn, các yêu cầu vẫn đến, chỉ trên một kết nối mới.

Cách tôi nhìn thấy nó, không có điểm nào trong việc giới hạn điều này. Tôi đang thiếu gì?

Câu trả lời:


4

Về cơ bản, vì Apache không được xây dựng cho nó. Vấn đề là sử dụng bộ nhớ máy chủ. Trong nhiều cấu hình, việc tạo nội dung được thực hiện trong cùng một quy trình như phân phối nội dung, vì vậy mỗi quy trình sẽ phát triển theo kích thước của thứ lớn nhất mà nó xử lý. Hình dung một quá trình mở rộng lên 64mb vì một tập lệnh php nặng, sau đó quá trình cồng kềnh đó đang ngồi và phục vụ các tệp tĩnh. Bây giờ nhân số đó với 100. Ngoài ra, nếu có rò rỉ bộ nhớ ở bất cứ đâu, các quy trình sẽ phát triển không giới hạn.

Các cài đặt cố định phải được cân bằng dựa trên loại nội dung và lưu lượng truy cập của bạn. Nói chung, cấu hình tối ưu có MaxKeepAliveRequests cao (100-500) và KeepAliveTimeout thấp (2-5) để giải phóng chúng nhanh chóng.


2

Tôi biết đây là một câu hỏi cũ, nhưng tôi đã thực hiện một số gỡ lỗi và có vẻ như (và điều này không chỉ đúng với Apache) MaxKeepAliveRequestshoạt động độc lập KeepAliveTimeout.

Có nghĩa là, chỉ thị hết thời gian chờ chỉ tính vào các kết nối liên tục không hoạt động (không đọc hoặc ghi) - nếu bạn tiếp tục yêu cầu dưới thời gian chờ, bạn hầu như có thể thực hiện một lượng yêu cầu không giới hạn trên cùng một kết nối.

Điều này có thể không tốt cho một số lý do bao gồm các kết nối tcp chạy dài bị giết ngẫu nhiên? Trong mọi trường hợp, các máy khách http không phải là ngu ngốc và có thể xử lý MaxKeepAliveRequestscài đặt "thấp" khá tốt, ví dụ như ngôn ngữ lập trình tương đối dễ dàng để phát hiện nếu kết nối tcp đã bị máy chủ đóng và do đó kết nối lại với nó. Ngoài ra, hầu hết các máy khách http sẽ tự đặt giới hạn (ví dụ: các trình duyệt sẽ đóng kết nối duy trì sau 300 giây hoặc lâu hơn).


1

Một lý do sẽ là để cân bằng tải. Khi kết nối liên tục hoặc http 1.1 được thực hiện, bộ cân bằng tải sẽ không di chuyển nó đến một máy chủ mới cho đến khi nó đóng lại. Nếu bạn có một khách hàng thực hiện một số lượng lớn yêu cầu qua một kết nối của họ, bạn có thể không có được sự cân bằng tốt giữa các máy chủ.


Nhưng tại sao điều đó lại quan trọng? Đối với tôi, dường như không mong muốn khi lan truyền một kết nối của một người dùng ra nhiều máy chủ. Cân bằng tải là để xử lý số lượng người dùng cao, không phải kết nối từ một người dùng. Trên thực tế - nếu một người dùng đang sử dụng dịch vụ, bạn muốn sử dụng một máy chủ duy nhất (nơi họ sẽ tự giới hạn tỷ lệ một cách hiệu quả).
Jonathon Reinhart

1
Điểm tốt. Một vài suy nghĩ: 1. bất kỳ ai khác trên máy chủ đó cũng sẽ bị tấn công. 2. Đối với các bộ cân bằng tải hoạt động dưới mức HTTP: khi bạn đưa máy chủ ra khỏi nhóm cân bằng tải, nó không đóng kết nối HTTP hiện có. Điều đó làm cho việc di chuyển mọi người đến một máy chủ khác chỉ khó hơn với bộ cân bằng tải. Lý do 2 là cách tôi truy cập trang này trong khi tìm kiếm để xem mọi người nói gì về thông số này.
dtauzell

1
Lý do thứ ba: nếu máy chủ / ứng dụng của bạn rơi vào trạng thái xấu và lỗi này, việc ghim này có thể khiến tất cả các yêu cầu bị lỗi cho đến khi tình huống được khắc phục, trong khi nếu bạn giới hạn số lượng chúng có cơ hội được cân bằng với máy chủ mới .
dtauzell

Tôi đã không bắt gặp một bộ cân bằng tải hoạt động như thế này. Bộ cân bằng tải thường có "tham số stickiness, xác định xem tất cả các yêu cầu của máy khách (được xác định bởi IP chẳng hạn) trong phiên hiện tại có nên được chuyển đến cùng một luồng hay lan truyền giữa các luồng ngược hay không. Tùy chọn nào hữu ích tùy thuộc vào ứng dụng đang chạy trên upstreams.
Manuel

1

Một phần, để giữ cho một người dùng duy nhất không ăn cắp tất cả các khe kết nối. Không có giới hạn, một khách hàng độc hại hoặc viết kém có thể chiếm lấy mọi kết nối có sẵn và giữ chúng mãi mãi. Tuy nhiên, đây không phải là một sự giảm thiểu lớn cho điều đó, so với một cái gì đó như giới hạn kết nối trên mỗi IP.

Chủ yếu là cân bằng tải, nhưng đặc biệt liên quan đến bảo trì. Nếu bạn muốn đưa máy chủ ngoại tuyến, bạn thả nó xuống 0 kết nối nhưng cho phép các kết nối hiện có kết thúc trong một khoảng thời gian. Đặt giới hạn về số lượng yêu cầu giữ có nghĩa là cuối cùng người dùng sẽ duyên dáng tạo một kết nối mới và được chuyển đến một máy chủ back-end mới. Có lẽ một số cách để báo hiệu cho máy chủ rằng nó nên ngừng chấp nhận các khoản giữ lại hoàn toàn trong quá trình thoát nước sẽ còn tốt hơn, nhưng cho đến nay tôi biết một tính năng như vậy không tồn tại.

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.