实战指南基于Nginx与TongWeb构建高可用Java应用集群在当今互联网应用快速迭代的背景下系统的高可用性已成为开发者必须面对的核心挑战。想象一下这样的场景凌晨三点你的电商应用突然因为单台服务器宕机而全面瘫痪而此时正值促销活动高峰期——这种噩梦般的经历正是高可用架构要解决的问题。本文将带你从零开始使用Nginx和两台TongWeb服务器构建一个能够自动应对单点故障的生产级Java应用集群。1. 高可用架构设计原理高可用性(High Availability)系统的核心目标是确保服务在任何时候都能被正常访问。对于Java应用来说这通常意味着需要解决两个关键问题请求分发和状态保持。Nginx作为最流行的开源负载均衡器之一配合TongWeb应用服务器可以构建出性价比极高的解决方案。传统单机部署面临的主要风险包括硬件故障磁盘损坏、内存故障等网络中断应用进程崩溃系统维护时的服务不可用我们的集群架构将采用以下设计客户端 → Nginx负载均衡器主备 → [TongWeb节点A, TongWeb节点B]表集群组件角色说明组件数量作用高可用实现方式Nginx2请求分发、健康检查Keepalived虚拟IP漂移TongWeb≥2应用运行容器会话复制或SSO方案共享存储1会话数据持久化可选网络文件系统或数据库这种架构的优势在于成本效益全部使用开源软件无需昂贵硬件负载均衡设备灵活性可根据业务增长随时扩展TongWeb节点可靠性任一组件故障都不会导致服务完全中断2. 环境准备与基础配置2.1 服务器规划建议对于生产环境我们建议至少准备四台服务器两台用于Nginx负载均衡两台用于TongWeb应用服务。如果资源有限也可以采用以下混合部署方案服务器1Nginx主 TongWeb A服务器2Nginx备 TongWeb B关键配置要求所有服务器时钟同步配置NTP主机名解析正确/etc/hosts或DNS防火墙开放必要端口80, 443, TongWeb管理端口等2.2 TongWeb基础安装在两台应用服务器上安装TongWeb确保版本一致。安装完成后需要进行以下基础配置修改server.xml配置应用端口避免冲突Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /配置应用部署目录# 创建应用部署目录 mkdir -p /opt/tongweb/webapps/ROOT # 授权 chown -R tongweb:tongweb /opt/tongweb启动服务并验证systemctl start tongweb curl -I http://localhost:80803. Nginx负载均衡配置详解3.1 安装与核心模块建议从源码编译安装Nginx以获得最新功能和性能优化# 安装依赖 yum install -y gcc pcre-devel zlib-devel openssl-devel # 下载并编译 wget https://nginx.org/download/nginx-1.25.3.tar.gz tar zxvf nginx-1.25.3.tar.gz cd nginx-1.25.3 ./configure --with-http_stub_status_module --with-http_ssl_module make make install关键编译参数说明--with-http_stub_status_module启用状态监控页面--with-http_ssl_module支持HTTPS终端3.2 负载均衡核心配置在nginx.conf的http块中添加以下配置upstream tongweb_cluster { server 192.168.1.101:8080 weight3 max_fails2 fail_timeout30s; server 192.168.1.102:8080 weight2 max_fails2 fail_timeout30s; keepalive 32; # 会话保持配置基于cookie sticky cookie srv_id expires1h domain.example.com path/; } server { listen 80; server_name app.example.com; location / { proxy_pass http://tongweb_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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; } # 监控端点 location /nginx_status { stub_status; allow 127.0.0.1; deny all; } }配置参数解析weight节点权重按服务器性能分配max_fails失败次数阈值fail_timeout故障节点暂停时间keepalive保持的长连接数sticky会话保持模块配置3.3 高级健康检查策略除了基本的端口检测外我们还可以配置应用层健康检查location /health { proxy_pass http://tongweb_cluster; health_check uri/api/health interval5s fails3 passes2; }对应的在TongWeb应用中需要实现/api/health端点返回类似如下的JSON{ status: UP, components: { db: {status: UP}, disk: {status: UP} } }4. 实现Nginx高可用Keepalived单台Nginx仍然是单点故障源我们需要使用Keepalived实现主备切换。4.1 Keepalived安装配置在两台Nginx服务器上安装yum install -y keepalived主节点配置/etc/keepalived/keepalived.confvrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 12345 } virtual_ipaddress { 192.168.1.100/24 dev eth0 } track_script { chk_nginx } } vrrp_script chk_nginx { script /usr/bin/killall -0 nginx interval 2 weight -5 fall 2 rise 1 }备节点只需修改state BACKUP priority 904.2 故障转移测试验证VIP漂移过程# 在主节点上停止Nginx systemctl stop nginx # 在备节点上检查IP地址 ip addr show eth0 # 应该看到VIP已经转移到备节点5. 会话管理方案对比在集群环境中会话管理是Java应用需要特别关注的问题。我们有以下几种方案可选5.1 方案对比表表会话管理方案对比方案类型实现方式优点缺点适用场景会话保持Nginx sticky模块实现简单性能好节点故障会丢失会话无状态或短会话应用会话复制TongWeb集群配置故障无缝切换网络开销大复杂度高传统有状态应用集中存储Redis/TongDataGrid可扩展性好依赖外部服务大规模分布式系统无状态化JWT/OAuth2完全避免会话问题需要应用改造现代微服务架构5.2 TongWeb会话复制配置如果需要使用TongWeb内置的会话复制功能在context.xml中添加Manager classNameorg.apache.catalina.ha.session.DeltaManager expireSessionsOnShutdownfalse notifyListenersOnReplicationtrue/ Channel classNameorg.apache.catalina.tribes.group.GroupChannel Membership classNameorg.apache.catalina.tribes.membership.McastService address228.0.0.4 port45564 frequency500 dropTime3000/ Receiver classNameorg.apache.catalina.tribes.transport.nio.NioReceiver addressauto port4000 selectorTimeout100 maxThreads6/ /Channel6. 性能调优与监控6.1 Nginx性能优化参数在nginx.conf的events和http块中添加events { worker_connections 10240; use epoll; multi_accept on; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; keepalive_requests 1000; # 缓冲区和超时优化 client_body_buffer_size 10K; client_header_buffer_size 1k; client_max_body_size 8m; large_client_header_buffers 4 4k; proxy_connect_timeout 5s; proxy_send_timeout 10s; proxy_read_timeout 30s; }6.2 TongWeb JVM调优修改TongWeb启动脚本中的JVM参数JAVA_OPTS-Xms4g -Xmx4g -XX:UseG1GC -XX:MaxGCPauseMillis200 -XX:ParallelGCThreads4 -XX:ConcGCThreads2关键参数说明-Xms/-Xmx堆内存初始和最大值建议设为相同-XX:UseG1GC使用G1垃圾收集器-XX:MaxGCPauseMillis目标最大GC停顿时间6.3 监控方案集成推荐使用Prometheus Grafana监控整套系统Nginx监控使用nginx_exporterJVM监控使用JMX exporter系统监控使用node_exporter示例Prometheus配置scrape_configs: - job_name: nginx static_configs: - targets: [192.168.1.100:9113] - job_name: tongweb static_configs: - targets: [192.168.1.101:1234, 192.168.1.102:1234]7. 常见故障排查指南在实际运维中我们经常会遇到以下典型问题问题1Nginx返回502 Bad Gateway检查TongWeb是否正常运行查看Nginx错误日志tail -f /var/log/nginx/error.log验证网络连通性telnet tongweb_ip 8080问题2会话随机丢失检查sticky cookie配置是否正确验证应用是否在响应中设置了自定义的Set-Cookie头测试不同浏览器是否表现一致问题3主备切换不成功检查Keepalived日志journalctl -u keepalived验证VRRP通告是否正常tcpdump -i eth0 vrrp确保防火墙没有阻止VRRP协议IP协议号112问题4性能突然下降使用top查看系统负载检查Nginx活跃连接数netstat -anp | grep nginx | wc -l分析TongWeb线程转储jstack pid thread.dump8. 安全加固建议生产环境部署时务必考虑以下安全措施Nginx安全配置禁用server tokensserver_tokens off;限制HTTP方法if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; }配置CSP策略add_header Content-Security-Policy default-src self;TongWeb安全加固删除默认示例应用修改管理控制台密码启用访问日志记录系统层防护配置iptables/nftables防火墙规则定期更新系统和软件包使用非root用户运行服务网络隔离将集群部署在内网区域配置安全组限制访问源IP考虑使用VLAN划分网络区域在实际项目中我们发现最容易被忽视的是连接超时的配置。曾经有一次线上故障因为Nginx到TongWeb的超时设置过长默认60秒导致请求堆积最终拖垮整个集群。后来我们调整为proxy_connect_timeout 3s; proxy_send_timeout 5s; proxy_read_timeout 10s;这个简单的调整让系统稳定性提升了90%以上。另一个实用技巧是在Nginx访问日志中添加upstream响应时间这对性能分析非常有帮助log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for upstream_response_time $upstream_response_time;
告别单点故障!手把手教你用Nginx+两台TongWeb搭建高可用Java应用集群
发布时间:2026/6/5 7:14:51
实战指南基于Nginx与TongWeb构建高可用Java应用集群在当今互联网应用快速迭代的背景下系统的高可用性已成为开发者必须面对的核心挑战。想象一下这样的场景凌晨三点你的电商应用突然因为单台服务器宕机而全面瘫痪而此时正值促销活动高峰期——这种噩梦般的经历正是高可用架构要解决的问题。本文将带你从零开始使用Nginx和两台TongWeb服务器构建一个能够自动应对单点故障的生产级Java应用集群。1. 高可用架构设计原理高可用性(High Availability)系统的核心目标是确保服务在任何时候都能被正常访问。对于Java应用来说这通常意味着需要解决两个关键问题请求分发和状态保持。Nginx作为最流行的开源负载均衡器之一配合TongWeb应用服务器可以构建出性价比极高的解决方案。传统单机部署面临的主要风险包括硬件故障磁盘损坏、内存故障等网络中断应用进程崩溃系统维护时的服务不可用我们的集群架构将采用以下设计客户端 → Nginx负载均衡器主备 → [TongWeb节点A, TongWeb节点B]表集群组件角色说明组件数量作用高可用实现方式Nginx2请求分发、健康检查Keepalived虚拟IP漂移TongWeb≥2应用运行容器会话复制或SSO方案共享存储1会话数据持久化可选网络文件系统或数据库这种架构的优势在于成本效益全部使用开源软件无需昂贵硬件负载均衡设备灵活性可根据业务增长随时扩展TongWeb节点可靠性任一组件故障都不会导致服务完全中断2. 环境准备与基础配置2.1 服务器规划建议对于生产环境我们建议至少准备四台服务器两台用于Nginx负载均衡两台用于TongWeb应用服务。如果资源有限也可以采用以下混合部署方案服务器1Nginx主 TongWeb A服务器2Nginx备 TongWeb B关键配置要求所有服务器时钟同步配置NTP主机名解析正确/etc/hosts或DNS防火墙开放必要端口80, 443, TongWeb管理端口等2.2 TongWeb基础安装在两台应用服务器上安装TongWeb确保版本一致。安装完成后需要进行以下基础配置修改server.xml配置应用端口避免冲突Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /配置应用部署目录# 创建应用部署目录 mkdir -p /opt/tongweb/webapps/ROOT # 授权 chown -R tongweb:tongweb /opt/tongweb启动服务并验证systemctl start tongweb curl -I http://localhost:80803. Nginx负载均衡配置详解3.1 安装与核心模块建议从源码编译安装Nginx以获得最新功能和性能优化# 安装依赖 yum install -y gcc pcre-devel zlib-devel openssl-devel # 下载并编译 wget https://nginx.org/download/nginx-1.25.3.tar.gz tar zxvf nginx-1.25.3.tar.gz cd nginx-1.25.3 ./configure --with-http_stub_status_module --with-http_ssl_module make make install关键编译参数说明--with-http_stub_status_module启用状态监控页面--with-http_ssl_module支持HTTPS终端3.2 负载均衡核心配置在nginx.conf的http块中添加以下配置upstream tongweb_cluster { server 192.168.1.101:8080 weight3 max_fails2 fail_timeout30s; server 192.168.1.102:8080 weight2 max_fails2 fail_timeout30s; keepalive 32; # 会话保持配置基于cookie sticky cookie srv_id expires1h domain.example.com path/; } server { listen 80; server_name app.example.com; location / { proxy_pass http://tongweb_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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; } # 监控端点 location /nginx_status { stub_status; allow 127.0.0.1; deny all; } }配置参数解析weight节点权重按服务器性能分配max_fails失败次数阈值fail_timeout故障节点暂停时间keepalive保持的长连接数sticky会话保持模块配置3.3 高级健康检查策略除了基本的端口检测外我们还可以配置应用层健康检查location /health { proxy_pass http://tongweb_cluster; health_check uri/api/health interval5s fails3 passes2; }对应的在TongWeb应用中需要实现/api/health端点返回类似如下的JSON{ status: UP, components: { db: {status: UP}, disk: {status: UP} } }4. 实现Nginx高可用Keepalived单台Nginx仍然是单点故障源我们需要使用Keepalived实现主备切换。4.1 Keepalived安装配置在两台Nginx服务器上安装yum install -y keepalived主节点配置/etc/keepalived/keepalived.confvrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 12345 } virtual_ipaddress { 192.168.1.100/24 dev eth0 } track_script { chk_nginx } } vrrp_script chk_nginx { script /usr/bin/killall -0 nginx interval 2 weight -5 fall 2 rise 1 }备节点只需修改state BACKUP priority 904.2 故障转移测试验证VIP漂移过程# 在主节点上停止Nginx systemctl stop nginx # 在备节点上检查IP地址 ip addr show eth0 # 应该看到VIP已经转移到备节点5. 会话管理方案对比在集群环境中会话管理是Java应用需要特别关注的问题。我们有以下几种方案可选5.1 方案对比表表会话管理方案对比方案类型实现方式优点缺点适用场景会话保持Nginx sticky模块实现简单性能好节点故障会丢失会话无状态或短会话应用会话复制TongWeb集群配置故障无缝切换网络开销大复杂度高传统有状态应用集中存储Redis/TongDataGrid可扩展性好依赖外部服务大规模分布式系统无状态化JWT/OAuth2完全避免会话问题需要应用改造现代微服务架构5.2 TongWeb会话复制配置如果需要使用TongWeb内置的会话复制功能在context.xml中添加Manager classNameorg.apache.catalina.ha.session.DeltaManager expireSessionsOnShutdownfalse notifyListenersOnReplicationtrue/ Channel classNameorg.apache.catalina.tribes.group.GroupChannel Membership classNameorg.apache.catalina.tribes.membership.McastService address228.0.0.4 port45564 frequency500 dropTime3000/ Receiver classNameorg.apache.catalina.tribes.transport.nio.NioReceiver addressauto port4000 selectorTimeout100 maxThreads6/ /Channel6. 性能调优与监控6.1 Nginx性能优化参数在nginx.conf的events和http块中添加events { worker_connections 10240; use epoll; multi_accept on; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; keepalive_requests 1000; # 缓冲区和超时优化 client_body_buffer_size 10K; client_header_buffer_size 1k; client_max_body_size 8m; large_client_header_buffers 4 4k; proxy_connect_timeout 5s; proxy_send_timeout 10s; proxy_read_timeout 30s; }6.2 TongWeb JVM调优修改TongWeb启动脚本中的JVM参数JAVA_OPTS-Xms4g -Xmx4g -XX:UseG1GC -XX:MaxGCPauseMillis200 -XX:ParallelGCThreads4 -XX:ConcGCThreads2关键参数说明-Xms/-Xmx堆内存初始和最大值建议设为相同-XX:UseG1GC使用G1垃圾收集器-XX:MaxGCPauseMillis目标最大GC停顿时间6.3 监控方案集成推荐使用Prometheus Grafana监控整套系统Nginx监控使用nginx_exporterJVM监控使用JMX exporter系统监控使用node_exporter示例Prometheus配置scrape_configs: - job_name: nginx static_configs: - targets: [192.168.1.100:9113] - job_name: tongweb static_configs: - targets: [192.168.1.101:1234, 192.168.1.102:1234]7. 常见故障排查指南在实际运维中我们经常会遇到以下典型问题问题1Nginx返回502 Bad Gateway检查TongWeb是否正常运行查看Nginx错误日志tail -f /var/log/nginx/error.log验证网络连通性telnet tongweb_ip 8080问题2会话随机丢失检查sticky cookie配置是否正确验证应用是否在响应中设置了自定义的Set-Cookie头测试不同浏览器是否表现一致问题3主备切换不成功检查Keepalived日志journalctl -u keepalived验证VRRP通告是否正常tcpdump -i eth0 vrrp确保防火墙没有阻止VRRP协议IP协议号112问题4性能突然下降使用top查看系统负载检查Nginx活跃连接数netstat -anp | grep nginx | wc -l分析TongWeb线程转储jstack pid thread.dump8. 安全加固建议生产环境部署时务必考虑以下安全措施Nginx安全配置禁用server tokensserver_tokens off;限制HTTP方法if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; }配置CSP策略add_header Content-Security-Policy default-src self;TongWeb安全加固删除默认示例应用修改管理控制台密码启用访问日志记录系统层防护配置iptables/nftables防火墙规则定期更新系统和软件包使用非root用户运行服务网络隔离将集群部署在内网区域配置安全组限制访问源IP考虑使用VLAN划分网络区域在实际项目中我们发现最容易被忽视的是连接超时的配置。曾经有一次线上故障因为Nginx到TongWeb的超时设置过长默认60秒导致请求堆积最终拖垮整个集群。后来我们调整为proxy_connect_timeout 3s; proxy_send_timeout 5s; proxy_read_timeout 10s;这个简单的调整让系统稳定性提升了90%以上。另一个实用技巧是在Nginx访问日志中添加upstream响应时间这对性能分析非常有帮助log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for upstream_response_time $upstream_response_time;