实战指南:基于Nginx与TongWeb构建高可用Java应用集群

在当今互联网应用快速迭代的背景下,系统的高可用性已成为开发者必须面对的核心挑战。想象一下这样的场景:凌晨三点,你的电商应用突然因为单台服务器宕机而全面瘫痪,而此时正值促销活动高峰期——这种噩梦般的经历正是高可用架构要解决的问题。本文将带你从零开始,使用Nginx和两台TongWeb服务器,构建一个能够自动应对单点故障的生产级Java应用集群。

1. 高可用架构设计原理

高可用性(High Availability)系统的核心目标是确保服务在任何时候都能被正常访问。对于Java应用来说,这通常意味着需要解决两个关键问题: 请求分发 状态保持 。Nginx作为最流行的开源负载均衡器之一,配合TongWeb应用服务器,可以构建出性价比极高的解决方案。

传统单机部署面临的主要风险包括:

  • 硬件故障(磁盘损坏、内存故障等)
  • 网络中断
  • 应用进程崩溃
  • 系统维护时的服务不可用

我们的集群架构将采用以下设计:

客户端 → Nginx负载均衡器(主备) → [TongWeb节点A, TongWeb节点B]

表:集群组件角色说明

组件 数量 作用 高可用实现方式
Nginx 2 请求分发、健康检查 Keepalived虚拟IP漂移
TongWeb ≥2 应用运行容器 会话复制或SSO方案
共享存储 1 会话数据持久化(可选) 网络文件系统或数据库

这种架构的优势在于:

  1. 成本效益 :全部使用开源软件,无需昂贵硬件负载均衡设备
  2. 灵活性 :可根据业务增长随时扩展TongWeb节点
  3. 可靠性 :任一组件故障都不会导致服务完全中断

2. 环境准备与基础配置

2.1 服务器规划建议

对于生产环境,我们建议至少准备四台服务器(两台用于Nginx负载均衡,两台用于TongWeb应用服务)。如果资源有限,也可以采用以下混合部署方案:

  • 服务器1 :Nginx主 + TongWeb A
  • 服务器2 :Nginx备 + TongWeb B

关键配置要求:

  • 所有服务器时钟同步(配置NTP)
  • 主机名解析正确(/etc/hosts或DNS)
  • 防火墙开放必要端口(80, 443, TongWeb管理端口等)

2.2 TongWeb基础安装

在两台应用服务器上安装TongWeb,确保版本一致。安装完成后需要进行以下基础配置:

  1. 修改server.xml配置应用端口(避免冲突):
<Connector port="8080" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443" />
  1. 配置应用部署目录:
# 创建应用部署目录
mkdir -p /opt/tongweb/webapps/ROOT
# 授权
chown -R tongweb:tongweb /opt/tongweb
  1. 启动服务并验证:
systemctl start tongweb
curl -I http://localhost:8080

3. 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 weight=3 max_fails=2 fail_timeout=30s;
    server 192.168.1.102:8080 weight=2 max_fails=2 fail_timeout=30s;
    keepalive 32;
    
    # 会话保持配置(基于cookie)
    sticky cookie srv_id expires=1h 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 interval=5s fails=3 passes=2;
}

对应的,在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.conf):

vrrp_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 90

4.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 className="org.apache.catalina.ha.session.DeltaManager"
         expireSessionsOnShutdown="false"
         notifyListenersOnReplication="true"/>
         
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
    <Membership className="org.apache.catalina.tribes.membership.McastService"
                address="228.0.0.4"
                port="45564"
                frequency="500"
                dropTime="3000"/>
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
              address="auto"
              port="4000"
              selectorTimeout="100"
              maxThreads="6"/>
</Channel>

6. 性能调优与监控

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:MaxGCPauseMillis=200 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=2"

关键参数说明:

  • -Xms/-Xmx :堆内存初始和最大值(建议设为相同)
  • -XX:+UseG1GC :使用G1垃圾收集器
  • -XX:MaxGCPauseMillis :目标最大GC停顿时间

6.3 监控方案集成

推荐使用Prometheus + Grafana监控整套系统:

  1. Nginx监控:使用nginx_exporter
  2. JVM监控:使用JMX exporter
  3. 系统监控:使用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. 常见故障排查指南

在实际运维中,我们经常会遇到以下典型问题:

问题1:Nginx返回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.dump

8. 安全加固建议

生产环境部署时,务必考虑以下安全措施:

  1. Nginx安全配置

    • 禁用server tokens: server_tokens off;
    • 限制HTTP方法: if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; }
    • 配置CSP策略: add_header Content-Security-Policy "default-src 'self';"
  2. TongWeb安全加固

    • 删除默认示例应用
    • 修改管理控制台密码
    • 启用访问日志记录
  3. 系统层防护

    • 配置iptables/nftables防火墙规则
    • 定期更新系统和软件包
    • 使用非root用户运行服务
  4. 网络隔离

    • 将集群部署在内网区域
    • 配置安全组限制访问源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';

更多推荐