Tomcat在Ubuntu上如何实现负载均衡
导读:在 Ubuntu 上实现 Tomcat 负载均衡 方案一 Nginx 反向代理与负载均衡(推荐) 安装组件 安装 Nginx 与 Tomcat(示例为 Tomcat 9): sudo apt update && sud...
在 Ubuntu 上实现 Tomcat 负载均衡
方案一 Nginx 反向代理与负载均衡(推荐)
- 安装组件
- 安装 Nginx 与 Tomcat(示例为 Tomcat 9):
- sudo apt update & & sudo apt install -y nginx
- 下载并解压 Tomcat 9 到 /usr/local/tomcat(或按需放置)。
- 安装 Nginx 与 Tomcat(示例为 Tomcat 9):
- 准备多个 Tomcat 实例
- 复制实例并修改各实例的 conf/server.xml 中的端口,避免冲突(示例):
- 实例1:HTTP Connector 端口 8080;实例2:HTTP Connector 端口 8081。
- 如在同一台机器部署多实例,还需调整 Server port、AJP Connector 端口、shutdown 端口 等,使其唯一。
- 复制实例并修改各实例的 conf/server.xml 中的端口,避免冲突(示例):
- 配置 Nginx 负载均衡
- 编辑 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/default,在 http 块中添加:
- upstream tomcat_servers { server 192.168.1.101:8080; server 192.168.1.102:8081; }
- 在 server 块中:
- listen 80; server_name your_domain_or_ip;
- location / { proxy_pass http://tomcat_servers; 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; }
- 编辑 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/default,在 http 块中添加:
- 启用与验证
- 检查配置:sudo nginx -t
- 生效配置:sudo systemctl reload nginx(或 restart)
- 访问 http://your_domain/ 验证分发;多次刷新应能在两个实例间轮询。可进一步配置权重、会话保持与健康检查(见下文优化项)。
方案二 Apache HTTP Server 负载均衡(支持 HTTP 与 WebSocket)
- 适用场景:需要同时负载均衡 HTTP 与 WebSocket,或已有 Apache 前置。
- 启用模块与部署
- 启用模块:sudo a2enmod proxy proxy_http proxy_wstunnel lbmethod_byrequests proxy_balancer xml2enc
- 准备两个 Tomcat 实例(示例端口 8080、8082),可按需开启 AJP 端口(如 8010、8012)。
- 配置 VirtualHost 示例(/etc/apache2/sites-available/balance.conf)
- 常规 HTTP 负载均衡(可用 AJP 或 HTTP;示例用 AJP 并启用会话粘滞):
- <
Proxy “balancer://tomcatcluster”>
- BalancerMember ajp://127.0.0.1:8010 route=jvm8080
- BalancerMember ajp://127.0.0.1:8012 route=jvm8082
- ProxySet lbmethod=byrequests stickysession=JSESSIONID|jsessionid
- ProxyPass / balancer://tomcatcluster/
- ProxyPassReverse / balancer://tomcatcluster/
- <
Proxy “balancer://tomcatcluster”>
- WebSocket 负载均衡(优先匹配 /ws/ 前缀):
- <
Proxy “balancer://wscluster”>
- BalancerMember ws://127.0.0.1:8080
- BalancerMember ws://127.0.0.1:8082
- ProxyPass /ws/ balancer://wscluster/ws/
- ProxyPassReverse /ws/ balancer://wscluster/ws/
- <
Proxy “balancer://wscluster”>
- 管理页面(可选):< Location /balancer-manager> SetHandler balancer-manager
- 常规 HTTP 负载均衡(可用 AJP 或 HTTP;示例用 AJP 并启用会话粘滞):
- 启用站点与验证
- 启用站点:sudo a2ensite balance.conf & & sudo a2enmod lbmethod_byrequests
- 重载:sudo systemctl reload apache2
- 访问 http://your_domain/balancer-manager 查看与调试后端状态。
会话保持与高可用优化
- 会话保持
- 使用 IP Hash:在 Nginx upstream 中加入 ip_hash; 适合简单场景但可能造成流量不均。
- 使用 Sticky Session:Apache 可用 stickysession=JSESSIONID|jsessionid;Nginx Plus 支持 sticky cookie,开源版可通过应用层改造(如 Spring Session)或使用外置会话存储。
- 外置会话存储:将会话存入 Redis 等分布式缓存,实现无状态与水平扩展。
- 健康检查与故障转移
- Nginx 可配置 max_fails、fail_timeout 并结合主动/被动健康检查(开源版以被动检查为主,必要时使用商业版或外部探活脚本)。
- Apache 通过 BalancerMember 参数与 /balancer-manager 进行状态观察与手工/自动切换。
- 高可用(避免单点)
- 部署 Keepalived + Nginx 搭建 VIP,实现 Nginx 主备自动切换;Tomcat 层保持多实例即可。
- 安全与性能
- 启用 HTTPS/TLS、限制管理端口访问、开启防火墙(如 ufw)、隐藏版本信息。
- 启用 压缩(gzip)、静态资源缓存、连接复用与超时调优;按需做 动静分离(Nginx 直接服务静态资源,Tomcat 仅处理动态请求)。
快速验证与常见问题
- 验证步骤
- 部署同一应用(如包含 < %= request.getLocalAddr() %> 的测试页)到各 Tomcat 实例。
- 通过负载均衡器访问,刷新页面应看到不同实例的 IP 交替出现(轮询)。
- 停止某实例后,确认请求自动转发到健康实例;恢复后观察重新加入。
- 常见问题
- 端口冲突:多实例需确保 HTTP/AJP/Server/shutdown 端口唯一。
- 上下文路径:应用上下文(如 /app)需在 Nginx/Apache 的 location 中保持一致转发。
- 头信息缺失:未正确设置 X-Real-IP / X-Forwarded-For / X-Forwarded-Proto 会导致应用获取不到真实客户端信息或生成错误重定向。
- WebSocket:未单独为 /ws/ 前缀配置负载均衡会导致握手或长连接异常。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Tomcat在Ubuntu上如何实现负载均衡
本文地址: https://pptw.com/jishu/755834.html
