tomcat + nginx 的 负载均衡和动静分离集群

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: tomcat + nginx 的 负载均衡和动静分离集群

一 概述


1.1 什么是集群

所谓集群是指一组独立的计算机系统构成的一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信,对外表现为一个整体,对外提供相同 的服务。应用程序可以通过网络共享内存进行消息传送,实现分布式计算机。通俗一点来说,就是让若干台计算机联合起来工作(服务),可以是并行的,也可以是做备份。


1.2 集群的特点

高性价比,高性能,负载均衡,高可靠,可伸缩性…


当服务器的性能达到瓶颈,我们可以纵向扩展,也就是添加或者替换高性能CPU,添加内存等操作。但是这些随着性能的提升,价格也在提高。并且,始终有一天性能会达到瓶颈,无法满足服务需求。并且,单台服务器负载压力大,同时,无法进满足高可用的需求


此时,我们就可以选择横向扩展,将多个普通的服务器做成 一个集群,让它们处理同一任务,相比于同等性能大型计算机,性价比更高

同时集群中的每一台计算机资源可以被充分利用,实现复杂的运算并进行处理.大大的提高了性能。

同时,负载压力根据某种算法,被分配到整个集群的多台服务器上一起处理,让集群中的服务器可以负载均衡,减轻了服务器的压力,降低了对服务器的硬件和软件的要求

并且,我们可以利用集群管理软件,对重要的服务器进行冗余备份,提升可靠性,当主服务器故障时,备份的服务器可以在自动接管主服务器的工作,从而实现不间断的服务

当服务负载,压力增长时,我们可以向集群中添加服务器。当负载减少,我们可以从集群中剔除相应的服务器。所以,集群相比于高性能服务器,大型计算机而言,更具有可伸缩性


1.3 集群常见的分类

集群根据架构功能和结构,主要有三类


负载均衡集群 (LB): 提高应用系统的响应能力,尽可能多的处理更多的访问请求,减少延迟为目标,获得高并发,高负载的整体性能

高可用性集群(HA): 提高系统的可靠性,尽可能减少中断时间为目标,确保服务的连续性,达到高可用(HA)的容错效果

高性能集群(HP):以提高应用系统的CPU运算速度,扩展硬件资源和分析能力为目标,获得相当于大型,超级计算机的高性能运算能力


1.4 动静分离与负载均衡

为什么使用动静分离

nginx比较擅长处理静态页面,其效率是tomcat的6倍左右,但是nginx不善于处理动态页面。 而tomcat 更擅长处理动态页面。

静态页面内容相对稳定,容易被检索,同时,由于用户浏览是不需要经过程序的处理,所以浏览速度最快。但是,制作和维护工作量比较大。

当网站内容更新频繁时访问量非常大,内容变动频繁时,就需要使用动态。但是动态页面需要访问数据库,当访问量非常大,对程序需要处理的数据量就非常大,容易造成网站不稳定甚至瘫痪

因此,我们需要使用动静分离来管理网站。

为什么使用负载均衡

动态网站的页面上的信息都必须从数据库中读取,每打开一个页面就读取数据库一次,如果访问网站的人数很多,这会对服务器增加很大的荷载,从而影响这个网站的运行速度。所以,我们可以利用负载均衡集群,降低服务器的负载。


1.5 nginx 的反向代理实现负载均衡

nginx可以充当反向代理服务器实现负载均衡。


当nginx 进程反向代理时,其可以工作在第四层传输层,也可以工作在第七层应用层。


七层反向代理是基于 http,https.mail,等协议代理转发。


四层反向代理是基于 IP + PORT(TCP/UDP)转发


复制http {
    ....
    upstream 服务池名 {          #配置后端服务器池,以提供响应数据
         server  后端服务器ip:端口
     }
    server {
        locaton {
            .......
            proxy_pass http://服务池名    #配置将访问请求转发给后端服务器池的服务器处理
            }
   .....
    }
}


4 层 代理主要参数

复制#需要开启 --with-stream 模块
stream {                    #和http 在同一级,一般在 http上面设置
    upstream  服务池名 {
        server    后端服务器ip:端口  
    }
    server {
      listen  端口      #代理服务器监听端口,当用户访问这个端口时,就转发给动态web服务器
      proxy_pass 服务池名
    }
}
http {
  ...... 
}


轮询 RR( 默认):每个请求按照时间顺序注意分配到不同的后端服务器,如果超过了最大失败次数后(max_falils , 默认1 ) 在失效的时间内(fail_timeout,默认10秒) ,该节点失效,权重变为0,超过失效时间后,则恢复正常,或者全部节点都为down后,那么将所有的节点都恢复我i有效继续探测

加权轮询 WRR :weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

最少连接 least_conn :优先将客户端的反复问请求调度到当前最少连接的服务器

ip_hash :每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是会造成负载不均。不建议使用。session共享问题可以通过后端服务器的session共享来解决

fair (第三方) : 按后端服务器的响应时间来分配请求,响应时间短的优先分配。nginx 本身不支持fair,需要使用upstream_fair 模块

url_hash (第三方):按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,也会造成负载不均的情况。后端服务器为缓存时比较有效


1.6 nginx 动静分离原理

服务端接收来自客户端的请求中,既有动态资源,也有静态资源。静态资源由ngixn提供服务。动态资源由nginx 转发到后端tomcat 服务器。


静态页面一般 有html,htm,css 等路径, 动态页面则一般是jsp ,php 等路径。nginx 在站点的location 中 通过正则,或者 前缀,或者 后缀等方法匹配。当匹配到用户访问路径中有 jsp 时,则转发给后端的处理动态资源的web服务器处理。如果匹配到的路径中有 html 时,则nginx 自己处理。


192.168.23.12 部署tomcat 服务


192.168.23.13 部署tomcat 服务


192.168.23.103 部署nginx 反向代理


二、试验部署


2.1 部署nginx 负载均衡器

复制#host 192.168.23.103 部署nginx 
systemctl stop firewalld
setenforce 0
yum -y install pcre pcre-devel zliv-devel openssl-devel gcc gcc-c++ make 
useradd -M -s /sbin/nologin nginx
cd /opt/
tar -zxvf nginx-1.12.0.tar.gz  -C /opt/
cd nginx-1.12.0/
./configure  \
--prefix=/usr/local/nginx   \
--user=nginx \
--group=nginx \
--with-file-aio  \      # 启用文件修改支持
--with-http_stub_status_module \    #启用状态统计
--with-http_gzip_static_module \    #启用gzip 静态压缩
--with-http_flv_module \            #启用flv 模块,提供对视频的伪流支持
--with-http_ssl_module --with-stream   #启用stream 模块,提供4层调度
make && make install 
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
vim /lib/systemd/system/nginx.service
[Util]
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
systemctl enable nginx 
netstat -natop | grep :80


2.2 部署java环境

复制#192.168.23.12
#192.168.23.13
 systemctl stop firewalld
 setenforce 0
 tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
 vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JAR_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib/:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source /etc/profile.d/java.sh
java -version


安装tomcat

复制#192.168.23.13
#192.168.23.12
tar zxvf apache-tomcat-9.0.16.tar.gz
mv /opt/apache-tomcat-9.0.16  /usr/local/tomcat
/usr/local/tomcat/bin/startup.sh
netstat  -natp | grep java


2.3 配置动静分离

(1) tomcat 1 192.168.23.12 设置

修改网页页面

复制mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>   #指定为 test1 页面
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>


修改xml 文件

复制vim /usr/local/tomcat/conf/server.xml
----- 修改 148行的Host-----
<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>在文件末尾的倒数第4行


重启tomcat 服务

复制/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
 netstat  -natp | grep java
复制 mkdir  /usr/local/tomcat/webapps/test/
 vim   /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>   
</head>
<body>
<% out.println("动态页面 2,http://www.test1.com");%>
</body>
</html>


复制vim /usr/local/tomcat/conf/server.xml
----- 修改 148行的Host-----
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true"  xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test"  path="" reloadable="true">
</Context></Context>


(3) 配置Nginx server 192.168.23.103 配置

复制#准备静态页面和静态图片
echo '<html><body><h1>这是静态页面</h1></body></html>'  > /usr/local/nginx/html/index.html
mkdir /usr/local/nginx/html/img
#将静态图片传到该目录
复制
vim /usr/local/nginx/conf/nginx.conf
http {
   ........
    upstream tomcat_server {
         server 192.168.23.12:8080  weight=1;
         server 192.168.23.13:8080  weight=1;
    }
   server {
        listen       80;
        server_name  www.mynet.com;
        charset utf-8;
        #nginx 处理动态页面请求,将.jsp 文件请求转发到tomcat 服务器处理
        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;
       }
       #配置nginx 处理静态图片请求
       location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
                root /usr/local/nginx/html/img;
                expires 10d;
      }
       location / {
            root   html;
            index  index.html index.htm;
        }
      ......
   }
   .......
}


配置项解释

复制    location ~ .*\.jsp$ {
            proxy_pass http://tomcat_server;
#设置后端web 服务器可以虎丘远程客户端的真实IP
#设定后端的web 服务器 接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass设置的主机名。如果反向代理服务器不重写改请求头的话,那么后端真是服务器在处理时会认为所有的请求都来自反向代理服务器。如果后端有防攻击策略,则反向代理服务器就会被后端封掉
            proxy_set_header HOST $host;
 #把$remote_addr 赋值给X-Real-IP ,来获取源IP
            proxy_set_header X-Real-IP  $remote_addr;
 #在nginx 作为代理服务器时,设置的IP列表会把经过的机器ip,代理机器ip都记录下来
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   }


(4)测试动静分离

复制firefox http://192.168.23.103   #测试静态页面
firefox http://192.168.23.103/picture.jpg   #测试静态图片
firefox http://192.168.23.103/index.jsp    #测试动态页面


三、配置nginx 的4层反向代理


前提:


nginx 的 4层反向代理,需要 开启 stream 模块. 在 编译安装nginx 时,需要加上 --with-stream 项


3.1 修改主配置文件,实现4 层反向代理

复制cp -p /usr/local/nginx/conf/nginx.conf{,.bak} 
cp -p /usr/local/nginx/conf/nginx.conf.default /usr/local/nginx/conf/nginx.conf
vim /usr/local/nginx/conf/nginx.conf
stream {           
    upstream appserver {
         server 192.168.23.12:8080 weight=1;
         server 192.168.23.13:8080 weight=2;
    }
    server {
        listen 8080;
        proxy_pass appserver;
    }
}

重载配置文件并访问测试

复制nginx -s reload
curl   http://192.168.23.103:8080
curl   http://192.168.23.103:8080
curl   http://192.168.23.103:8080
#访问3次,并且每次访问时间要有间隔,因为四层转发有连接保持的效果
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
1月前
|
负载均衡 算法 搜索推荐
Nginx 常用的负载均衡算法
【10月更文挑战第17天】在实际应用中,我们需要根据具体的情况来选择合适的负载均衡算法。同时,还可以结合其他的优化措施,如服务器健康检查、动态调整权重等,来进一步提高负载均衡的效果和系统的稳定性。
114 59
|
1月前
|
负载均衡 应用服务中间件 Linux
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
这篇博客文章详细介绍了Nginx的下载、安装、配置以及使用,包括正向代理、反向代理、负载均衡、动静分离等高级功能,并通过具体实例讲解了如何进行配置。
160 4
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
|
28天前
|
负载均衡 算法 应用服务中间件
Nginx 常用的负载均衡算法
【10月更文挑战第22天】不同的负载均衡算法各有特点和适用场景。在实际应用中,需要根据具体的业务需求、服务器性能和网络环境等因素来选择合适的算法。
34 3
|
1月前
|
负载均衡 监控 应用服务中间件
除了 Nginx,还有以下一些常见的负载均衡工具
【10月更文挑战第17天】这些负载均衡工具各有特点和优势,在不同的应用场景中发挥着重要作用。选择合适的负载均衡工具需要综合考虑性能、功能、稳定性、成本等因素。
|
1月前
|
负载均衡 应用服务中间件 nginx
Nginx的6大负载均衡策略及权重轮询手写配置
【10月更文挑战第9天】 Nginx是一款高性能的HTTP服务器和反向代理服务器,它在处理大量并发请求时表现出色。Nginx的负载均衡功能可以将请求分发到多个服务器,提高网站的吞吐量和可靠性。以下是Nginx支持的6大负载均衡策略:
162 7
|
1月前
|
负载均衡 算法 Java
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
尼恩,一位资深架构师,分享了关于负载均衡及其策略的深入解析,特别是基于权重的负载均衡策略。文章不仅介绍了Nginx的五大负载均衡策略,如轮询、加权轮询、IP哈希、最少连接数等,还提供了手写加权轮询算法的Java实现示例。通过这些内容,尼恩帮助读者系统化理解负载均衡技术,提升面试竞争力,实现技术上的“肌肉展示”。此外,他还提供了丰富的技术资料和面试指导,助力求职者在大厂面试中脱颖而出。
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
|
1月前
|
缓存 负载均衡 算法
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
Nginx 是一款高性能的 HTTP 和反向代理服务器,也是一个通用的 TCP/UDP 代理服务器,以及一个邮件代理服务器和通用的 HTTP 缓存服务器。
75 0
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
|
5月前
|
缓存 负载均衡 算法
解读 Nginx:构建高效反向代理和负载均衡的秘密
解读 Nginx:构建高效反向代理和负载均衡的秘密
122 2
|
4月前
|
负载均衡 算法 应用服务中间件
nginx自定义负载均衡及根据cpu运行自定义负载均衡
nginx自定义负载均衡及根据cpu运行自定义负载均衡
94 1
|
4月前
|
运维 负载均衡 算法
SLB与NGINX的异同是什么
SLB与NGINX的异同是什么
466 2
下一篇
无影云桌面