Tôi có nên kích hoạt keepAlive trong Apache2 không?


25

Trong bất kỳ cài đặt mặc định nào, Apache 2 đều tắt keepAlive, nhưng nhìn vào một máy chủ khác, mô-đun keepAlive đã được bật.

Vì vậy, làm thế nào để tôi biết nếu keepAlive phù hợp với tôi? Tôi có thể tìm thấy một số ví dụ tốt về cấu hình này ở đâu?

Câu trả lời:


31

Đã có 2 câu trả lời hay, nhưng vấn đề thực tế có lẽ quan trọng nhất vẫn chưa được đề cập.

Trước hết, OP có thể muốn đọc 2 câu trả lời trước và bài đăng trên blog nhỏ này để hiểu những gì cần lưu ý. (Tác giả không nói chi tiết về TCPI / IP "càng nhanh" kết nối mở càng lâu. Đúng là các kết nối lâu dài được hưởng lợi từ việc mở rộng cửa sổ IP , nhưng hiệu quả không đáng kể trừ khi các tệp là lớn, hoặc sản phẩm có độ trễ băng thông lớn bất thường.)

Đối số lớn chống lại HTTP Keepalive khi sử dụng Apache là nó chặn các quy trình Apache. Tức là một khách hàng sử dụng thủ tục sẽ ngăn quá trình Apache của anh ta phục vụ bất kỳ khách hàng nào khác, cho đến khi khách hàng đóng kết nối hoặc hết thời gian chờ. Trong cùng một khoảng thời gian, cá thể Apache này có thể đã phục vụ nhiều kết nối khác.

Bây giờ, một cấu hình Apache rất phổ biến là MPM Prefork và trình thông dịch PHP / Perl / Python và mã ứng dụng trong ngôn ngữ được đề cập. Trong trường hợp này, mỗi quy trình Apache là "nặng" theo nghĩa là nó chiếm vài megabyte RAM (Apache được liên kết với trình thông dịch và mã ứng dụng). Điều này, cùng với việc chặn từng cá thể Apache được giữ lại, là không hiệu quả.

Một cách giải quyết chung là sử dụng 2 máy chủ Apache (cả hai trên cùng một máy chủ vật lý hoặc trên 2 máy chủ, nếu cần) với các cấu hình khác nhau:

  • một "nặng" với mod_php (hoặc bất kỳ ngôn ngữ lập trình được sử dụng) cho nội dung động, với keepalives tắt .
  • một "nhẹ" với một bộ mô-đun tối thiểu, để phục vụ nội dung tĩnh (hình ảnh, css, js, v.v.), với các thủ tục trên .

Sau đó, bạn có thể mở rộng phân tách nội dung động và tĩnh này khi cần , ví dụ:

  • sử dụng máy chủ điều khiển sự kiện cho nội dung tĩnh, chẳng hạn như nginx .
  • sử dụng CDN cho nội dung tĩnh (có thể thực hiện tất cả nội dung tĩnh phục vụ cho bạn)
  • triển khai bộ nhớ đệm của nội dung tĩnh và / hoặc động

Một cách tiếp cận khác liên quan đến việc tránh chặn Apache là sử dụng bộ cân bằng tải với xử lý kết nối thông minh hơn, chẳng hạn như Perlbal .

.. và nhiều hơn nữa. :-)


2
Những câu trả lời này vẫn còn có liên quan 8 năm sau?
TheStoryCoder

Có, vẫn có liên quan nếu bạn đang sử dụng MPM prefork. Lưu ý rằng Apache httpd 2.4 (ví dụ: trong RHEL7) sử dụng KeepAlive On theo mặc định (nhưng không liệt kê rõ ràng trong cấu hình của nó - ít nhất là trong RHEL7).
Cameron Kerr

5

Keepalives có thể tốt trong một số trường hợp, họ có thể rất xấu ở những người khác. Chúng làm giảm thời gian và nỗ lực thiết lập kết nối mới, nhưng chúng liên kết tài nguyên máy chủ trong suốt thời gian chờ. Ví dụ:

  • Các trang có nhiều đối tượng nhỏ, khách hàng đang quay số - nên giữ nguyên.
  • Các trang có một vài đối tượng lớn - keepalive sẽ không phải là một lợi thế.
  • Máy chủ có số lượng khách truy cập duy nhất rất cao - nên tắt máy (nếu không, các ổ cắm và luồng sẽ nằm trong bộ nhớ chờ hết thời gian chờ và không phục vụ khách hàng mới).

Như bạn có thể thấy, KeepAliveTimeout cũng sẽ đóng một vai trò lớn trong việc tối ưu hóa hiệu suất máy chủ của bạn.

Nhìn vào mô hình sử dụng của bạn và quyết định cho chính mình.


0

Bạn chắc chắn nên sử dụng KeepAlive On.

Xem:

http://httpd.apache.org/docs/2.0/mod/core.html#keepalive

Bằng cách đó, một kết nối TCP sẽ được trình duyệt sử dụng lại để gửi nhiều truy vấn. Thông thường một trang web có nhiều thành phần (trang HTML, mã javascript, hình ảnh). Miễn là các tài nguyên này nằm trong cùng một miền, do đó có thể được phục vụ bởi cùng một máy chủ, kết nối KeepAlive giúp tăng hiệu suất rất lớn do trình duyệt sẽ không phải thiết lập kết nối TCP mới.

Một trình duyệt thường mở khoảng 3 kết nối song song với một miền. Vì vậy, hãy nói rằng bạn có 18 đối tượng trong trang web của bạn. Trình duyệt sẽ mở 3 kết nối và nó sẽ tải xuống 6 đối tượng trong mỗi kết nối - sử dụng chế độ KeepAlive. Nếu không có KeepAlive, nó sẽ phải mở 18 kết nối TCP, rất chậm.

Hầu hết, hoặc tất cả các trình duyệt hiện đại đều tuân thủ HTTP / 1.1 vì vậy điều này sẽ chỉ hoạt động.

Một số proxy HTTP nhất định như Squid không tuân thủ HTTP / 1.1, nhưng dù sao họ cũng yêu cầu sử dụng kết nối KeepAlive.


Điều này chỉ từ xem xét phía khách hàng, trong khi tôi cho rằng việc sử dụng tài nguyên phía máy chủ cũng rất quan trọng.
Morgan Cheng

Sử dụng tài nguyên phía máy chủ quan trọng hơn độ trễ nhận thức của người dùng?
Yves Junqueira

1
Tôi cũng tin vào việc bật KeepAlive, tuy nhiên thời gian chờ 15 giây mặc định của Apache là quá hào phóng vì nó giữ cho các quy trình bị chặn quá lâu. Tôi thường đặt thời gian chờ là khoảng 2 giây, kết quả là KeepAlive được sử dụng trong khoảng một lần tải.
Martijn Heemels
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.