Apache vs Nginx

29

Saya telah menyelidiki perbedaan antara Apache dan Nginx baru-baru ini dan saya bingung tentang yang harus saya pilih.

Saya telah melakukan pencarian tetapi tidak ada perbandingan yang pasti antara keduanya dan saya bertanya-tanya apakah seseorang di sini dapat memberikan pandangan mereka tentang perbedaan antara keduanya.

Pengetahuan saya saat ini memungkinkan saya untuk memahami bahwa mod_php lebih cepat dan lebih aman daripada fastcgi namun Apache jauh lebih buruk ketika datang ke koneksi simultan dan konsumsi memori.

Situs saya menggunakan banyak polling panjang tetapi memiliki basis web non AJAX (yaitu Apache dengan polling panjang di atasnya).

Solusi asli saya untuk masalah memori Apache adalah mengirim polling panjang melalui node.js dan kemudian mendapatkan node.js untuk mengakses Apache setiap 2 detik dalam hal ini Apache tidak akan memiliki koneksi terbuka tetapi sebaliknya node.js akan. Saya menyadari bahwa ini mungkin tidak cukup baik dan saya sedang mencari solusi yang berbeda. Saya masih tertarik apakah ide orisinal saya akan berhasil.

Jadi mana yang lebih baik untuk web modern? Apache atau Nginx?

Pembaruan: Semua saran yang diberikan baik dan valid. Saya telah menggunakan ide kedua yang asli yaitu menggunakan server Nginx lengkap. Saya puas bahwa menjadi dedicated server saya tidak dapat menderita masalah keamanan dari fastcgi dan karena skrip pemungutan suara panjang saya perlu ditulis dalam PHP saya memerlukan server yang dapat menangani koneksi simultan beban tinggi dan Apache tidak bisa melakukan itu tidak peduli berapa banyak Saya mengubah struktur itu masih akan memori haus.

Saya telah menandai jawaban Martin F karena dia memberikan jawaban yang jelas dan lengkap untuk poin-poin pertanyaan saya sehingga saya merasa dia layak mendapatkan tanda tersebut, namun, ketiga jawaban itu baik dan valid dan paling pasti akan melihat menggunakan proxy terbalik untuk situs lain yang saya miliki karena saya baru saja menemukan sesuatu yang sangat sangat sangat kool yang dapat dilakukan Nginx dalam proxy.

Terima kasih,

Sammaye
sumber

Jawaban:

28

Anda tampaknya memiliki beberapa kesalahpahaman yang saya rasa perlu ditangani.

Pertama-tama, mod_php hanya sedikit lebih cepat, semua tes saya telah menunjukkan bahwa perbedaannya sangat kecil sehingga tidak layak diperhitungkan. Saya juga ragu bahwa aspek keamanan relevan bagi Anda karena Anda tampaknya melihat server khusus dan mod_php benar-benar hanya memiliki keunggulan dalam lingkungan bersama - pada kenyataannya, dalam lingkungan khusus php-fpm akan memiliki keuntungan sebagai PHP dan server web Anda sekarang berjalan sebagai proses yang berbeda, dan itu bahkan tidak memperhitungkan faktor dalam opsi logging yang mengagumkan di php- fpm seperti log lambat.

Jika dunia hitam dan putih saya akan mengatakan pergi dengan setup nginx murni dan kompilasi php dengan php-fpm. Lebih realistis jika Anda sudah memiliki Apache yang berfungsi maka jadikan nginx sebagai proxy terbalik untuk apache dan Anda mungkin menghemat beberapa jam waktu pengaturan dan perbedaan dalam kinerja akan kecil.

Tapi mari kita asumsikan dunia hitam dan putih untuk sesaat, karena ini membuat pengaturan yang jauh lebih dahsyat. Anda melakukan nginx + php-fpm untuk server web Anda. Untuk menyelesaikan unggahan Anda menggunakan modul unggah dan unggah modul kemajuan untuk nginx. Ini berarti bahwa server web Anda menerima unggahan dan meneruskan jalur file ke PHP setelah selesai, sehingga file tidak perlu dialirkan antara nginx dan PHP melalui protokol fastcgi, manis. (Saya memiliki ini dalam pengaturan langsung dan itu berfungsi dengan baik, btw!)

Untuk pengguna yang mengunduh Anda menggunakan fitur nginxs x-send-file-like yang disebut x-accel-redirect, pada dasarnya Anda melakukan otentikasi Anda dalam PHP dan mengatur header yang diambil nginx dan mulai mentransfer file itu. PHP mengakhiri eksekusi dan server web Anda menangani transfer, manis! (Sekali lagi, saya punya ini dalam pengaturan langsung dan itu bekerja dengan baik)

Untuk mendistribusikan file di server atau operasi lama berjalan lain kita menyadari bahwa PHP tidak benar-benar terbaik cocok untuk ini, jadi kami memasang gearman, yang merupakan server pekerjaan yang dapat mendistribusikan pekerjaan antara pekerja pada server yang berbeda, para pekerja ini dapat ditulis dalam setiap bahasa. Oleh karena itu Anda dapat membuat pekerja distribusi dan menelurkan 5 dari mereka menggunakan total 200 KB memori, bukan 100 MB yang akan digunakan PHP. Manis. (Saya juga menjalankan ini secara langsung, jadi itu semua sebenarnya mungkin)

Jika Anda belum mengambilnya, saya pikir banyak masalah Anda tidak berhubungan dengan server web Anda sama sekali, Anda hanya berpikir seperti itu karena Apache memaksanya untuk berhubungan dengan server web Anda karena strukturnya, seringkali ada alat yang jauh lebih baik untuk pekerjaan itu daripada PHP dan PHP adalah bahasa yang mengetahui hal ini dan memberikan opsi yang sangat baik untuk pekerjaan yang tidak dimuat tanpa harus meninggalkan PHP.

Saya sangat merekomendasikan nginx, tetapi saya juga berpikir Anda harus melihat opsi lain untuk masalah Anda yang lain, jika Anda memiliki masalah penskalaan atau kinerja maka jangan ragu untuk menulis saya. Saya tidak tahu apakah Anda dapat mengirim pesan melalui sini tetapi jika tidak, tulis saya di [email protected] karena saya tidak menguntit kesalahan server untuk apa pun yang tidak ditandai dengan nginx. :)

Martin Fjordvald
sumber
1
Sialan itu benar-benar beres :) terima kasih itulah penjelasan yang saya cari. Saya pikir saya cukup dijual untuk belajar Nginx sekarang karena Apache akan tersedak dan mati menggunakan situs saya. Untungnya itu terlihat sangat mudah untuk dipindahkan. Maksud saya orang-orang di node.js telah mengatakan menulis sebagian besar hal itu dan hanya polling kelas sesi php Anda jika Anda benar-benar perlu (yang saya lakukan kecuali ada cara untuk mendeteksi ketika pengguna menutup windows mereka: P). Ya saya sedang menjalankan server pertanian besar sehingga mengetahui bahwa tidak ada ancaman keamanan membantu ton, terima kasih atas penjelasannya :)
Sammaye
Saya telah melihat ini: joeandmotorboat.com/2008/02/28/… dan ini: blog.webfaction.com/a-little-holiday-present dan itu benar-benar membuat saya bercanda dengan pemikiran bisa lama polling ke hati saya konten benar-benar Bukan masalah memori tunggal tidak seperti Apache :)
Sammaye
Tunggu, jadi katamu, aku bisa membuat pekerja multithread di java dan php bisa menyelesaikannya dengan sempurna? Maksud saya masalah terbesar yang saya lihat adalah server karena saya mendapatkan masalah memori besar dengan Apache menggunakan polling panjang, yang umum ... ofc diperbaiki oleh Nginx.
Sammaye
1
Pada dasarnya ya, saya memiliki pekerja distribusi file yang ditulis dalam C, menggunakan ekstensi gearman untuk PHP saya mengirim pekerjaan distribusi ke server pekerjaan gearman dan mengirimkannya ke pekerja, yang dapat ditulis dalam bahasa apa pun; PHP, Java, C, dll. Pekerja ini kemudian melakukan pekerjaannya dan melaporkan status kembali ke tukang gigi, yang melapor kembali ke PHP. (kecuali pekerjaan latar belakang dipilih, dalam hal ini PHP berakhir tanpa menunggu untuk itu)
Martin Fjordvald
2
Saya tahu ini adalah posting lama tetapi saya harus mengatakan, ini adalah salah satu posting paling informatif yang saya temukan tentang masalah nginx vs apache. Thans Martin, +1.
Akoi Meexx
5

Saya menyarankan menjalankan nginx sebagai proxy terbalik. Ini akan menangani semua file statis & cache Anda (di mana itu jauh lebih cepat daripada Apache / kurang memori overhead) dan kemudian meneruskan semua permintaan untuk konten dinamis ke Apache.

Greg Annandale
sumber
Ya inilah yang tampaknya dilakukan kebanyakan orang, saya pasti harus melihat ini :)
Sammaye
1
Ingatlah untuk menginstal mod_rpaf untuk Apache sehingga Anda dapat melewati alamat IP klien untuk keperluan logging (jika tidak, log Apache akan menampilkan semua permintaan dari 127.0.0.1), tambahkan yang berikut ke dalam nginx config: proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
Greg Annandale
Saya bertanya-tanya satu hal sebelum saya coba malam ini. Jika saya melakukan routing melalui Nginx ke Apache yang melayani PHP saya, apakah itu berarti bahwa polling panjang masih akan memiliki masalah yang sama dengan Apache atau apakah memanggilnya dalam proxy terbalik membuat Apache bertindak berbeda dalam beberapa cara?
Sammaye
1

Saya tidak begitu yakin mod_php lebih cepat dari alternatifnya, di mana Anda membaca ini? Saya telah melakukan beberapa pengujian lab dengan nginx + php-fpm, dan dari apa yang saya ukur itu mengalahkan setiap pengaturan lainnya.

Lihatlah pengaturan ini: http://interfacelab.com/nginx-php-fpm-apc-awesome/

Saya telah mengaturnya hampir sama, kecuali bahwa saya menggunakan paket PHP dari http://www.dotdeb.org/ - yang menyertakan paket php-fpm dan skrip init yang siap digunakan. Saya tidak menggunakan memecache atau syck.

pauska
sumber
stackoverflow.com/questions/78108/… mendapatkannya dari sini dan saya telah memeriksa manual php dan ia mengatakan bahwa php_mod memberikan keuntungan signifikan dibandingkan versi cgi. Pengaturan Anda terlihat bagus. Terlihat sangat mudah juga. Saya akan memeriksanya :)
Sammaye
2
Ini menyatakan bahwa CGI jauh lebih lambat daripada modul builtin - bukan FastCGI :)
pauska
1
Nah - jika Anda khawatir tentang proses PHP mati (atau waktu habis) maka FastCGI (atau PHP-FPM) adalah cara untuk pergi. Ini dapat membunuh prosesi anak yang mati tanpa mengganggu kegiatan lainnya.
pauska
1
Iya nih. Atau, yah, itu tergantung. Berapa banyak (maksimum) jumlah permintaan lambat yang akan Anda proses pada saat yang sama? Tetapkan utas PHP FPM maks untuk itu, ditambah jumlah cgi "cepat" yang Anda inginkan. Saya pernah mendengar tentang orang yang menjalankan 200 anak PHP-FPM di server dengan RAM 4GB, jadi saya tidak akan terlalu khawatir tentang hal ini jika saya jadi Anda. Versi berikutnya dari PHP (5.3.3) akan menyertakan PHP-FPM menurut standar, di mana ada juga mesin adpatif yang disertakan - ia akan menskalakan berdasarkan berapa banyak permintaan Anda yang tertunda.
pauska
1
Saya akan dengan mudah menjalankan lebih dari beberapa server (mungkin hingga 10) tetapi jika saya dapat memenuhi 200 permintaan yang dapat disurvei lama pada server 4GB ini seharusnya hampir setengah dari 20 server saya akan perlu menjalankan Apache. hmmmm ... Saya perlu menguji ini malam ini
Sammaye