Ubuntu下JSP项目的负载均衡实现指南
一、架构与准备
- 组件选型:前端使用Nginx或Apache HTTP Server做反向代理/负载均衡,后端运行多个Apache Tomcat实例承载JSP/Servlet。数据库与应用分离,连接信息在各实例保持一致。
- 节点规划示例:
- 负载均衡器:192.168.1.40(Nginx,主)与192.168.1.41(Nginx,备)
- 应用节点:192.168.1.50:8080、192.168.1.51:8080、192.168.1.52:8080
- 基础准备:在每台服务器安装JDK,部署相同版本的Tomcat与WAR包,保证应用路径、数据源、编码等一致;开放相应端口(如80/443、8080、必要时8009)。
二、方案一 Nginx反向代理与负载均衡(HTTP模式)
- 安装与启用:
- 安装:sudo apt update && sudo apt install nginx
- 验证:sudo systemctl status nginx
- 核心配置(/etc/nginx/nginx.conf 或 /etc/nginx/sites-available/default):
- 定义上游Tomcat集群,配置健康检查与权重;反向代理转发请求头,便于后端获取真实客户端信息。
- 示例配置:
- http {
upstream tomcat_cluster {
server 192.168.1.50:8080 weight=1 max_fails=3 fail_timeout=20s;
server 192.168.1.51:8080 weight=1 max_fails=3 fail_timeout=20s;
server 192.168.1.52:8080 weight=1 max_fails=3 fail_timeout=20s;
}
server {
listen 80;
server_name your.domain.local;
location / {
proxy_pass http://tomcat_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
- 使配置生效:sudo nginx -t && sudo systemctl reload nginx
- 说明:HTTP模式部署简单、灵活,适合大多数场景;如需会话粘滞可结合Tomcat会话复制或外部Session存储。
三、方案二 Apache HTTP Server + mod_jk(AJP模式)
- 安装与启用模块:
- 安装:sudo apt update && sudo apt install apache2
- 启用模块:sudo a2enmod proxy proxy_ajp lbmethod_byrequests
- 配置workers.properties(示例路径:/etc/apache2/workers.properties):
- worker.list=controller
- worker.tomcat1.type=ajp13
- worker.tomcat1.host=192.168.1.50
- worker.tomcat1.port=8009
- worker.tomcat1.lbfactor=1
- worker.tomcat2.type=ajp13
- worker.tomcat2.host=192.168.1.51
- worker.tomcat2.port=8009
- worker.tomcat2.lbfactor=1
- worker.controller.type=lb
- worker.controller.balancerMember.tomcat1
- worker.controller.balancerMember.tomcat2
- 配置VirtualHost(/etc/apache2/sites-available/000-default.conf 或自定义文件):
- <VirtualHost *:80>
ServerName your.domain.local
ProxyPass / balancer://controller/
ProxyPassReverse / balancer://controller/
- 使配置生效:sudo a2ensite your-site && sudo systemctl reload apache2
- 说明:AJP是Apache与Tomcat之间的二进制协议,连接复用与性能较好;需在Tomcat开启AJP连接器(见下一节)。
四、Tomcat与网络关键点
- 多实例与端口规划:单机多实例时,避免Server端口、HTTP 8080、AJP 8009、SHUTDOWN 8005冲突;跨机部署则直接在不同主机使用相同端口即可。
- AJP连接器(用于mod_jk/AJP模式):在conf/server.xml中确保存在并启用:
- 防火墙与云安全组:开放负载均衡器与Tomcat节点之间的访问端口(如80/443、8080、必要时8009),避免请求被拦截。
- 会话保持与集群:
- 无状态或外部Session存储(如Redis)优先,天然适配横向扩展。
- 如需会话复制,可启用Tomcat内置集群(基于组播的会话复制),并在Engine或Host上配置Cluster与Membership参数;此方式对网络与JVM调优较敏感。
五、验证与高可用扩展
- 验证负载均衡:
- 在各Tomcat实例放置测试页(如显示**request.getLocalAddr()**或实例标识),通过域名或负载均衡IP反复访问,观察返回IP是否在不同实例间轮询。
- 检查Nginx/Apache访问日志与Tomcat日志,确认请求分发与健康检查行为。
- 高可用扩展(可选):部署Keepalived + Nginx构建VIP(虚拟IP),实现负载均衡器故障自动切换,提升整体可用性。示例环境可参考:两台Nginx(如192.168.1.40/41)绑定同一VIP(如192.168.1.44),后端对接多台Tomcat。