使用tomcat+nginx实现负载均衡和动静分离集群

发表于:2023-1-28 13:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:stevelu666    来源:阿里云开发者平台

  一 概述
  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>
  (2) 配置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;
   }
  (3)测试动静分离
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 项
  修改主配置文件,实现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次,并且每次访问时间要有间隔,因为四层转发有连接保持的效果
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号