có thực sự cần thiết để chạy Apache như một phần đầu cho Glassfish / JBoss / Tomcat không?


14

Tôi chủ yếu là một nhà phát triển Java và tôi đến với bạn với một câu hỏi đặt ra sự phân chia giữa các nhà phát triển và hệ thống.

Cách đây nhiều năm, khi việc chạy Tomcat với tư cách là một máy chủ ứng dụng là một điều mới lạ, thì theo thông lệ, nó phải đối mặt với Apache. Theo tôi hiểu, điều này đã được thực hiện bởi vì:

  1. Java được coi là "chậm" và thật hữu ích khi Apache trực tiếp phục vụ nội dung tĩnh.
  2. Tomcat không thể nghe các cổng 80/443 trừ khi chạy bằng root, điều này rất nguy hiểm.

Java không còn được coi là chậm và tôi nghi ngờ việc thêm Apache vào hỗn hợp sẽ thực sự giúp tăng tốc mọi thứ.

Đối với vấn đề cổng, có lẽ có những cách đơn giản hơn để kết nối máy chủ ứng dụng với cổng 80/443 ngày nay.

Vì vậy, câu hỏi của tôi là - có thực sự có lợi ích gì khi đối mặt với Java Webapps với Apache không? Nếu vậy, Apache vẫn là con đường để đi? Tôi có nên nhìn vào Nginx? Thay vì Tomcat tôi đang sử dụng Glassfish, nếu điều đó quan trọng.

Câu trả lời:


8

Hầu hết mọi người sẽ nói rằng bạn cần một cái gì đó ở phía trước vì các tệp tĩnh.

Điều này hơi ngớ ngẩn vì:

  • Bạn có thể định cấu hình Tomcat để sử dụng cùng IO với apache với APR
  • Dù sao, bạn nên sử dụng CDN (Mạng phân phối nội dung).

Lý do thực sự bạn cần một cái gì đó ở phía trước tomcat / jetty / jboss để tải cân bằng và xử lý chuyển đổi dự phòng.

Tôi khuyên bạn không nên nghe " ... Công cụ Tomcat là gót chân Achilles của toàn bộ tầng sinh thái ... " vì tất cả chúng ta đều biết điều đó không đúng ... cơ sở dữ liệu của bạn và nhóm kết nối của nó sẽ là như vậy.


Adam, bạn đang theo dõi tôi từ StackOverflow đến Serverfault phải không? :-) Tôi đồng ý với phản hồi của bạn. Nhìn lại, tôi nên nói câu hỏi tốt hơn để phản ánh tình huống thực tế: thực sự có rất ít nội dung tĩnh để nói, vì DB có liên quan đến hầu hết mọi trang. Tại thời điểm này (thăm dò khởi động rất sớm) chúng tôi không cần cân bằng tải, nhưng với may mắn, chúng tôi sẽ cần nó trong tương lai.
Caffeine Hôn mê

@Caffeine Coma Tôi đang ở trong cùng một chiếc thuyền và có vẻ như chúng tôi đang sử dụng cùng một công nghệ do đó sự ngẫu nhiên của việc ở trên cùng một chủ đề trên Stackexchanges (Tôi thề tôi không rình rập :)). BTW chúng tôi đang sử dụng Nginx + Tomcat.
Adam Gent

4

Nó phụ thuộc vào hệ sinh thái xung quanh ứng dụng của bạn. Trong môi trường mạng nội bộ - bạn có thể không cần bất cứ điều gì trước Tomcat.

Nếu một mình trên internet như một dịch vụ đối mặt với công chúng, nó phụ thuộc. Apache rất hay vì các mô-đun mà nó cung cấp như mod_security. Nhưng nếu bạn không am hiểu về cấu hình của apache (hoặc ngix) - thì bạn có thể phơi bày ra các cuộc tấn công thậm chí THÊM hoặc các điểm thất bại do cấu hình sai.

Apache ở phía trước có ích để phục vụ các trang ngừng hoạt động trong trường hợp bạn cần nâng cấp ứng dụng web và chờ khởi động lại. Nhưng nếu việc khởi động lại là hiếm hoặc chúng được định thời chính xác - thì đó là một lý do khác để đi độc lập Tomcat.

Câu hỏi thường gặp về Tomcat cũng nói về điều này, trong đó đề cập đến một số điểm bổ sung: http://wiki.apache.org/tomcat/FAQ/Connector#Q3


1

Apache không phải là một ứng cử viên tốt để phục vụ nội dung tĩnh do tính chất đa quy trình của nó. Nginx phù hợp hơn vì nó sử dụng I / O không đồng bộ để xử lý các yêu cầu. Tomcats hiện đại cũng có thể sử dụng I / O không đồng bộ (NIO theo thuật ngữ Java). Ví dụ: bạn nên cài đặt tomcat-nativegói trong Fedora để khiến Tomcat sử dụng I / O không đồng bộ.


Tôi thực sự không phục vụ nhiều nội dung tĩnh. Câu hỏi của tôi thực sự là: tôi có cần bận tâm với giao diện người dùng Apache / Nginx hay chỉ đi với Glassfish thẳng? Cảm ơn.
Caffeine Coma

Trên thực tế, vấn đề còn rộng hơn là chỉ phục vụ nội dung tĩnh bởi vì nếu máy chủ của bạn không sử dụng các máy khách I / O không đồng bộ có kết nối chậm sẽ chặn các luồng thực thi của máy chủ cho đến khi chúng có nội dung đầy đủ. Vì vậy, có một lối vào được hỗ trợ bởi AIO là một lợi ích trong mọi trường hợp. Nhưng, như tôi đã đề cập, Tomcat có khả năng AIO. Tôi nghĩ rằng gói Glassfish đã bao gồm thư viện AIO, vì vậy bạn có lẽ không nên bận tâm.
Alex

apache không nhất thiết là nhiều quá trình. mpm worker đã ra mắt một thời gian httpd.apache.org/docs/2.2/mod/worker.html và chúng tôi đang sử dụng trong môi trường sản xuất cho một máy chủ web đa luồng.
dialt0ne

Chà, Apache đa luồng vẫn sử dụng I / O đồng bộ. Tôi không thấy sự khác biệt lớn nếu các luồng không xử lý sẽ bị chặn trên các socket bởi các máy khách chậm. Nginx được thiết kế dưới dạng máy trạng thái hữu hạn một luồng đơn (tốt, không cần quá trình đơn, số lượng quy trình nên được đặt thành số lõi CPU trên hệ thống đa lõi).
Alex

1

Thật tuyệt vời, một số trong những câu trả lời này - có ai trong số các bạn thực sự chạy các trang web Tomcat đa tầng và máy chủ đa năng hiệu suất cao không? OP, giả sử ban đầu của bạn rằng Tomcat không "chậm" ... wow. Động cơ Tomcat là gót chân Achilles của toàn bộ tầng sinh thái.

Có, bạn muốn Apache ở phía trước - nó cung cấp mod_rewrite đầu tiên và quan trọng nhất (bạn đã triển khai UrlRewriteFilter trong Tomcat của mình chưa?) Cũng như các tệp htaccess giúp bảo vệ máy chủ web rất quan trọng. Apache có thể cho phép bạn tải các nút Tomcat cân bằng phía sau nó, phục vụ nội dung tĩnh của bạn nhanh hơn nhiều và có hiệu suất tốt hơn từ Tomcat vì bạn không làm quá tải đường ống yêu cầu của nó với phi Java (js / css / html / jpg / v.v.) nhiều thứ. Bạn có thể giảm tải SSL của mình tại Apache (nếu không giảm tải ở LB phần cứng) một cách dễ dàng và thậm chí không phải đối phó với trò hề đó được gọi là Kho khóa Java. Có rất nhiều chiến thắng - bạn có thể điều chỉnh mod_jk đến các nút phụ trợ của mình để tránh bị quá tải bộ não nhỏ của Java vì nó thường không thể xử lý lưu lượng lớn với bộ mã hóa Java trung bình '

Coi chừng bất cứ ai nói với bạn rằng Apache (hoặc nginx, v.v. - nhưng hiệu suất của Apache sẽ vượt trội hơn Tomcat vì vậy nó không thành vấn đề) không phải là một ý tưởng hay trước Tomcat.


4
Bạn có vẻ rất xúc phạm.
Caffeine Hôn mê

Chỉ ghê tởm rằng mọi người đưa ra lời khuyên tồi như vậy trên ServerFault.
troyengel

Coi chừng bất cứ ai muốn loại bỏ bất kỳ con số nào để ủng hộ các yêu cầu đó. Nếu trang web của bạn chủ yếu là động thì tomcat trực tiếp sẽ nhanh hơn. Hầu hết các trang web lưu lượng truy cập lớn hiện nay đều sử dụng CDN (mạng phân phối nội dung) cho nội dung tĩnh của chúng, vì vậy không có lý do gì để sử dụng Apache để phục vụ nội dung tĩnh của bạn. Điều đó đang được nói rằng bạn vẫn nên có một cái gì đó trước mặt để cân bằng tải / ssl.
Adam Gent

0

Nếu đó chỉ là vấn đề ràng buộc cổng đặc quyền mà không cần root khi sử dụng Tomcat, thì bạn không cần phải hỗ trợ nó với Apache httpd. Tomcat theo mặc định tàu với jsvcmà bạn cần phải biên dịch.

jsvclà một trình bao bọc dịch vụ java để khởi chạy Tomcat như một dịch vụ. Dịch vụ này bắt đầu bằng root nhưng bắt đầu Tomcat như một người dùng bình thường. Vì vậy, bạn có thể liên kết Tomcat của bạn với các cổng đặc quyền.

Tôi không biết về Glassfish, nhưng hãy chắc chắn rằng các giải pháp tồn tại và nếu không, bạn chắc chắn có thể sử dụng các kỹ thuật chuyển tiếp cổng (iptables, v.v ...)

Tôi nghĩ rằng việc lựa chọn một máy chủ ứng dụng với một máy chủ web (ví dụ Apache httpd) là để cân bằng tải, phân cụm hoặc chỉ phục vụ tài nguyên tĩnh với máy chủ web và tài nguyên động với máy chủ ứng dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.