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

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

一、Nginx 应用

Nginx是一款非常优秀的HTTP服务器软件,支持高达50,000个并发连接数的响应,拥有强大的静态资源处理能力。其运行稳定,且对内存、CPU等系统资源的消耗非常低。目前,很多大型网站都应用Nginx服务器作为后端网站程序的反向代理及负载均衡器,以提升整个站点的负载并发能力。

二、正向代理和反向代理

1.1 正向代理

1.1.1 什么是正向代理

正向代理代理的是客户端去访问服务器,目的是加快访问速度。当客户端访问一台服务器有障碍时,可以通过一台可以访问到该服务器的代理服务器来实现访问。客户端发送请求给代理服务器,代理服务器再去访问目标服务器,并将返回数据传递给客户端。正向代理可以屏蔽或隐藏客户端的信息。

1.2 反向代理(单级)

1.2.1 什么是反向代理

反向代理代理的是服务端,常用于负载均衡。反向代理服务器隐藏了服务器的信息,常用于多台服务器的分布式部署。客户端发来的请求先由反向代理服务器接收,然后按一定规则分发到具体的服务器,客户端无法知道具体是哪台服务器响应了请求。

三、负载均衡模式

1.1 轮询(Round Robin)

1.1.1 轮询算法

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

配置示例:

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

1.2 最少连接数(Least Connections)

1.2.1 最少连接数算法

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

配置示例:

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

1.3 IP 哈希(IP Hash)

1.3.1 IP 哈希算法

IP 哈希算法通过计算客户端 IP 地址的哈希值,将请求始终分配给同一台服务器,适用于需要将特定客户端的请求固定在同一台服务器上的场景。

配置示例:

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

1.4 加权轮询(Weighted Round Robin)

1.4.1 加权轮询算法

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

配置示例:

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

1.5 最少时间算法(Least Time)

1.5.1 最少时间算法

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

配置示例:

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

1.6 一致性哈希(Consistent Hashing)

1.6.1 一致性哈希算法

一致性哈希算法保证当集群中某台服务器故障时,只有部分请求会重新分配到其他服务器,而不是全部重新分配,这在缓存等场景中非常有用。

配置示例:

upstream backend {
    hash $request_uri consistent;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

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

1.1 部署Nginx负载均衡器

1.1.1 安装和配置Nginx

首先停止防火墙并关闭SELinux:

systemctl stop firewalld
setenforce 0

然后安装所需依赖,并创建Nginx用户:

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

接下来下载并解压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

创建Nginx服务:

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

启动Nginx服务并设置开机启动:

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

1.2 部署2台Tomcat应用服务器

1.2.1 Tomcat服务器配置

首先停止防火墙并关闭SELinux:

systemctl stop firewalld
setenforce 0

安装JDK:

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

配置环境变量:

vim /etc/profile

添加以下内容:

export JAVA_HOME=/usr/local/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

解压Tomcat并启动:

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

五、动静分离配置

1.1 Tomcat1 服务器配置

1.1.1 配置动态页面

在Tomcat1服务器上创建动态页面:

mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp

添加以下内容:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


JSP test1 page


<% out.println("动态页面 1,http://www.test1.com");%>


编辑server.xml文件:

vim /usr/local/tomcat/conf/server.xml

配置内容如下:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true">
	Context>
Host>

重启Tomcat:

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

1.2 Tomcat2 服务器配置

1.2.1 配置动态页面

在Tomcat2服务器上创建动态页面:

mkdir /usr/local/tomcat/tomcat1/webapps/test /usr/local/tomcat/tomcat2/webapps/test
vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp

添加以下内容:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


JSP test2 page


<% out.println("动态页面 2,http://www.test2.com");

%>


编辑server.xml文件:

vim /usr/local/tomcat/tomcat1/conf/server.xml

配置内容如下:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
Host>

重启Tomcat:

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

1.3 Nginx 服务器配置

1.3.1 配置静态页面和负载均衡

创建静态页面和静态图片目录:

echo '

这是静态页面

'
> /usr/local/nginx/html/index.html mkdir /usr/local/nginx/html/img cp /root/game.jpg /usr/local/nginx/html/img

编辑Nginx配置文件:

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

配置内容如下:

http {
    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;
        }
    }
}

六、测试效果

1.1 测试静态页面效果

在浏览器中访问:

  • 静态页面:http://192.168.10.19/
  • 静态图片:http://192.168.10.19/game.jpg

1.2 测试负载均衡效果

不断刷新浏览器访问:http://192.168.10.19/index.jsp,以测试负载均衡效果。

你可能感兴趣的:(nginx,tomcat,负载均衡)