apakah benar-benar perlu menjalankan Apache sebagai front-end untuk Glassfish / JBoss / Tomcat?

14

Saya terutama seorang pengembang Java, dan saya datang kepada Anda dengan sebuah pertanyaan yang mengangkang kesenjangan antara pengembang dan sysadmin.

Bertahun-tahun yang lalu, ketika menjalankan Tomcat sebagai server aplikasi adalah hal yang baru, sudah lazim untuk menggunakannya dengan Apache. Seperti yang saya pahami, ini dilakukan karena:

  1. Java dianggap "lambat", dan itu membantu untuk memiliki Apache melayani konten statis secara langsung.
  2. Tomcat tidak bisa mendengarkan port 80/443 kecuali dijalankan sebagai root, yang berbahaya.

Java tidak lagi dianggap lambat, dan saya ragu menambahkan Apache ke dalam campuran sebenarnya akan membantu mempercepat.

Adapun masalah port, mungkin ada cara sederhana untuk menghubungkan server aplikasi ke port 80/443 hari ini.

Jadi pertanyaan saya adalah- apakah benar-benar ada manfaatnya untuk mem-forward Java Webapps dengan Apache belakangan ini? Jika demikian, apakah Apache masih jalan? Haruskah saya melihat Nginx? Alih-alih Tomcat saya menggunakan Glassfish, jika itu penting.

Koma Kafein
sumber

Jawaban:

8

Kebanyakan orang akan mengatakan Anda perlu sesuatu di depan karena file statis.

Ini agak bodoh karena:

  • Anda dapat mengonfigurasi Tomcat untuk menggunakan IO yang sama dengan apache dengan APR
  • Anda harus menggunakan CDN (Jaringan pengiriman konten).

Alasan sebenarnya Anda membutuhkan sesuatu di depan tomcat / jetty / jboss untuk memuat keseimbangan dan menangani failover.

Saya sarankan Anda tidak mendengarkan " ... Mesin Tomcat adalah tumit Achilles dari seluruh ekosfer ... " seperti yang kita semua tahu itu tidak benar ... database Anda dan kumpulan koneksi akan seperti itu.

Adam Gent
sumber
Adam, apa kau menguntitku dari StackOverflow ke Serverfault? :-) Saya setuju dengan tanggapan Anda. Dalam retrospeksi, saya seharusnya mengatakan pertanyaan yang lebih baik untuk mencerminkan situasi sebenarnya: benar-benar sangat sedikit konten statis untuk dibicarakan, karena DB terlibat dalam hampir semua klik halaman. Pada saat ini (eksplorasi awal yang sangat awal) kita tidak perlu load-balancing, tetapi dengan keberuntungan kita akan membutuhkannya di masa depan.
Caffeine Coma
@Caffeine Coma Saya berada di kapal yang sama dan sepertinya kami menggunakan teknologi yang sama maka kebetulan berada di utas yang sama di seluruh Stackexchanges (saya bersumpah saya tidak menguntit :)). BTW kita menggunakan Nginx + Tomcat.
Adam Gent
5

Itu tergantung pada ekosistem di sekitar aplikasi Anda. Di lingkungan intranet - Anda mungkin tidak perlu apa pun di depan Tomcat.

Jika sendirian di internet sebagai layanan yang dihadapi publik, itu tergantung. Apache bagus karena modul yang disediakannya seperti mod_security. Tetapi jika Anda tidak memiliki pengetahuan tentang konfigurasi apache (atau ngix) - maka Anda dapat mengekspos diri Anda terhadap serangan LEBIH BANYAK atau titik kegagalan karena kesalahan konfigurasi.

Apache di depan sangat berguna untuk melayani halaman pemadaman dalam kasus di mana Anda perlu meningkatkan aplikasi web dan menunggu untuk memulai kembali. Tetapi jika restart jarang atau waktunya tepat - maka alasan lain untuk pergi Tomcat mandiri.

FAQ Tomcat juga membicarakan hal ini juga yang membahas beberapa poin tambahan: http://wiki.apache.org/tomcat/FAQ/Connectors#Q3

Tim Funk
sumber
1

Apache bukan kandidat yang baik untuk menyajikan konten statis karena sifatnya multi-proses. Nginx lebih cocok karena menggunakan I / O asinkron untuk memproses permintaan. Tomcats modern dapat menggunakan I / O asinkron (NIO dalam terminologi Java) juga. Misalnya, Anda harus menginstal tomcat-nativepaket di Fedora untuk membuat Tomcat menggunakan async I / O.

Alex
sumber
Saya sebenarnya tidak terlalu banyak menyajikan konten statis. Pertanyaan saya sebenarnya: apakah saya perlu repot dengan front-end Apache / Nginx, atau hanya menggunakan Glassfish? Terima kasih.
Caffeine Coma
Sebenarnya, masalahnya lebih luas dari sekadar menyajikan konten statis karena jika server Anda tidak menggunakan klien I / O async dengan koneksi lambat akan memblokir utas eksekusi server sampai mereka mendapatkan konten secara penuh. Jadi, memiliki antarmuka bertenaga AIO adalah keuntungan dalam hal apa pun. Tapi, seperti yang sudah saya sebutkan, Tomcat memiliki kemampuan AIO. Saya pikir stok paket Glassfish sudah termasuk perpustakaan AIO, jadi Anda mungkin tidak perlu repot.
Alex
apache belum tentu multi-proses. pekerja mpm telah keluar untuk beberapa waktu httpd.apache.org/docs/2.2/mod/worker.html dan kami menggunakan dalam lingkungan produksi untuk server web multi-threaded.
dialt0ne
Nah, Apache multithreaded masih menggunakan I / O sinkron. Saya tidak melihat perbedaan besar jika utas yang tidak diproses akan diblokir pada soket oleh klien yang lambat. Nginx dirancang sebagai mesin keadaan terbatas proses tunggal single-threaded (baik, proses tunggal tidak perlu, jumlah proses harus diatur ke jumlah core CPU pada sistem multi-core).
Alex
1

Luar biasa, beberapa jawaban ini - apakah ada di antara kalian yang benar-benar menjalankan situs web Tomcat yang didukung multi-tier dan mutli-server? OP, anggapan awal Anda bahwa Tomcat tidak "lambat" ... wow. Mesin Tomcat adalah tumit Achilles dari seluruh ekosfer.

Ya, Anda ingin Apache di depan - ia menyediakan mod_rewrite pertama dan terpenting (apakah Anda sudah mengimplementasikan UrlRewriteFilter di Tomcat Anda?) Serta file htaccess yang membuat melindungi server web begitu penting. Apache dapat memungkinkan Anda untuk memuat saldo node Tomcat di belakangnya, melayani konten statis Anda lebih cepat dan mendapatkan kinerja yang lebih baik dari Tomcat karena Anda tidak membebani permintaan pipa itu dengan non-Jawa (js / css / html / jpg / dll.) sesuatu. Anda dapat membongkar SSL Anda di Apache (jika tidak membongkar di perangkat keras LB) dengan mudah dan bahkan tidak harus berurusan dengan parodi yang disebut Java Keystore. Ada begitu banyak kemenangan - Anda dapat menyetel mod_jk ke node backend Anda untuk menjaga agar tidak menguasai otak kecil Java yang malang karena biasanya tidak dapat menangani lalu lintas besar dengan Java coder rata-rata '

Waspadalah siapa pun yang memberi tahu Anda bahwa Apache (atau nginx, dll - tetapi kinerja Apache akan lebih baik daripada Tomcat sehingga tidak masalah) bukanlah ide yang baik di depan Tomcat.


sumber
4
Kamu terdengar sangat tersinggung.
Caffeine Coma
Hanya jijik bahwa orang menawarkan nasihat buruk tentang ServerFault.
Waspadalah siapa pun yang berteriak-teriak dengan nomor apa pun untuk mendukung klaim tersebut. Jika situs Anda sebagian besar dinamis maka kucing jantan langsung akan menjadi lebih cepat. Sebagian besar situs lalu lintas berat dewasa ini menggunakan CDN (jaringan pengiriman konten) untuk konten statis mereka sehingga tidak ada alasan untuk menggunakan Apache untuk menyajikan konten statis Anda. Yang sedang berkata Anda harus masih memiliki sesuatu di depan untuk load balancing / ssl.
Adam Gent
0

Jika itu hanya masalah pengikatan port privileges tanpa harus di-root ketika menggunakan Tomcat, Anda tidak perlu menggunakannya dengan Apache httpd. Tomcat secara default dikirimkan dengan jsvcyang perlu Anda kompilasi.

jsvcadalah pembungkus layanan java untuk meluncurkan Tomcat sebagai layanan. Layanan ini dimulai sebagai root tetapi mulai Tomcat sebagai pengguna normal. Jadi Anda dapat mengikat Tomcat Anda ke port istimewa.

Saya tidak tahu tentang GlassFish, tetapi pastikan ada solusi dan jika tidak, Anda pasti dapat menggunakan teknik penerusan port (iptables, dll ...)

Saya pikir pilihan untuk mem-fronting server aplikasi dengan server web (misalnya Apache httpd) adalah untuk load balancing, clustering atau melayani sumber daya statis hanya dengan server web dan sumber daya dinamis dengan server aplikasi.

Laurent T
sumber