Kapan saya harus beralih ke NGinx?

11

Saya memiliki server dengan beberapa domain dan aplikasi yang berjalan, semua melalui Apache. Semua baik-baik saja saat ini tetapi saya memiliki rencana untuk mengembangkan beberapa aplikasi web yang sangat intensif (menggunakan C ++ dengan CPPCMS), dimulai dengan server saya untuk pengujian, mungkin mendapatkan server terpisah hanya untuk aplikasi ini setelah siap.

Bagaimanapun, saya telah mendengar banyak tentang NGinx, yang tampaknya lebih berkinerja daripada Apache, jadi saya bertanya pada diri sendiri apakah layak bekerja dengannya untuk proyek baru itu. Itu tidak jelas dalam pikiran saya karena saya tidak tahu apa jenis bottleneck kinerja yang diperbaiki NGinx sebenarnya.

Saya bukan pengguna daya Apache, saya admin linux yang buruk dan saya tidak banyak mengembangkan aplikasi web (tapi saya punya gagasan). Saya sebagian besar didedikasikan untuk menulis perangkat lunak sehingga bagian server web kadang-kadang sangat tidak jelas bagi saya. Setiap kali saya harus mengkonfigurasi situs web melalui apach, saya perlu banyak waktu menjelajah dokumen untuk memastikan saya tidak merusak semuanya.

Yang sedang berkata, saya pikir saya menjadi jauh lebih baik di sisi ini tetapi masih membutuhkan saran. Saya telah melihat beberapa file konfigurasi nginx, dan itu tampaknya jauh lebih dapat dipahami daripada yang Apache, tapi mungkin saya salah?

Dari informasi yang saya kumpulkan, NGinx akan menjadi pilihan terbaik ketika Anda ingin load-balancing, jadi jika Anda memiliki aplikasi Anda tersebar di beberapa mesin, kan? Saat saya sedang memikirkan aplikasi saya untuk scalling (dan kinerja), sepertinya itu yang saya butuhkan, tapi mungkin saya perlu tahu lebih banyak tentang kapan itu menarik untuk pindah dari Apache ke NGinx. Apakah perlu juga beralih ke NGinx untuk semua aplikasi saya saat ini? Berapa biayanya? (Maksud saya, apakah mahal pada waktunya untuk beralih dari satu ke yang lain?) Dapatkah saya menggunakan Apache dan NGinx keduanya pada mesin yang sama tanpa masalah?

Catatan : Tolong jangan mendesak saya untuk menggunakan bahasa yang ditafsirkan alih-alih C ++, itu tidak terkait dengan pertanyaan. Lihat halaman alasan CPPCSM untuk melihat jenis aplikasi apa yang bisa mendapat manfaat darinya. Saya sangat memahami kekurangannya (dibandingkan dengan aplikasi di Ruby dan Python, yang sudah saya gunakan untuk webapp yang lebih haus daya) dan saya baik-baik saja dengan itu.

Klaim
sumber

Jawaban:

10

Beberapa poin:

Perbedaan utama antara Apache dan Nginx atau Lighttpd (yang secara pribadi sangat saya sukai) adalah arsitektur:

  1. Apache menangani satu koneksi per-proses atau per-utas (tergantung mod-XYZ)
  2. Nginx dan Lighttpd adalah single threaded handle multiple koneksi dalam satu event loop.

Hasil dari:

  1. Nginx dan Lighttpd berskala jauh lebih baik di bawah jumlah koneksi simultan yang tinggi, katakanlah dengan 1000 koneksi Apache akan hampir mati karena akan membutuhkan 1000 proses dalam mod-prefork atau 1000 thread pada mod-worker.

    Jika Anda berencana untuk menggunakan teknologi Comet di mana setiap koneksi membutuhkan koneksi HTTP jajak pendapat yang lama maka Apache tidak akan dapat diterima karena tidak skala dengan baik.

  2. Nginx dan Lighttpd mengkonsumsi lebih sedikit memori karena setiap koneksi memerlukan + - dua soket (HTTP dan FastCGI), buffer memori menengah dan beberapa keadaan, sedangkan Apache akan membutuhkan seluruh utas termasuk tumpukan dan hal lainnya.

Dari pengalaman pribadi saya dalam benchmark, saya melakukan Lighttpd (dan saya berasumsi Nginx juga) sedikit lebih cepat dengan backend FastCGI kemudian Apache tetapi ini untuk jumlah koneksi yang rendah.

Sekarang poin lain adalah ketika Anda ingin melakukan beberapa load-balancings menggunakan koneksi FastCGI.

Dalam arsitektur tradisional ada

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)
            /      |           |            |      \
         HTTP    HTTP         HTTP        HTTP     HTTP
         /         |           |            |         \
 Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   
  Server 2    Server 3     Server 4      Server 5     Server 6

Karena Apache menangani kumpulan proses yang masing-masing menjalankan mod-PHP (atau mode lainnya)

Saat Anda menggunakan CppCMS yang menangani pool sendiri, Anda dapat melakukan sesuatu yang berbeda:

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)    
                           Server 1
            /      |           |            |      \
         FCGI    FCGI         FCGI        FCGI     FCGI
         /         |           |            |         \
    CppCMS App  CppCMS App  CppCMS App    CppCMS App  CppCMS App
     Server 2    Server 3     Server 4      Server 5     Server 6

Jadi pada dasarnya Anda tidak perlu tingkat tipuan lain karena CppCMS menangani proses, utas dan kumpulan koneksi untuk Anda. Sementara PHP / Ruby / Perl membutuhkan beberapa Apache mod-XYZ atau menangani konektor FastCGI sendiri.

Artyom
sumber
+1 Bagus penjelasan lengkap oleh penulis CppCMS;) Ok sekarang saya melihat lebih baik masalah keseluruhan. Jadi kasus di mana Anda hanya memiliki satu server (untuk memulai dengan) adalah HTTP-> Balancer-> FCGI-> CPPCMS, jika saya mengerti dengan benar? Apa pendapat Anda tentang saran dari komentar Jesper Mortensen, yang mengatakan bahwa FastCGI tidak cepat?
Klaim
@Klaim: Lihat gambar luar biasa di atas - dalam arsitektur ini, FastCGI digunakan sebagai interkoneksi antara beberapa server, masing-masing menjalankan instance CppCMS multi-threaded. Kecepatan relatif dari FastCGI penting jauh lebih sedikit dalam hal ini; alternatif Anda adalah HTTP, AJP, dan protokol jaringan lainnya yang juga tidak 'cepat'. Jawaban ini mungkin harus ditandai sebagai diterima, dan pertanyaan Anda diedit, karena ini bukan tentang kapan nginx sepadan.
Jesper M
@Jesper Mortensen> Saya setuju, tetapi modifikasi apa pada pertanyaan yang Anda sarankan dengan tepat?
Klaim
6

Nginx, berbicara sangat ( sangat ) pada umumnya, dapat memperoleh throughput yang jauh lebih tinggi daripada Apache berkat pendekatan arsitektur yang berbeda untuk masalah melayani halaman ke web. Nginx juga dibangun terutama sebagai proksi terbalik, dan mengisi peran itu dengan sangat baik (ini adalah bit penyeimbang beban yang Anda singgung); Apache, di sisi lain, dibangun untuk melayani halaman web, dan kemudian memperoleh kemampuan proxy.

Yang mengatakan, ada hampir pasti daerah Apache akan secara konsisten mengungguli Nginx, sementara ada yang lain di mana Nginx akan secara konsisten mengungguli Apache.

Jawaban singkatnya adalah jika Apache berfungsi untuk Anda, tidak perlu beralih. (Dan saya mengatakan ini sebagai mantan pengguna Apache yang telah menjadi murid Nginx yang sepenuhnya dikonversi.) Hanya ketika lalu lintas ke server Anda mulai mencapai tingkat di mana Apache menjadi hambatan Anda (ini ada di urutan beberapa ribu koneksi simultan, tetapi akan sangat bervariasi berdasarkan spesifikasi server Anda dan beban server lainnya), atau jika Anda mencoba menjalankan Apache di lingkungan yang miskin sumber daya di tempat yang hampir tidak dapat ditampung, beralih ke Nginx memberi Anda manfaat yang kuat.

Yang mengatakan, jika Anda ingin beralih ke Nginx (yang saya mendorong!), Maka lakukanlah. Apakah Anda akan melihat manfaatnya? 9 kali dari 10: Tidak, Anda tidak akan melakukannya. Tapi Anda menyebutkan bahwa Anda seperti bahasa file konfigurasi dari Nginx lebih baik, jadi jika itu membuat Anda merasa lebih nyaman untuk mengkonfigurasi Nginx dari Apache, baik, yang merupakan manfaat untuk Anda! (Secara pribadi, saya menemukan konfigurasi Apache lebih mudah dibaca secara umum, tetapi itu bisa jadi karena saya menghabiskan bertahun-tahun membacanya, dan hanya beberapa bulan yang dihabiskan untuk Nginx!)

Di samping catatan: Anda menyebutkan keinginan Anda untuk membangun aplikasi web di C ++. Demi kewarasan Anda, saya sangat menyarankan Anda untuk menggunakan bahasa tingkat tinggi seperti PHP, Python, atau bahkan Java. Kemudian profil kode Anda dan pertimbangkan untuk membuat modul berbasis C ++ untuk mengatasi kemacetan tertentu (Python dan PHP keduanya memungkinkan ini lebih mudah; tidak tahu tentang Java). Jika Anda khawatir tentang kinerja keseluruhan, pertimbangkan ini: EVE Online, satu-satunya MMORPG unsharded terbesar di dunia, dibangun di atas varian Python (Stackless Python), dengan hanya komponen kunci (mis. Perpustakaan grafis) yang ditulis dalam C ++. Jika Python bisa mengatasinya, pasti itu bisa menangani aplikasi web Anda?

Kromey
sumber
+1 Terima kasih. Tentang C ++, lihat komentar saya pada jawaban Jesper Mortensen. Juga, bahkan jika Python digunakan pada sisi server Eve Online (saya tahu banyak tentang ini) AFAIK, itu hanya mengelola kode gameplay (yang besar), dan beberapa bagian lainnya sebenarnya dalam C ++. Kode grafis ada di sisi klien sehingga C ++ juga wajib untuk jenis kinerja grafis seperti itu. Seperti yang saya katakan, lihat halaman Alasan CPPCMS tentang mengapa saya memilihnya. Jika saya akan mengikuti saran Anda, saya harus menulis aplikasi saya dua kali, sementara saya sudah tahu itu sangat haus kekuasaan. Juga, saya mengerti kekurangannya dan saya baik-baik saja dengan itu.
Klaim
3

Tidak ada yang benar-benar dapat menjawab bagian "kapan saya harus beralih" - itu akan tergantung pada beban Anda, kinerja kode aplikasi Anda sendiri, dll.

NGinx, yang tampaknya lebih berkinerja daripada Apache

nginx menggunakan proses tunggal (atau sejumlah kecil proses pekerja) untuk menangani semua koneksi klien menggunakan I / O yang terjadi. Apache memiliki beberapa "Modul Multi-Pemrosesan" yang tersedia, tetapi mereka semua lebih condong ke banyak proses / banyak utas. Akibatnya, Apache umumnya akan mengkonsumsi lebih banyak RAM dan CPU daripada nginx untuk penanganan koneksi HTTP dasar. Anda bisa mendapatkan gambaran tentang berbagai pendekatan penanganan koneksi pada halaman C10K Kegel .

aplikasi web yang sangat intensif-kinerja (menggunakan C ++ dengan CPPCMS)

Saya sangat menyarankan untuk mempertimbangkan melakukan webapp dasar dalam bahasa tingkat yang lebih tinggi (Python, atau mungkin Ruby, Scala), dan menggunakan antrian pesan untuk mengirim tiket kerja ke mesin pekerja yang menangani tugas "intensif kinerja" secara tidak sinkron.

NGinx akan menjadi pilihan terbaik saat Anda ingin load-balancing,

nginx adalah penyeimbang beban yang baik; tetapi ada banyak opsi di ruang itu .

Bisakah saya menggunakan Apache dan NGinx keduanya pada mesin yang sama tanpa masalah?

Iya. Jalankan saja pada berbagai nomor port IP dan / atau alamat IP.

Jesper M
sumber
"Saya sangat menyarankan untuk mempertimbangkan melakukan webapp dasar dalam bahasa tingkat yang lebih tinggi"> Saya tidak mengatakan itu adalah webapp dasar - itu bahkan tidak sepele. Jika Anda melihat alasan untuk menggunakan CPPCMS, penulis beberapa poin yang mungkin bermanfaat, dan saya dalam kasus tersebut. Saya telah mempertimbangkan alternatif lain tetapi menemukan mereka lebih mahal daripada pergi dengan C ++, setidaknya dalam jenis webapp yang saya tulis. Jadi itu bukan bagian dari pertanyaan. Tapi saya mengerti saran Anda dan memberikan hal yang sama kepada orang-orang yang bertanya kepada saya apakah mereka harus menggunakan C ++ untuk aplikasi web. Saya juga berencana menggunakan Python untuk aplikasi lain yang lebih sederhana.
Klaim
Pokoknya, +1 untuk detailnya.
Klaim
@Klaim: Jika Anda ingin merealisasikan peningkatan kinerja "urutan besarnya" yang diklaim di atas implementasi C # / Java yang disesuaikan dengan baik, maka lihat apakah Anda dapat menjalankan CppCMS & kode aplikasi yang sedang dalam proses dengan server web Anda - yaitu sebagai plugin untuk nginx / Apache. Halaman CppCMS tampaknya menunjukkan FastCGI sebagai koneksi antara server web dan CppCMS; dan sebenarnya FastCGI tidak ... cepat.
Jesper M
> Ide yang menarik. Sebagian besar saran di sekitar adalah Anda harus menggunakan fastcgi karena lebih cepat daripada alternatifnya. Saya akan memeriksa apakah saya bisa melakukan ini, mungkin melihat dengan penulis CPPCMS mengapa ia berpikir itu yang tercepat.
Klaim