Cấu hình cân bằng tải Tomcat bằng Apache HTTP Server và mod_jk

Giới thiệu về mod_jk và giao thức AJP

mod_jk là module trung gian kết nối Apache HTTP Server với Tomcat thông qua giao thức AJP (Apache JServ Protocol). Không phải module mặc định của httpd, mod_jk cần biên dịch riêng, tương tự như cách bổ sung module PHP. Giao thức AJP được tối ưu hóa cho giao tiếp giữa web server và servlet container, cho hiệu năng tốt hơn so với HTTP proxy thông thường.

Biên dịch module mod_jk

Phiên bản mod_jk ổn định hiện tại là 1.2.42. Quá trình biên dịch cần gói phát triển httpd:

yum -y install httpd httpd-devel

Tải mã nguồn và chuẩn bị môi trường biên dịch:

wget http://tomcat.apache.org/download-connectors.cgi
tar xf tomcat-connectors-1.2.42-src.tar.gz
cd tomcat-connectors-1.2.42-src/native/

Chạy script cấu hình và biên dịch:

./configure --with-apxs=/usr/bin/apxs --prefix=/opt/tomcat/mod_jk
make && make install

Thiết lập kết nối AJP cơ bản

Tạo file cấu hình mod_jk tại /etc/httpd/conf.d/mod_jk.conf:

LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug

# Chuyển tiếp yêu cầu JSP đến Tomcat1
JkMount /*.jsp Tomcat1
JkMount /status/* status
JkUnMount /images/* Tomcat1
JkUnMount /css/* Tomcat1
JkUnMount /js/* Tomcat1
JkUnMount /*.html Tomcat1

Nội dung file workers.properties định nghĩa worker:

worker.list=Tomcat1,status
worker.Tomcat1.type=ajp13
worker.Tomcat1.host=10.0.0.101
worker.Tomcat1.port=8009
worker.Tomcat1.lbfactor=1
worker.status.type=status

Các directive quan trọng:

  • JkMount: Xác định pattern URL cần chuyển tiếp đến Tomcat worker
  • JkUnMount: Loại trừ các pattern khỏi việc chuyển tiếp, cho phép httpd xử lý tài nguyên tĩnh
  • workers.properties: Định nghĩa các worker với thông tin host, port, và trọng số

Lưu ý: mod_jk vượt trội hơn mod_proxy nhờ cơ chế phân tách tĩnh/động này, giảm tải cho Tomcat.

Cấu hình cân bằng tải

Sửa đổi mod_jk.conf để sử dụng load balancer:

LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel notice
JkMount /*.jsp LoadBalancer
JkMount /status/* status

Cập nhật workers.properties với cấu hình load balancer:

worker.list=LoadBalancer,status
worker.status.type=status
worker.LoadBalancer.type=lb
worker.LoadBalancer.sticky_session=false
worker.LoadBalancer.balance_workers=Tomcat1,Tomcat2
worker.Tomcat1.type=ajp13
worker.Tomcat1.host=10.0.0.101
worker.Tomcat1.port=8009
worker.Tomcat1.lbfactor=5
worker.Tomcat2.type=ajp13
worker.Tomcat2.host=10.0.0.102
worker.Tomcat2.port=8009
worker.Tomcat2.lbfactor=10

Cấu hình Tomcat: Thêm thuộc tính jvmRoute vào Engine trong server.xml:


<Engine name="Catalina" defaultHost="localhost" jvmRoute="Tomcat1">


<Engine name="Catalina" defaultHost="localhost" jvmRoute="Tomcat2">

Giá trị jvmRoute phải khớp với tên worker trong balance_workers.

Kiểm tra hoạt động

Tạo ứng dụng test trên cả hai Tomcat:

mkdir -p /opt/tomcat/webapps/test/WEB-INF/{classes,lib}

File index.jsp cho Tomcat1:

<%@ page language="java" %>
<html>
<head><title>Tomcat1</title></head>
<body>
<h1><font color="red">Tomcat1</font></h1>
<table border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("test","value"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

File tương tự cho Tomcat2 với màu xanh và tên Tomcat2. Khởi động lại dịch vụ và truy cập http://[apache-server]/test/index.jsp để kiểm tra. Với sticky_session=false, mỗi request sẽ được phân phối theo chu kỳ và Session ID thay đổi. Để giữ session, đặt sticky_session=true trong cấu hình load balancer.

Thẻ: Tomcat apache-httpd mod_jk ajp-protocol load-balancing

Đăng vào ngày 4 tháng 8 lúc 08:32