文章目录
-
- [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 不仅能够高效地处理大量并发请求,还能实现动静分离,有效提高系统的整体性能和稳定性。