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 不仅能够高效地处理大量并发请求,还能实现动静分离,有效提高系统的整体性能和稳定性。
相关推荐
苹果醋339 分钟前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
群联云防护小杜3 小时前
如何给负载均衡平台做好安全防御
运维·服务器·网络·网络协议·安全·负载均衡
codeMaster__hyd6 小时前
CentOS7系统下部署tomcat,浏览器访问localhost:8080/
服务器·阿里云·tomcat
ljh5746491198 小时前
负载均衡的原理
运维·负载均衡
阿松哥哥20189 小时前
linux环境使用源码方式安装nginx(centos)
linux·nginx·centos
与君共勉1213814 小时前
Nginx 负载均衡的实现
运维·服务器·nginx·负载均衡
Monly2114 小时前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
Ttang2314 小时前
Tomcat原理(6)——tomcat完整实现
java·tomcat
okok__TXF15 小时前
Nginx + Lua脚本打配合
nginx·lua
青灯文案115 小时前
前端 HTTP 请求由 Nginx 反向代理和 API 网关到后端服务的流程
前端·nginx·http