服务器 > 服务器 > Linux

Nginx+Tomcat负载均衡集群详解

17人参与 2025-06-04 Linux

一、tomcat 基础与单节点部署

(一)tomcat 概述

名称由来:由 sun 公司詹姆斯・邓肯・戴维森开发,后贡献给 apache 软件基金会。因希望项目以能自我照顾的动物命名,最终定名为 “tomcat”(公猫),其 logo 也设计为公猫形象。早期项目名为 “catalina”,故安装后可见许多相关目录和文件。

应用场景:免费开源的轻量级 web 应用服务器,适用于中小型系统及并发用户不多的场合,是开发调试 jsp 程序的首选。虽具备处理 html 页面功能,但处理静态 html 能力不及 apache 或 nginx,通常作为 servlet 和 jsp 容器运行于后端,与前端 web 服务器(如 apache、nginx)及数据库配合工作。

(二)单节点部署案例

1. 案例环境

2. 实施准备

# 关闭防火墙
systemctl stop firewalld
setenforce 0

3. 安装 jdk

jdk(java development kit)是 java 语言的软件开发工具包,包含 jvm(java 虚拟机),用于解释 java 字节码,实现跨平台性。

jdk 版本需与 tomcat 兼容,下载对应版本的 jdk 安装包并安装。

4. 查看 jdk 安装情况

java -version

若输出 java 版本信息(如 “java version "1.8.0_171"”),则说明 jdk 已安装。

5. 安装配置 tomcat

# 解压tomcat安装包
tar xf apache-tomcat-9.0.8.tar.gz
# 移动并重命名文件夹
mv apache-tomcat-9.0.8 /usr/local/tomcat9

6. 启动 tomcat

/usr/local/tomcat9/bin/startup.sh

启动后,默认监听 8080 端口,可通过以下命令查看端口监听情况:

netstat -anpt | grep 8080

7. 访问测试

在浏览器中输入 “http://192.168.10.101:8080/”,若出现 tomcat 欢迎界面,则表示启动成功。

8. 关闭 tomcat

/usr/local/tomcat9/bin/shutdown.sh

(三)tomcat 目录与配置文件说明

主要目录

主配置文件 server.xml:

结构组成:由<server>、<service>、<connector/>、<engine>、<host>、<context>等元素构成。

关键配置:

(四)建立 java web 站点

创建站点目录

mkdir -pv /web/webapp1

创建测试页面 index.jsp

vim /web/webapp1/index.jsp

内容如下:

<%@page language="java" import="java.util.*" pageencoding="utf-8"%>
<html>
<head>
<title>jsp test1 page</title>
</head>
<body>
<%out.println("动态页面1,http://www.test1.com");%>
<div>静态页面的图片1</div><br><img src="logo.jpg">
</body>
</html>

修改 server.xml 配置

在<host>元素中添加<context>配置,将站点路径指向 /web/webapp1:

<context docbase="/web/webapp1" path="" reloadable="true"/>

重启 tomcat

/usr/local/tomcat9/bin/shutdown.sh
/usr/local/tomcat9/bin/startup.sh

访问测试

在浏览器中输入 “http://192.168.10.101:8080/”,应显示自定义的 jsp 页面内容。

二、nginx+tomcat 负载均衡与动静分离群集搭建

(一)案例分析

需求背景:单台 tomcat 存在单点故障风险,且处理静态资源效率低。nginx 具有高性能、低资源消耗的特点,可作为反向代理和负载均衡器,与 tomcat 结合实现动静分离,提升站点性能和可靠性。

拓扑架构:nginx 作为前端负载均衡器,负责处理静态资源请求和分发动态请求到后端 tomcat 服务器(tomcat1 和 tomcat2)。

(二)案例环境

主机ip 地址操作系统应用
tomcat1 服务器192.168.10.101openeuler24apache-tomcat-9.0.8
tomcat2 服务器192.168.10.102openeuler24apache-tomcat-9.0.8
nginx 服务器192.168.10.103openeuler24nginx-1.26.3

(三)tomcat2 服务器配置

关闭防火墙(同 tomcat1)

systemctl stop firewalld
setenforce 0

安装 jdk 和 tomcat(版本与 tomcat1 一致)

# 安装jdk(若未安装)
# 解压tomcat安装包
tar xf apache-tomcat-9.0.8.tar.gz
# 移动并重命名
mv apache-tomcat-9.0.8 /usr/local/tomcat9

创建站点目录并配置

mkdir -pv /web/webapp1

修改 server.xml 中的<context>配置,指向 /web/webapp1:

<context docbase="/web/webapp1" path="" reloadable="true"/>

创建测试页面 index.jsp

vim /web/webapp1/index.jsp

内容如下:

<%@page language="java" import="java.util.*" pageencoding="utf-8"%>
<html>
<head>
<title>jsp test2 page</title>
</head>
<body>
<%out.println("动态页面2,http://www.test2.com");%>
<div>动态页面的图片2</div><br><img src="logo.jpg">
</body>
</html>

启动 tomcat2 并测试

/usr/local/tomcat9/bin/startup.sh

在浏览器中输入 “http://192.168.10.102:8080/”,查看页面是否正确显示。

(四)nginx 服务器配置

关闭防火墙

systemctl stop firewalld
setenforce 0

安装依赖软件包

dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-extutils-makemaker

创建 nginx 用户

useradd -m -s /sbin/nologin nginx

解压并安装 nginx

tar zxf nginx-1.26.3.tar.gz
cd nginx-1.26.3
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-pcre
make && make install

配置 nginx.conf

vim /usr/local/nginx/conf/nginx.conf

在 http {} 块中添加负载均衡服务器列表:

upstream tomcat_server {
    server 192.168.10.101:8080 weight=1;
    server 192.168.10.102:8080 weight=1;
}

在 server {} 块中配置动静分离规则:

location ~ \.jsp$ {
    proxy_set_header host $host;
    proxy_set_header x-real-ip $remote_addr;
    proxy_set_header client-ip $remote_addr;
    proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
    proxy_pass http://tomcat_server;
}

location ~* \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
    root /usr/local/nginx/html/img;
    expires 30d;
}

location / {
    root html;
    index index.html index.htm;
}

准备静态图片

mkdir /usr/local/nginx/html/img
cp /root/logo.jpg /usr/local/nginx/html/img

测试配置文件

/usr/local/nginx/sbin/nginx -t

启动 nginx 服务

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

查看服务进程和端口

ps aux | grep nginx
netstat -anpt | grep nginx

(五)测试效果

  1. 静态页面测试:在浏览器中输入 “http://192.168.10.103/”,应显示 nginx 默认的静态页面。
  2. 负载均衡测试:在浏览器中输入 “http://192.168.10.103/index.jsp”,不断刷新页面,应交替显示 tomcat1 和 tomcat2 的测试页面,表明负载均衡生效。

三、心得

通过 nginx 与 tomcat 的结合,实现了动静分离和负载均衡,提升了 web 站点的性能、可扩展性和稳定性。nginx 高效处理静态资源,减轻了 tomcat 的压力,使其专注于动态请求处理。这种架构是现代 web 应用优化的重要实践,适用于中小型网站及高并发场景的初步搭建。在实际生产环境中,还可进一步结合缓存机制、安全策略等,进一步提升系统的可靠性和用户体验。

四、tomcat 核心组件解析

(一)server 与 service

server

<server port="8005" shutdown="shutdown">
  <!-- 包含多个service -->
</server>

service

<service name="catalina">
  <connector port="8080" protocol="http/1.1" />
  <engine name="catalina" defaulthost="localhost">
    <!-- 虚拟主机配置 -->
  </engine>
</service>

(二)connector:请求入口

功能与类型

典型 co4nnector

关键配置参6数

(三)eng1ine 与 host:请求处理与虚拟主机

engine

<engine name="catalina" defaulthost="localhost">
  <host name="localhost" appbase="webapps">
    <!-- 具体host配置 -->
  </host>
</engine>

host(虚拟主机)

示例配置

<host name="www.test.com" appbase="/data/webapps" unpackwars="true" autodeploy="true">
  <context path="/app1" docbase="/data/webapps/app1" />
</host>

(四)context:web 应用容器

功能

关键配置

(五)组件协作流程

请求链路

客户端请求 → connector(接收) → engine(路由) → host(匹配虚拟主机) → context(处理web应用) → 返回响应

示例场景

用户访问http://www.test.com/app1/index.jsp

五、nginx 负载均衡策略与优化

(一)负载均衡策略配置

轮询(默认)

upstream tomcat_server {
  server 192.168.10.101:8080;
  server 192.168.10.102:8080;
}

权重轮询(weight)

upstream tomcat_server {
  server 192.168.10.101:8080 weight=2;  # 处理2倍请求
  server 192.168.10.102:8080 weight=1;
}

ip 哈希(ip_hash)

upstream tomcat_server {
  ip_hash;
  server 192.168.10.101:8080;
  server 192.168.10.102:8080;
}

(二)健康检查机制

被动检查(默认)

upstream tomcat_server {
  server 192.168.10.101:8080 max_fails=2 fail_timeout=30s;
}

主动检查(第三方模块)

upstream tomcat_server {
  server 192.168.10.101:8080;
  check interval=5000 rise=2 fall=3 timeout=3000 type=http;
  check_http_send "get /health http/1.0\r\n\r\n";
  check_http_expect_1xx any;
}

(三)动静分离优化实践

静态资源缓存配置

location ~* \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
  root /usr/local/nginx/html/img;
  expires 30d;  # 缓存30天
  add_header cache-control "public";
}

压缩优化

http {
  gzip on;
  gzip_types text/plain text/css application/json application/javascript text/html;
  gzip_comp_level 6;  # 压缩级别(1-9,默认6)
}

防盗链配置

location ~* \.(gif|jpg|jpeg|png)$ {
  valid_referers none blocked www.test.com test.com;
  if ($invalid_referer) {
    return 403;
  }
}

六、生产环境部署注意事项

(一)安全加固

端口与防火墙

用户权限

chown -r nginx:nginx /usr/local/nginx
chown -r tomcat:tomcat /usr/local/tomcat9

https 配置

server {
  listen 443 ssl;
  server_name www.test.com;
  ssl_certificate /path/to/cert.pem;
  ssl_certificate_key /path/to/key.pem;
  ssl_protocols tlsv1.2 tlsv1.3;
  ssl_ciphers ecdhe-rsa-aes256-gcm-sha384:ecdhe-ecdsa-aes256-gcm-sha384;
}

(二)性能调优

nginx worker 进程优化

worker_processes 4;  # 假设4核cpu
events {
  worker_connections 10240;
}

tomcat 线程池调整

<connector port="8080" protocol="http/1.1">
  <executor name="tomcatexecutor" nameprefix="catalina-exec-"
            maxthreads="200" minsparethreads="20" maxsparethreads="50"
            maxqueuesize="100" />
</connector>

连接超时优化

# nginx配置
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
proxy_send_timeout 10s;
# tomcat配置(server.xml)
<connector port="8080" connectiontimeout="20000" />

(三)监控与日志

nginx 日志配置

开启访问日志和错误日志,记录详细请求信息以便排查问题:

http {
  access_log logs/access.log main;
  error_log logs/error.log error;
  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for"';
}

tomcat 日志分析

主要日志文件:

配置日志切割9,避免单文件过大:

# 使用logrotate工具
cat /etc/logrotate.d/tomcat
/usr/local/tomcat9/logs/*.log {
  daily
  rotate 7
  compress
  missingok
  notifempty
}

监控工具集成

使用 prometheus+grafana 监控 nginx 和 tomcat 的性能指标(如请求量、响应时间、服务器负载)。

nginx 可通过ngx_http_stub_status_module暴露状态数据:

location /nginx_status {
  stub_status on;
  access_log off;
  allow 127.0.0.1;
  deny all;
}

七、常见问题与解决方案

(一)动态页面无法访问

排查步骤

查看日志

常见原因

(二)静态资11源加载失败

排查步骤

解决方案

修正rootalias路径,确保与实际文件路径一致(root为绝对路径,alias为自定义路径)。

赋予目录读权限:

chmod -r o+r /usr/local/nginx/html/img

(三)负载均衡未生效

排查步骤

常见原因

八、扩展与高可用架构

(一)增加 tomcat 节点

步骤说明

新增 tomcat 服务器(如 192.168.10.104),重复 “tomcat2 服务器配置” 步骤,确保 jdk 和 tomcat 版本一致,站点目录和测试页面配置正确。

修改 nginx 的upstream配置,添加新节点:

upstream tomcat_server {
  server 192.168.10.101:8080 weight=1;
  server 192.168.10.102:8080 weight=1;
  server 192.168.10.104:8080 weight=1;  # 新增节点
}

session 共享方案

问题背景:负载均衡场景下,若客户端请求被分发到不同 tomcat 节点,未共享的 session 会导致用户状态丢失。

解决方案

<cluster classname="org.apache.catalina.ha.tcp.simpletcpcluster"/>
# 添加maven依赖(tomcat 9为例)
<dependency>
  <groupid>com.orangefunction</groupid>
  <artifactid>tomcat-redis-session-manager</artifactid>
  <version>2.0.3</version>
</dependency>

配置context.xml

<context>
  <manager classname="com.orangefunction.tomcat.redissessions.redissessionhandlervalve"/>
  <sessionhandler classname="com.orangefunction.tomcat.redissessions.redissessionhandler"
                 host="192.168.10.105" port="6379" database="0" />
</context>

(二)nginx 高可用(主从 / 集群)

主从模式(keepalived)

安装 keepalived

dnf install -y keepalived

主节点配置(/etc/keepalived/keepalived.conf)

global_defs {
  router_id nginx_master
}
vrrp_instance vi_1 {
  state master
  interface eth0  # 绑定网卡
  virtual_router_id 51  # 虚拟路由id(主从一致)
  priority 100       # 主节点优先级(备用节点设为90)
  advert_int 1       # 心跳间隔(秒)
  authentication {
    auth_type pass
    auth_pass 123456
  }
  virtual_ipaddress {
    192.168.10.200  # 虚拟ip
  }
}

备用节点配置:除state改为backuppriority降低外,其余与主节点一致。

健康检查脚本:在 keepalived 中配置脚本检测 nginx 进程,若主节点 nginx 停止,自动切换至备用节点:

script_check_nginx.sh:
#!/bin/bash
if [ $(ps -c nginx --no-header | wc -l) -eq 0 ]; then
  systemctl stop keepalived
fi
vrrp_script check_nginx {
  script "/etc/keepalived/script_check_nginx.sh"
  interval 2
}

nginx 集群(多节点负载均衡)

(三)日志集中管理

elk stack 方案

组件说明:

nginx 日志输出到 logstash

log_format json_log '{"time":"$time_iso8601",'
                    '"remote_addr":"$remote_addr",'
                    '"request":"$request",'
                    '"status":"$status",'
                    '"body_bytes_sent":"$body_bytes_sent",'
                    '"http_referer":"$http_referer",'
                    '"http_user_agent":"$http_user_agent"}';

access_log /usr/local/nginx/logs/access.json json_log;

logstash 配置

input {
  file {
    path => "/usr/local/nginx/logs/access.json"
    type => "nginx"
    codec => json_lines
  }
}
output {
  elasticsearch {
    hosts => ["192.168.10.106:9200"]
    index => "nginx-%{+yyyy.mm.dd}"
  }
}

(四)自动化部署与监控

ci/cd 流程

使用 jenkins 或 gitlab ci 实现代码自动构建、测试和部署:

prometheus+grafana 监控

采集指标

prometheus 配置

scrape_configs:
  - job_name: "nginx"
    static_configs:
      - targets: ["192.168.10.103:80"]
  - job_name: "tomcat"
    static_configs:
      - targets: ["192.168.10.101:8009", "192.168.10.102:8009"]  # tomcat jmx端口

九、成本优化与性能对比

(一)硬件资源规划

组件最低配置(开发环境)推荐配置(生产环境)
nginx 服务器2 核 cpu,4gb 内存,50gb 磁盘4 核 cpu,8gb 内存,100gb ssd
tomcat 服务器2 核 cpu,4gb 内存,100gb 磁盘4-8 核 cpu,16gb 内存,200gb ssd
数据库服务器4 核 cpu,8gb 内存,200gb 磁盘8 核 cpu,32gb 内存,500gb ssd

(二)性能对比(压测数据参考)

场景单 tomcat 节点nginx+tomcat 集群(2 节点)
静态资源请求(rps)5000+10000+
动态 jsp 请求(rps)800-10001500-2000
内存占用800mb-1.2gb每 tomcat 节点 800mb-1.2gb,nginx 200mb

说明:

十、总结与最佳实践

(一)核心价值

(二)最佳实践清单

开发阶段

启用 tomcat 的reloadable=true(仅开发环境),方便代码修改后自动重启。

使用 nginx 的proxy_next_upstream配置,实现故障节点请求重试:

proxy_next_upstream error timeout http_500;

生产阶段

维护阶段

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

您想发表意见!!点此发布评论

推荐阅读

在Linux上安装Nvidia显卡驱动的详细步骤

06-04

Ubuntu无网络连接/无网络标识的解决方案

06-04

Ubuntu无法联网/上网的排查步骤和解决方法

06-04

Nginx配置实战之手把手教你搞定生产级配置

06-04

Linux查找命令@which、find的使用方式

06-04

Linux基础命令@grep、wc、管道符的使用详解

06-03

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论