Nginx + Tomcat 负载均衡与动静分离

文章目录

    • [Nginx + Tomcat 负载均衡与动静分离](#Nginx + Tomcat 负载均衡与动静分离)
    • [一、Nginx 应用概述](#一、Nginx 应用概述)
      • [1.1 正向代理和反向代理](#1.1 正向代理和反向代理)
        • [1.1.1 正向代理](#1.1.1 正向代理)
        • [1.1.2 反向代理](#1.1.2 反向代理)
    • [二、Nginx 负载均衡模式](#二、Nginx 负载均衡模式)
      • [2.1 轮询(Round Robin)](#2.1 轮询(Round Robin))
      • [2.2 最少连接数(Least Connections)](#2.2 最少连接数(Least Connections))
      • [2.3 IP 哈希(IP Hash)](#2.3 IP 哈希(IP Hash))
      • [2.4 加权轮询(Weighted Round Robin)](#2.4 加权轮询(Weighted Round Robin))
      • [2.5 最少时间算法(Least Time)](#2.5 最少时间算法(Least Time))
      • [2.6 一致性哈希(Consistent Hashing)](#2.6 一致性哈希(Consistent Hashing))
    • 三、规划部署负载均衡和反向代理
      • [3.1 部署 Nginx 负载均衡器](#3.1 部署 Nginx 负载均衡器)
      • [3.2 部署 Tomcat 应用服务器](#3.2 部署 Tomcat 应用服务器)
      • [3.3 动静分离配置](#3.3 动静分离配置)
    • 四、测试与优化

Nginx + Tomcat 负载均衡与动静分离

Nginx 作为高性能的 HTTP 服务器,被广泛应用于各类互联网服务中。通过结合 Tomcat 应用服务器,Nginx 可以实现负载均衡和动静分离,从而提升系统的性能与稳定性。本文将深入探讨 Nginx 在负载均衡和动静分离中的应用,并提供详细的配置示例。

一、Nginx 应用概述

Nginx 是一款功能强大的 HTTP 服务器软件,具有以下特点:

  • 支持高达 50,000 个并发连接数的响应。
  • 拥有强大的静态资源处理能力。
  • 运行稳定,资源消耗低(内存、CPU)。
  • 被广泛用于大型网站的反向代理和负载均衡,以提升站点的负载并发能力。

这些优势使得 Nginx 成为众多互联网服务的重要组成部分,特别是在处理大量并发请求和静态资源的场景中。

1.1 正向代理和反向代理

代理是 Nginx 的重要功能之一,通过代理机制可以优化网络请求的处理流程。

1.1.1 正向代理

正向代理是指代理客户端访问服务器。在客户端无法直接访问目标服务器时,可以通过正向代理服务器代为访问。这种方式可以加快访问速度,并隐藏客户端的真实信息。

正向代理的工作原理类似于一个跳板:用户无法直接访问某个网站,但可以访问代理服务器,由代理服务器代为获取内容,并将其返回给用户。目标服务器只能记录代理服务器的访问,而不知道用户的具体信息。

1.1.2 反向代理

反向代理代理的是服务器端的请求处理,常用于负载均衡。在多台服务器共同承担服务的情况下,反向代理服务器可以接收客户端的请求,并根据一定规则将请求分发给后端服务器。

反向代理隐藏了服务器的真实信息,客户端只知道请求是由代理服务器处理的,具体的处理服务器则由代理服务器根据负载均衡算法进行选择。

二、Nginx 负载均衡模式

Nginx 提供了多种负载均衡算法,以满足不同场景的需求。以下是 Nginx 支持的几种常见的负载均衡算法及其配置示例。

2.1 轮询(Round Robin)

轮询算法是 Nginx 的默认分流算法,它按顺序将请求依次分配给每一台后端服务器,直到最后一台服务器,然后重新从第一台服务器开始。这种方法简单且均匀地分配流量。

数据流向:每个请求依次被分配到下一个服务器。

特点:请求均匀分布,无视服务器的当前负载和响应时间。

配置示例

nginx 复制代码
upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

2.2 最少连接数(Least Connections)

最少连接数算法将请求分配给当前活动连接数最少的服务器,适用于请求处理时间不均匀的情况,可以有效平衡服务器的负载。

数据流向:每个请求被分配到当前连接数最少的服务器。

特点:动态均衡负载,适用于请求处理时间不一的场景。

配置示例

nginx 复制代码
upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

2.3 IP 哈希(IP Hash)

IP 哈希算法通过计算客户端 IP 地址的哈希值,将请求始终分配给同一台服务器,适用于需要保持会话状态的场景。

数据流向:每个客户端的请求固定分配到某一台服务器。

特点:有助于会话保持,但可能导致负载不均衡。

配置示例

nginx 复制代码
upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

2.4 加权轮询(Weighted Round Robin)

加权轮询算法允许为每台服务器设置权重,权重越大的服务器将会获得更多的请求。适用于服务器性能不均衡的情况。

数据流向:根据服务器设置的权重值分配请求。

特点:适用于服务器性能差异较大的场景。

配置示例

nginx 复制代码
upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com weight=1;
    server backend3.example.com weight=2;
}

2.5 最少时间算法(Least Time)

最少时间算法基于请求的响应时间,将请求分配给响应时间最短的服务器,适用于需要最大化响应速度的场景。

数据流向:每个请求分配到响应时间最短的服务器。

特点:优化最少连接算法,适用于高负载环境。

配置示例

nginx 复制代码
upstream backend {
    least_time header;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

2.6 一致性哈希(Consistent Hashing)

一致性哈希算法在集群中某台服务器故障时,只需重新分配部分请求,非常适用于缓存等场景。

数据流向:根据请求的特定参数进行哈希计算,分配请求。

特点:适用于服务器节点变动频繁的场景。

配置示例(需要第三方模块):

nginx 复制代码
upstream backend {
    hash $request_uri consistent;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

三、规划部署负载均衡和反向代理

在实际部署中,我们可以结合 Nginx 和 Tomcat 来实现高效的负载均衡和动静分离。

3.1 部署 Nginx 负载均衡器

首先,在 Nginx 服务器上安装和配置 Nginx:

bash 复制代码
systemctl stop firewalld
setenforce 0

yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx

cd /opt
tar zxvf nginx-1.20.2.tar.gz -C /opt/

cd nginx-1.20.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx \
--with-file-aio --with-http_stub_status_module --with-http_gzip_static_module \
--with-http_flv_module --with-stream --with-http_ssl_module

make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

vim /lib/systemd/system/nginx.service

配置文件示例如下:

nginx 复制代码
[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

完成后,启动并设置为开机自启:

bash 复制代码
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

3.2 部署 Tomcat 应用服务器

在 Tomcat 服务器上,安装 JDK 并部署 Tomcat:

bash 复制代码
systemctl stop firewalld
setenforce 0

tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
vim /etc/profile

export JAVA_HOME=/usr/local1/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

source /etc/profile

tar zxvf apache-tomcat-8.5.16.tar.gz
mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat

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

netstat -ntap | grep 8080

3.3 动静分离配置

在 Nginx 中进行动静分离的配置:

nginx 复制代码
upstream tomcat_server {
    server 192.168.10.23:8080 weight=1;
    server 192.168.10.22:8080 weight=1;
    server 192.168.10.22:8081 weight=1;
}

server {
    listen 80;
    server_name www.kgc.com;

    charset utf-8;

    location ~ .*\.jsp$ {
        proxy_pass http://tomcat_server;
        proxy_set_header HOST $host;   
       

 proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

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

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

四、测试与优化

通过以下步骤测试负载均衡和动静分离配置的效果:

  • 测试静态页面效果:浏览器访问 http://192.168.10.19/
  • 测试负载均衡效果:浏览器访问 http://192.168.10.19/index.jsp 并不断刷新观察分配情况。

根据实际需求,可以调整 Nginx 的负载均衡模式,以适应不同的业务场景。

location / {

root html;

index index.html index.htm;

}

}

## 四、测试与优化

通过以下步骤测试负载均衡和动静分离配置的效果:

- 测试静态页面效果:浏览器访问 `http://192.168.10.19/`
- 测试负载均衡效果:浏览器访问 `http://192.168.10.19/index.jsp` 并不断刷新观察分配情况。

根据实际需求,可以调整 Nginx 的负载均衡模式,以适应不同的业务场景。

通过以上配置和优化,Nginx 不仅能够高效地处理大量并发请求,还能实现动静分离,有效提高系统的整体性能和稳定性。
相关推荐
ajsbxi8 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
尢词20 小时前
SpringMVC
java·spring·java-ee·tomcat·maven
清风百草20 小时前
【04】【Maven项目热部署】将Maven项目热部署到远程tomcat服务器上
tomcat·maven项目热部署
JustCouvrir1 天前
macOS|前端工程部署到Nginx服务器
服务器·前端·nginx
AlbertS1 天前
使用 Let’s Encrypt 获取免费SSL证书
nginx·免费·centos7·ssl证书·let’s encrypt
航月1 天前
FTP、ISCSI、CHRONY、DNS、NFS、DOCKER、MARIADB、NGINX、PHP、CA各服务开启方法
nginx·docker·mariadb
IT-民工211101 天前
nginx监控指标有哪些
运维·nginx
蒋桐城1 天前
Tomcat 启动卡住,日志显示 At least one JAR was scanned for TLDs yet contained no TLDs.
java·tomcat
qiaosaifei1 天前
SpringBoot项目中替换指定版本的tomcat
spring boot·后端·tomcat
田猿笔记1 天前
RabbitMQ 实现消息队列负载均衡
分布式·rabbitmq·负载均衡