Ini adalah Pertanyaan Canonical tentang memilih Apache httpd MPM yang tepat.
Saya sedikit bingung antara MPM berbeda yang ditawarkan oleh Apache - 'pekerja', 'acara', 'prefork', dll.
Apa perbedaan utama di antara mereka, dan bagaimana saya bisa memutuskan mana yang terbaik untuk penempatan yang diberikan?
apache-2.2
httpd
mpm-worker
mpm-prefork
Tiffany Walker
sumber
sumber
Jawaban:
Ada sejumlah modul MPM (Multi-Processing Modules), tetapi sejauh ini yang paling banyak digunakan (setidaknya pada platform * nix) adalah tiga yang utama:
prefork
,worker
, danevent
. Pada dasarnya, mereka mewakili evolusi dari server web Apache, dan berbagai cara server telah dibangun untuk menangani permintaan HTTP dalam batasan komputasi waktu selama sejarahnya yang panjang (dalam istilah perangkat lunak).prefork
mpm_prefork
adalah .. yah .. itu kompatibel dengan semuanya. Ini memutar sejumlah proses anak untuk melayani permintaan, dan proses anak hanya melayani satu permintaan pada suatu waktu. Karena ada proses server yang duduk di sana, siap untuk bertindak, dan tidak perlu berurusan dengan marshaling, itu sebenarnya lebih cepat daripada MPM berulir yang lebih modern ketika Anda hanya berurusan dengan satu permintaan pada satu waktu - tetapi permintaan bersamaan menderita, karena mereka dibuat untuk mengantri sampai proses server gratis. Selain itu, mencoba meningkatkan dalam proses anak prefork, Anda akan dengan mudah menyedot beberapa RAM serius.Mungkin tidak disarankan menggunakan prefork kecuali Anda membutuhkan modul yang tidak aman.
Gunakan jika: Anda memerlukan modul yang rusak ketika utas digunakan, misalnya
mod_php
. Bahkan kemudian, pertimbangkan untuk menggunakan FastCGI danphp-fpm
.Jangan gunakan jika: Modul Anda tidak akan pecah dalam threading.
worker
mpm_worker
menggunakan threading - yang merupakan bantuan besar untuk konkurensi. Pekerja memutar beberapa proses anak, yang pada gilirannya spin off thread anak; mirip dengan prefork, beberapa thread cadangan tetap siap jika memungkinkan, untuk melayani koneksi yang masuk. Pendekatan ini jauh lebih baik pada RAM, karena jumlah thread tidak memiliki pengaruh langsung pada penggunaan memori seperti jumlah server di prefork. Ini juga menangani konkurensi jauh lebih mudah, karena koneksi hanya perlu menunggu utas gratis (yang biasanya tersedia) daripada server cadangan di prefork.Gunakan jika: Anda menggunakan Apache 2.2, atau 2.4 dan Anda menjalankan terutama SSL.
Jangan gunakan jika: Anda benar-benar tidak bisa salah, kecuali Anda membutuhkan prefork untuk kompatibilitas.
Namun, perhatikan bahwa tapak terpasang ke koneksi dan bukan permintaan - yang berarti bahwa koneksi yang tetap hidup selalu menahan utas sampai ditutup (yang bisa lama, tergantung pada konfigurasi Anda). Itulah sebabnya kami memiliki ..
event
mpm_event
sangat mirip dengan pekerja, secara struktural; itu baru saja dipindahkan dari status 'eksperimental' ke 'stabil' di Apache 2.4. Perbedaan besar adalah bahwa ia menggunakan utas khusus untuk menangani koneksi yang tetap hidup, dan menyerahkan permintaan ke utas anak hanya ketika permintaan telah benar-benar dibuat (memungkinkan utas tersebut untuk membackup kembali segera setelah permintaan selesai). Ini bagus untuk konkurensi klien yang tidak selalu aktif pada satu waktu, tetapi membuat permintaan sesekali, dan ketika klien mungkin memiliki batas waktu keep-live yang panjang.Pengecualian di sini adalah dengan koneksi SSL; dalam hal ini, ia berperilaku identik dengan pekerja (menempelkan koneksi yang diberikan ke utas yang diberikan sampai koneksi ditutup).
Gunakan jika: Anda menggunakan Apache 2.4 dan menyukai utas, tetapi Anda tidak suka utas menunggu koneksi yang menganggur. Semua orang suka utas!
Jangan gunakan jika: Anda tidak menggunakan Apache 2.4, atau Anda perlu prefork untuk kompatibilitas.
Dalam dunia slowloris , AJAX, dan browser saat ini yang suka multiplex 6 koneksi TCP (dengan tetap-hidup, tentu saja) ke server Anda, concurrency adalah faktor penting dalam membuat skala dan skala server Anda dengan baik. Sejarah Apache telah mengikatnya dalam hal ini, dan sementara itu benar-benar masih tidak sebanding dengan orang-orang seperti nginx atau lighttpd dalam hal penggunaan sumber daya atau skala, jelas bahwa tim pengembangan bekerja untuk membangun server web yang masih relevan di dunia konklusi permintaan tinggi saat ini.
sumber
The improved connection handling does not yet work for certain connection filters, in particular SSL. For SSL connections, this MPM will fall back to the behaviour of the worker MPM and reserve one worker thread per connection.
Berikut ini penjelasan yang bagus tentang cara kerjanya dengan gif:
https://www.datadoghq.com/blog/monitoring-apache-web-server-performance/
Secara singkat: jika Anda menggunakan 2.4 dan Anda memerlukan httpd sebagai proxy terbalik (dispatcher) maka pilihan Anda adalah MPM Peristiwa
sumber
Pada Februari 2018, dokumentasi Apache 2.4 untuk Acara MPM menyatakan bahwa menggunakan Apache sebagai proksi akan menjaga "penanganan koneksi yang ditingkatkan" sejak 2.4.24 agar tidak berfungsi sebagaimana dirancang. Lihat bagian Keterbatasan .
Masalahnya adalah, sebagai proksi, pekerja tidak dapat mengetahui di mana akhir respons, dan akan dipaksa untuk menunggu sampai seluruh respons terlihat sebelum mengembalikan kontrol ke pendengar.
Untuk alasan ini, tampaknya menggunakan model Worker mungkin yang terbaik untuk saat apache digunakan sebagai proksi. Tidak terlalu jelas bagi saya jika ada keuntungan untuk model acara di lingkungan proxy, tapi mungkin ada.
sumber
Sebagian besar tergantung pada modul Apache yang ingin Anda gunakan. Saya pikir pekerja pada umumnya merupakan pilihan default, tetapi beberapa modul (yang lebih tua) memerlukan forking dan bergantung pada prefork.
Jika Anda tidak memiliki preferensi, saya sarankan Anda pergi dengan ketergantungan yang disukai dari distribusi OS Anda. Ubuntu misalnya akan secara default menginstal mpm-pekerja ketika Anda menginstal Apache2.
sumber