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

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

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

配置示例

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

2.2 最少连接数(Least Connections)

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

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

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

配置示例

upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

2.3 IP 哈希(IP Hash)

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

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

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

配置示例

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

2.4 加权轮询(Weighted Round Robin)

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

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

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

配置示例

upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com weight=1;
    server backend3.example.com weight=2;
}

2.5 最少时间算法(Least Time)

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

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

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

配置示例

upstream backend {
    least_time header;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

2.6 一致性哈希(Consistent Hashing)

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

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

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

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

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:

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

配置文件示例如下:

[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

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

chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

3.2 部署 Tomcat 应用服务器

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

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 中进行动静分离的配置:

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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部