Có Cần Máy Chủ Web Java EE để Xử Lý Servlet/JSP? Ưu và Nhược điểm

Bài viết này sẽ làm rõ liệu có cần thiết sử dụng máy chủ web Java EE như Sun Java Web Server để xử lý các yêu cầu Servlet/JSP và chuyển tiếp chúng đến các máy chủ ứng dụng như IBM WebSphere hoặc BEA WebLogic hay không. Chúng ta cũng sẽ khám phá những ưu điểm và nhược điểm của kiến trúc máy chủ này, đặc biệt là trong bối cảnh các công nghệ như Apache Tomcat và các lựa chọn thay thế khác.

Các máy chủ ứng dụng có khả năng xử lý trực tiếp các Servlet/JSP, vậy vai trò của máy chủ web Java EE là gì?

Apache Tomcat, JettySun Java System Web Server được xem là các Java Web Container (Servlet container). Chúng chỉ có khả năng thực thi Servlets và JSP, chứ không cung cấp đầy đủ các API của Java EE. Điều này có nghĩa là chúng chỉ có thể triển khai các file .war (Web Archive), chứ không phải .ear (Enterprise Archive) bao gồm các module .jar chứa EJB (Enterprise JavaBeans). Bên cạnh đó, chúng có thể không hỗ trợ đầy đủ các API Java EE như JSF (JavaServer Faces) hoặc CDI (Contexts and Dependency Injection). Tuy nhiên, từ Java EE 6 trở đi, các file .war đã có thể chứa EJB.

Mỗi máy chủ Java EE đều tích hợp Web Container + EJB Container. Tomcat và Jetty không yêu cầu phải là máy chủ Java EE đầy đủ, mà chỉ cần là các Servlet Container (Web Container).

Máy chủ ứng dụng JBoss sử dụng JBossWeb (một nhánh của Apache Tomcat) làm Web Container. EJB Container của nó đơn giản là “JBoss EJB Container”. Các máy chủ khác như IBM WebSphere, Oracle/BEA WebLogic, TomEE, Glassfish cũng có Web Container và EJB Container riêng. TomEE sử dụng Apache Tomcat làm Web Container. Glassfish cũng sử dụng một nhánh của Apache Tomcat.

Lợi ích và bất lợi khi sử dụng máy chủ web Java (như Tomcat) để xử lý Servlet/JSP và chuyển tiếp các yêu cầu phức tạp hơn đến máy chủ ứng dụng (như JBoss)?

Về mặt chức năng, không có lợi ích đáng kể

Nếu Tomcat được đặt phía trước JBoss, nó thực chất chỉ là một JBossWeb khác (Web Container). Điều này dẫn đến sự dư thừa vì cùng một dịch vụ được cung cấp hai lần.

Chuyển đổi trình triển khai hoặc khả năng phân cụm

Việc đặt Tomcat phía trước JBoss có thể hợp lý nếu JBoss chỉ được sử dụng cho EJB Container. Lựa chọn này có thể là một sự chuyển đổi đơn giản trong trình triển khai Web Container.

Ngoài ra, nếu Tomcat nằm trên một nút mạng khác (hoặc nhiều nút Tomcat), khả năng phân cụm có thể được áp dụng. Điều này không thể thực hiện được nếu JBossWeb và JBoss thường được coi là một và nằm trên cùng một máy.

Phục vụ nội dung tĩnh và các vấn đề bảo mật

Một phương pháp phổ biến là đặt máy chủ web (chẳng hạn như Apache HTTPD hoặc IIS) phía trước Java Web Container. Điều này có hai động cơ chính:

  • HTTPD phục vụ nội dung tĩnh: HTTPD được tối ưu hóa tốt hơn trong việc cung cấp nội dung tĩnh (ví dụ: hình ảnh) và chuyển tiếp các yêu cầu còn lại đến Java Web Container.
  • Bảo mật: Chỉ hiển thị HTTPD trong DMZ (Demilitarized Zone). Có thể thiết lập Apache HTTPD trong DMZ và chuyển tiếp mọi thứ đến Web Container (Tomcat, v.v.) và máy chủ Java EE (JBoss, v.v.).

Mô tả mô hình bảo mật DMZ với máy chủ web Apache HTTPD đóng vai trò lớp bảo vệ bên ngoài.

Nếu muốn tăng cường bảo mật, việc sử dụng Web Container trong DMZ có thể không an toàn. Nếu nó phục vụ các ứng dụng (ví dụ: có các file .war được triển khai), các ứng dụng này vẫn có thể bị tấn công. Nếu nó chỉ chuyển tiếp các yêu cầu/phản hồi, thì Apache HTTPD là một lựa chọn tốt hơn nhiều.

Sun Java Web Server, IBM WebSphere Application Server, WebLogic, JBoss Application Server, Tomcat, Jetty… tất cả đều là máy chủ ứng dụng web Java và có chức năng tương tự: chạy các ứng dụng được đóng gói dưới dạng WAR hoặc EAR (EAR dành cho “Enterprise”, chứa nhiều WAR).

Nếu có hai máy chủ trong thiết lập để chạy một ứng dụng, có thể có vấn đề trong chiến lược/thiết kế triển khai. Tuy nhiên, có những trường hợp thiết lập nhiều máy chủ, nhưng đó là các thiết lập proxy và cân bằng tải với Apache HTTP Server phía trước máy chủ ứng dụng Java.

Ví dụ: Tomcat phục vụ ứng dụng trên cổng 8080 và bạn muốn sử dụng sentayho.com.vn/myapp/ thay vì sentayho.com.vn:8080/myapp/. Bạn không thể làm điều đó chỉ với Tomcat vì Java không thể hoạt động dưới cổng 1024. Để thực hiện điều này, bạn cần thiết lập Apache HTTP Server trên cổng 80 và cấu hình mod_proxy để chuyển hướng tất cả lưu lượng truy cập từ /myapp đến sentayho.com.vn:8080/myapp.

Kết luận

Việc sử dụng máy chủ web Java EE phía trước máy chủ ứng dụng có thể mang lại lợi ích trong một số trường hợp cụ thể, chẳng hạn như phục vụ nội dung tĩnh hiệu quả hơn hoặc tăng cường bảo mật thông qua DMZ. Tuy nhiên, về mặt chức năng, nó thường không mang lại nhiều giá trị. Việc lựa chọn kiến trúc phù hợp phụ thuộc vào yêu cầu cụ thể của ứng dụng và môi trường triển khai.