จำเป็นต้องใช้ Apache เป็นส่วนหน้าของ Glassfish / JBoss / Tomcat หรือไม่?


14

ฉันเป็นนักพัฒนา Java เป็นหลักและฉันมาหาคุณพร้อมกับคำถามที่เลาะเลียบการแบ่งแยกระหว่างนักพัฒนาและ sysadmins

หลายปีที่ผ่านมาเมื่อมันเป็นเรื่องแปลกใหม่ที่จะเรียกใช้ Tomcat เป็นเซิร์ฟเวอร์แอพมันเป็นธรรมเนียมที่จะต้องเผชิญหน้ากับ Apache ตามที่ฉันเข้าใจแล้วสิ่งนี้ทำเพราะ:

  1. Java ได้รับการพิจารณาว่า "ช้า" และเป็นประโยชน์อย่างยิ่งที่ Apache ให้บริการเนื้อหาคงที่โดยตรง
  2. Tomcat ไม่สามารถฟังพอร์ต 80/443 ยกเว้นว่าทำงานเป็น root ซึ่งเป็นอันตราย

Java นั้นไม่ถือว่าช้าอีกต่อไปและฉันสงสัยว่าการเพิ่ม Apache ลงในส่วนผสมจะช่วยเร่งความเร็วให้กับสิ่งต่างๆ

สำหรับปัญหาพอร์ตอาจมีวิธีที่ง่ายกว่าในการเชื่อมต่อเซิร์ฟเวอร์แอพเข้ากับพอร์ต 80/443 วันนี้

ดังนั้นคำถามของฉันคือ - มีประโยชน์จริงๆที่จะบังหน้า Java Webapps กับ Apache วันนี้? ถ้าใช่ Apache ยังคงเป็นทางไปหรือเปล่า? ฉันควรดู Nginx หรือไม่ แทนที่จะเป็น Tomcat ฉันใช้ Glassfish ถ้าเป็นอย่างนั้น

คำตอบ:


8

คนส่วนใหญ่จะบอกว่าคุณต้องการบางสิ่งบางอย่างในหน้าเพราะไฟล์คงที่

นี่ค่อนข้างโง่เพราะ:

  • คุณสามารถกำหนดค่า Tomcat ให้ใช้ IO เดียวกับ apache ด้วย APR
  • คุณควรใช้ CDN (เครือข่ายการส่งเนื้อหา) ต่อไป

เหตุผลที่แท้จริงที่คุณต้องการบางสิ่งในด้านหน้าของ tomcat / jetty / jboss เพื่อโหลดบาลานซ์และจัดการกับ failover

ฉันขอแนะนำให้คุณไม่ฟัง " ... เครื่องยนต์ Tomcat เป็นจุดอ่อนของ Ecosphere ทั้งหมด ... " เนื่องจากเราทุกคนรู้ว่าไม่เป็นความจริง ... ฐานข้อมูลของคุณและการรวมการเชื่อมต่อจะเป็นเช่นนั้น


อดัมคุณสะกดรอยตามฉันจาก StackOverflow ไปยัง Serverfault หรือไม่ :-) ฉันเห็นด้วยกับคำตอบของคุณ เมื่อมองย้อนกลับไปฉันควรถามคำถามให้ดีขึ้นเพื่อสะท้อนสถานการณ์จริง: มีเนื้อหาสแตติกน้อยมากที่จะพูดเนื่องจาก DB มีส่วนร่วมในการเข้าชมเกือบทุกหน้า ในเวลานี้ (การสำรวจเริ่มต้นเร็ว ๆ นี้) เราไม่จำเป็นต้องทำโหลดบาลานซ์ แต่โชคดีที่เราจะต้องการมันในอนาคต
คาเฟอีนโคม่า

@ คาเฟอีนโคม่าฉันอยู่ในเรือลำเดียวกันและดูเหมือนว่าเรากำลังใช้เทคโนโลยีเดียวกันดังนั้นความบังเอิญของการอยู่ในหัวข้อเดียวกันใน Stackexchanges (ฉันสาบานว่าฉันไม่ได้สะกดรอยตาม :) BTW เราใช้ Nginx + Tomcat
Adam Gent

5

มันขึ้นอยู่กับระบบนิเวศรอบ ๆ แอปของคุณ ในระบบอินทราเน็ต - คุณอาจไม่ต้องการอะไรต่อหน้า Tomcat

ถ้าอยู่คนเดียวบนอินเทอร์เน็ตในฐานะที่เป็นบริการสาธารณะ Apache น่าใช้เพราะโมดูลที่ให้มาเช่น mod_security แต่ถ้าคุณไม่มีความรู้เกี่ยวกับการกำหนดค่าของ apache (หรือ ngix) - คุณสามารถเปิดเผยตัวเองไปยังการโจมตีหรือจุดที่ล้มเหลวมากยิ่งขึ้นเนื่องจากการกำหนดค่าผิดพลาด

Apache อยู่ข้างหน้ามีประโยชน์สำหรับการแสดงหน้าดับในกรณีที่คุณต้องการอัพเกรด webapp และรอการรีสตาร์ท แต่ถ้าการรีสตาร์ทนั้นหายากหรือพวกมันถูกกำหนดเวลาอย่างถูกต้อง - อีกเหตุผลหนึ่งที่ทำให้ Tomcat สแตนด์อะโลน

Tomcat FAQ ยังพูดคุยเกี่ยวกับเรื่องนี้ด้วยซึ่งจะกล่าวถึงประเด็นเพิ่มเติมบางประการ: http://wiki.apache.org/tomcat/FAQ/Connectors#Q3


1

Apache ไม่ใช่ตัวเลือกที่ดีในการแสดงเนื้อหาแบบคงที่เนื่องจากมีหลายขั้นตอน Nginx เหมาะสมกว่าเนื่องจากใช้ Asynchronous I / O เพื่อดำเนินการตามคำขอ Modern Tomcats สามารถใช้ I / O อะซิงโครนัสในคำศัพท์ Java ได้เช่นกัน ตัวอย่างเช่นคุณควรติดตั้งtomcat-nativeแพ็คเกจใน Fedora เพื่อให้ Tomcat ใช้ async I / O


ฉันไม่ได้ให้บริการเนื้อหาแบบคงที่จริงๆอยู่แล้ว คำถามของฉันเป็นจริง: ฉันต้องรำคาญกับ front-end Apache / Nginx หรือเพียงแค่ไปกับ Glassfish ตรง? ขอบคุณ
คาเฟอีนโคม่า

ที่จริงแล้วปัญหานั้นกว้างกว่าการให้บริการเนื้อหาคงที่เพราะหากเซิร์ฟเวอร์ของคุณไม่ได้ใช้ไคลเอนต์ async I / O ที่มีการเชื่อมต่อช้าจะบล็อกเธรดการทำงานของเซิร์ฟเวอร์จนกว่าพวกเขาจะได้รับเนื้อหาเต็ม ดังนั้นการมีส่วนเสริมที่ขับเคลื่อนโดย AIO จะเป็นประโยชน์ในทุกกรณี แต่ตามที่ได้กล่าวไปแล้ว Tomcat มีความสามารถของ AIO ฉันคิดว่าแพ็คเกจ Glassfish ของสต็อกมีห้องสมุด AIO อยู่แล้วดังนั้นคุณอาจไม่ควรกังวล
อเล็กซ์

อาปาเช่ไม่จำเป็นต้องมีหลายขั้นตอน คนทำงาน mpm ออกมาไม่นานhttpd.apache.org/docs/2.2/mod/worker.htmlและเรากำลังใช้งานในสภาพแวดล้อมการผลิตสำหรับเว็บเซิร์ฟเวอร์แบบมัลติเธรด
dialt0ne

Apache แบบมัลติเธรดยังคงใช้ I / O แบบซิงโครนัส ฉันไม่เห็นความแตกต่างใหญ่ถ้าเธรดที่ไม่ได้ประมวลผลจะถูกบล็อกบนซ็อกเก็ตโดยไคลเอ็นต์ที่ช้า Nginx ได้รับการออกแบบเป็นเครื่องสถานะ จำกัด กระบวนการเดียวเธรดเดียว (ดีไม่จำเป็นกระบวนการเดียวจำนวนกระบวนการควรตั้งค่าให้จำนวนแกน CPU ในระบบมัลติคอร์)
อเล็กซ์

1

น่าประหลาดใจบางคำตอบเหล่านี้ - มีใครบ้างไหมที่เรียกใช้เว็บไซต์ประสิทธิภาพสูงแบบหลายชั้นและแบบ Mutli-server Tomcat OP สมมุติว่าต้นฉบับของคุณที่ Tomcat ไม่ใช่ "ช้า" ... ว้าว เครื่องยนต์ Tomcat นั้นเป็นจุดอ่อนของ Ecosphere ทั้งหมด

ใช่คุณต้องการ Apache อยู่ข้างหน้า - ให้ mod_rewrite แรกและสำคัญที่สุด (คุณได้ติดตั้ง UrlRewriteFilter ใน Tomcat ของคุณแล้ว) รวมถึงไฟล์ htaccess ที่ช่วยปกป้องเว็บเซิร์ฟเวอร์ที่สำคัญ Apache สามารถช่วยให้คุณโหลดยอดคงเหลือโหนด Tomcat ที่อยู่ด้านหลังให้บริการเนื้อหาแบบคงที่ของคุณได้เร็วขึ้นและได้รับประสิทธิภาพที่ดีขึ้นจาก Tomcat เพราะคุณไม่ได้โหลดมากเกินไปเป็นไพพ์การร้องขอด้วย non-Java (js / css / html / jpg / etc) สิ่ง คุณสามารถ offload SSL ของคุณที่ Apache (ถ้าไม่ถ่ายที่ฮาร์ดแวร์ LB) ได้อย่างง่ายดายและไม่จำเป็นต้องจัดการกับ travesty ที่เรียกว่า Java Keystore มีผู้ชนะมากมาย - คุณสามารถปรับ mod_jk ให้กับโหนดแบ็กเอนด์ของคุณเพื่อป้องกันสมองเล็ก ๆ น้อย ๆ ที่น่าสงสารของ Java เพราะโดยทั่วไปแล้วมันไม่สามารถรองรับปริมาณการใช้งานจำนวนมากด้วยค่าเฉลี่ยของโค้ด Java '

ระวังใครก็ตามที่บอกคุณว่า Apache (หรือ nginx ฯลฯ - แต่ประสิทธิภาพของ Apache จะโดดเด่นกว่า Tomcat ไม่เป็นไร) ไม่ใช่ความคิดที่ดีต่อ Tomcat


4
คุณฟังดูขุ่นเคืองมาก
คาเฟอีน Coma

เพียงแค่รังเกียจว่าผู้คนให้คำแนะนำที่ไม่ดีเช่นนี้ใน ServerFault

ระวังทุกคนที่คุยโวด้วยตัวเลขใด ๆ เพื่อสำรองการเรียกร้องดังกล่าว หากเว็บไซต์ของคุณเป็นแบบไดนามิกส่วนใหญ่แล้ว Tomcat โดยตรงจะเร็วขึ้น ไซต์ที่มีปริมาณการใช้งานสูงส่วนใหญ่ในปัจจุบันใช้ CDN (เครือข่ายการส่งเนื้อหา) สำหรับเนื้อหาแบบคงที่ดังนั้นจึงไม่มีเหตุผลที่จะใช้ Apache เพื่อแสดงเนื้อหาคงที่ของคุณ ที่ถูกกล่าวว่าคุณควรยังคงมีบางสิ่งในหน้าสำหรับการทำ load balance / ssl
Adam Gent

0

หากเป็นเพียงเรื่องของการเชื่อมโยงสิทธิพิเศษโดยไม่ต้องรูทเมื่อใช้ Tomcat คุณไม่จำเป็นต้องใช้ Apache httpd Tomcat โดยค่าเริ่มต้นจัดส่งโดยjsvcที่คุณต้องรวบรวม

jsvcเป็น wrapper บริการ java เพื่อเปิดตัว Tomcat เป็นบริการ บริการนี้เริ่มต้นด้วยรูท แต่เริ่มต้น Tomcat ในฐานะผู้ใช้ปกติ ดังนั้นคุณสามารถผูก Tomcat ของคุณกับพอร์ตพิเศษ

ฉันไม่รู้เกี่ยวกับ Glassfish แต่ต้องแน่ใจว่ามีวิธีแก้ปัญหาอยู่และถ้าไม่คุณก็สามารถใช้เทคนิคการส่งต่อพอร์ต (iptables ฯลฯ ... )

ฉันคิดว่าตัวเลือกในการบังหน้าแอปพลิเคชันเซิร์ฟเวอร์ที่มีเว็บเซิร์ฟเวอร์ (Apache httpd เป็นต้น) สำหรับการทำโหลดบาลานซ์การทำคลัสเตอร์หรือให้บริการทรัพยากรคงที่เฉพาะกับเว็บเซิร์ฟเวอร์และทรัพยากรแบบไดนามิกด้วยแอปพลิเคชันเซิร์ฟเวอร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.