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.