Cài đặt nào: Công nhân Apache hoặc Prefork? Những lợi thế (dis-) của mỗi là gì?


55

Dựa trên các mô tả cho cả MPM PreforkWorker , có vẻ như loại prefork có phần lỗi thời, nhưng tôi thực sự không thể tìm thấy một so sánh thích hợp của hai loại.

Những gì tôi muốn biết:

  • Sự khác biệt giữa hai phiên bản là gì?
  • Những lợi thế (dis-) của từng loại máy chủ là gì?
  • Có bất kỳ hướng dẫn cơ bản về loại để lựa chọn dựa trên các điều kiện?
  • Có sự khác biệt hiệu suất lớn giữa hai?

Câu trả lời:


40

Như các tài liệu nói, bạn nên sử dụng MPM prefork nếu bạn cần tránh xâu chuỗi để tương thích với các thư viện không an toàn luồng. Thông thường, bất kỳ mô-đun Apache không tầm thường nào ( mod_php- hay chính xác hơn là vô số các phần mở rộng và thư viện mà nó liên kết đến - là ví dụ chính tắc) có một số loại thư viện không an toàn luồng (hoặc không có luồng- mã an toàn trong đó), vì vậy trừ khi bạn đang sử dụng một bản cài đặt Apache đẹp mắt, tôi sẽ sử dụng MPM prefork.


3
Tôi đã đề nghị MPM worker, trừ khi bạn đang chạy PHP. Worker là MPM được đề xuất từ ​​apache, và cho hiệu suất tốt hơn và chi phí thấp hơn. Chỉ có nhà phát triển PHP chưa bao giờ nghe nói về an toàn luồng mà bạn cần sử dụng prefork.
David Pashley

16
PHP đã được chủ đề an toàn trong một thời gian rất dài. Họ chỉ đề xuất việc sử dụng các trình xử lý trước vì họ không thể kiểm soát những gì các thư viện khác làm. Thoát khỏi đổ lỗi PHP cho các nhà phát triển khác không tương tác.
Alister Bulman

3
PHP có thể là luồng an toàn (mặc dù tôi nghi ngờ về nó) nhưng tất cả các thư viện mà nó liên kết đến chắc chắn là không. Ở đây chúng tôi chạy một vài ứng dụng PHP khá lớn và cứ sau vài tháng chúng tôi cố gắng chuyển từ prefork sang worker, nhưng chúng tôi nhận được dữ liệu bị hỏng ngay lập tức.
Alexandar Ivanisevic

5
Ít nhất chức năng thay đổi biến ENV sẽ không được chủ đề an toàn, setlocal php.net/manual/en/function.setlocale.php là một ví dụ phổ biến về điều đó.
bán kính

4
Một lưu ý: Những vấn đề này không áp dụng nếu PHP được đính kèm, ví dụ như php-fpmthông qua FastCGI. Sau đó, MPM worker vẫn ổn - sau đó fpm sẽ chạy mọi yêu cầu PHP trong một quy trình riêng trong khi Apache có thể chạy luồng. Vấn đề an toàn PHP-Thread chỉ ngăn bạn sử dụng mod_php, nó chạy PHP bên trong quy trình Apache.
mschuett

13

Giải pháp cổ điển để chạy các tiện ích mở rộng không an toàn trong khi phục vụ số lượng lớn (> 100) kết nối đồng thời là chạy PHP trên fastCGI (mod_fcgid, mô-đun apache gốc) và yêu cầu động proxy từ một phiên bản apache chạy MPM của Worker.

Điều này sẽ cho phép bạn mở rộng từ vài trăm đến> 1000 kết nối đồng thời với dung lượng bộ nhớ khiêm tốn (4 ~ 8GB) khi phục vụ kết hợp nội dung tĩnh và động.

Tất nhiên, bạn cũng nên điều tra các giải pháp bộ đệm ẩn phía trước như là một phần của việc triển khai tổng thể của bạn (memcached, véc ni).

Ngoài ra, nâng cấp lên apache 2.4 và MPM sự kiện riêng của nó , xử lý đồng thời theo cách cải tiến hơn nhiều (các luồng được loại bỏ khi kết nối, không chờ đợi để được thăm dò.)


bạn có thể mở rộng về sự kiện mpm bình luận? Làm thế nào để nó chồng lên so với mpm-worker?
Sirex

Mặc dù MPM worker đã dựa trên luồng và do đó khởi động nhanh hơn và nhẹ hơn để chạy, MPM sự kiện không còn thăm dò ổ cắm - nó được thông báo về hoạt động; do đó, "sự kiện".
thích nghi

Vì vậy, nó nên hoạt động tốt hơn trên các trang web lưu lượng truy cập cao (13k / giây)?
Sirex

6

Đã khoảng 3 năm kể từ khi câu hỏi được đăng nhưng tôi khuyên bạn nên đi với MPM worker thay vì pre-fork ngay cả khi sử dụng PHP, để có hiệu suất tốt hơn.

Đối với sự khác biệt, pre-fork không được phân luồng do đó máy chủ sẽ tạo ra một quy trình cho mỗi yêu cầu của khách hàng (nó dự đoán trước các yêu cầu mới để việc không ăn vào thời gian đáp ứng). Vì các yêu cầu là máy chủ trong một quy trình riêng biệt, điều này thường đánh thuế bộ nhớ và CPU của bạn nhiều hơn. Công nhân mang đa luồng nhẹ hơn và sử dụng bộ nhớ tốt hơn.


2

Đây là một cái gì đó rất đặc biệt với những gì bạn đang phục vụ. Nếu bạn đang thực hiện nhiều kết nối tĩnh nhỏ, các luồng sẽ nhẹ hơn và nhanh hơn. Nếu bạn chỉ có một vài ứng dụng lớn liên tục xuất hiện, prefork có thể có lợi thế do sự trưởng thành và ổn định. Tại sao không chỉ thiết lập những gì bạn cần, kiểm tra một cái, trao đổi mô-đun MPM, thử lại, xem cái nào phù hợp với bạn hơn?


Bạn không thể tùy ý "trao đổi" MPM trong apache 2.2; nó được thiết lập tại thời gian biên dịch.
thích nghi

Bạn có thể với apt hoặc RPM. Debian có một số gói Apache 2 khác nhau, tùy thuộc vào kiểu bạn thích.
Brendan Byrd

1

nhu cầu về loại và lưu lượng truy cập bạn sẽ có. Và cũng trước tiên bạn cần hiểu sự khác biệt chính giữa prefork và worker. Hy vọng bài viết dưới đây sẽ giúp bạn tìm ra! http://slashroot.in/how-is-nginx-different-from-apache


2
Chúng tôi thích câu trả lời để có nội dung, không liên kết đến nội dung. Nếu bạn có thể cung cấp một bản tóm tắt về những gì trên mục tiêu liên kết, đó là cách thực hành tốt nhất. Liên kết thối xảy ra.
sysadmin1138

1
Câu hỏi là về Apache (nginx không phải là apache) và giá trị tương đối của prefork hoặc thread (nginx không sử dụng)
symcbean
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.