实践出真知——一文教你搭建Nginx+Tomcat集群,实现负载均衡及动静分离

实践出真知——一文教你搭建Nginx+Tomcat集群,实现负载均衡及动静分离

前言

? 想必大家对于Nginx和Tomcat都非常熟悉了,Nginx的应用非常广泛,不仅是对web静态资源非常友好,而且也是非常实用的反向代理和负载均衡软件。结合后端Tomcat的服务,从而搭建Nginx+Tomcat集群。

? 对于直接想要实践的朋友而言可以获取本文的链接中的软件包后直接看第三备份的内容。

一、集群搭建结构及拓扑

1.1集群架构图示

Nginx+Tomcat集群的结构示意图如下:

1.2系统环境与地址规划

使用三台Centos7服务器(7.4),规划如下:

服务器 网卡模式 IP地址
Nginx NAT 20.0.0.128
Tomcat1 NAT 20.0.0.130
Tomcat2 NAT 20.0.0.136

1.3拓扑图如下

1.4相关资源软件

链接:https://pan.baidu.com/s/1Qdla-vrpcspcAKJucZdSUg
提取码:40it

二、搭建思路及核心部分配置

? 根据上述的结构图示,为了完成该实践内容,需要先梳理搭建的思路,搞清楚核心部分的操作与配置。

1、首先我们需要在三台服务器上编译安装对应的服务(软件包在上面的链接中),测试服务是否正常;

2、其次基于核心功能:负载均衡以及动态分离,需要一步一步理清楚

基于负载均衡

? 负载均衡是在Nginx服务器上配置的,就需要对nginx的主配置文件进行配置,实现负载均衡的模块是使用upstream模块以及对应需要的算法(本文使用简单的加权轮循算法实现负载均衡)。核心配置:

#server指令外层
upstream tomcat-server {
                server 20.0.0.130:8080 weight=1;
                server 20.0.0.136:8080 weight=1;
        }
#server指令中
location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://tomcat-server;
        }

访问nginx的服务器地址,可以轮循访问后端的两台真实的Tomcat服务器。

基于动态分离

? 我们知道对于Nginx而言,其对静态资源的支持是非常友好的,而Tomcat对于java的动态web页面的支持非常好。所以需要实现动态分离就是将静态请求给予nginx服务器运行,Tomcat负责处理类似jsp文件的动态请求。

? 本次案例使用nginx服务器和一台Tomcat服务器做动态分离。最终将结合静态图片让nginx负责处理,而使用Tomcat处理动态页面。

核心配置:

nginx服务器:

location ~.*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
            root html/demo;
            expires 30d;
        }
location ~.*.jsp$ {       ##匹配jsp页面跳转代理服务器池
           proxy_pass http://tomcat-server;
           proxy_set_header Host $host;
        }
 location / {
            root   html;
            index  index.html index.htm;
            #proxy_pass http://tomcat-server;
        }

tomcat服务器:


        <Context docBase="/usr/local/tomcat/webapps/demo" path="" reloadable="false">
         </Context>

3、在部署和配置的过程中,进行必要的验证

好了大致的流程和核心配置讲完了,下面开始本次案例的完整演示。

三、部署流程与实践过程

负载均衡集群搭建

3.1部署配置两个tomcat服务器

? 由于部署两个tomcat服务器的流程几乎一致(除了页面显示的内容部分不一致,当然是为了验证负载均衡),并且不显得本文过于冗长,就演示tomcat1服务器上的部署。

3.1.1安装jdk

====================================================================================
tomcat1
[[email protected] ~]# hostnamectl set-hostname tomcat1
[[email protected] ~]# su
[[email protected] ~]# cd /opt/
[[email protected] opt]# ls
apache-tomcat-9.0.16.tar.gz  jdk-8u91-linux-x64.tar.gz  rh
[[email protected] opt]# tar zxf jdk-8u91-linux-x64.tar.gz -C /usr/local/
[[email protected] opt]# 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_NAME}/bin:$PATH
[[email protected] opt]# source /etc/profile

3.1.2部署安装tomcat

[[email protected] opt]# ls
apache-tomcat-9.0.16.tar.gz  jdk-8u91-linux-x64.tar.gz  rh
[[email protected] opt]# tar zxf apache-tomcat-9.0.16.tar.gz -C /usr/local/
[[email protected] opt]# cd /usr/local/
[[email protected] local]# ls
apache-tomcat-9.0.16  bin  etc  games  include  jdk1.8.0_91  lib  lib64  libexec  sbin  share  src
[[email protected] local]# mv apache-tomcat-9.0.16/ tomcat
[[email protected] local]# cd tomcat/
[[email protected] tomcat]# ls
bin           conf             lib      logs    README.md      RUNNING.txt  webapps
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  RELEASE-NOTES  temp         work
[[email protected] bin]# ls  #将下面中的启动脚本和关闭脚本建立软链接
bootstrap.jar       ciphers.sh                    daemon.sh     setclasspath.bat  startup.sh            version.bat
catalina.bat        commons-daemon.jar            digest.bat    setclasspath.sh   tomcat-juli.jar       version.sh
catalina.sh         commons-daemon-native.tar.gz  digest.sh     shutdown.bat      tomcat-native.tar.gz
catalina-tasks.xml  configtest.bat                makebase.bat  shutdown.sh       tool-wrapper.bat
ciphers.bat         configtest.sh                 makebase.sh   startup.bat       tool-wrapper.sh
[[email protected] bin]# ln -s /usr/local/tomcat/bin/startup.sh /usr/local/bin
[[email protected] bin]# ln -s /usr/local/tomcat/bin/shutdown.sh /usr/local/bin

#创建站点目录以及文件(web页面)
[[email protected] local]# mkdir -p /web/webapp1
[[email protected] local]# cd /web/webapp1/
[[email protected] webapp1]# vim index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
 <head>
    <title>JSP test1 page</title>  #网页标题名字
 </head>
 <body>
    <% out.println("Welcome tomcat1 Web");%> #网页内容为:welcome tomcat1 web 唯一需要在tomcat2上面更改配置的部分(再次声明这样是为了验证效果,生产环境中是一致的哈~)
 </body>
</html>
[[email protected] webapp1]# vim /usr/local/tomcat/conf/server.xml #配置服务文件在149行添加context标签语句
148       <Host name="localhost"  appBase="webapps"
149             unpackWARs="true" autoDeploy="true">
150          <Context docBase="/web/webapp1" path="" reloadable="false">
151          </Context>
[[email protected] webapp1]# startup.sh #开启服务
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk1.8.0_91/jre
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[[email protected] webapp1]# netstat -ntap | grep 8080 #检查tomcat服务是否开启
tcp6       0      0 :::8080                 :::*                    LISTEN      2020/java 

[[email protected] webapp1]# systemctl status firewalld.service  #查看防火墙对防火墙进行设置
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2020-04-05 11:04:32 CST; 19min ago
   ......
[[email protected] webapp1]# firewall-cmd --zone=public --add-port=8080/tcp --permanent
success
[[email protected] webapp1]# firewall-cmd --reload
success

3.2部署配置nginx服务器

3.2.1手工编译安装nginx服务(这里不必多说了哈)

[[email protected] opt]# tar zxf nginx-1.12.0.tar.gz -C /usr/local/
[[email protected] opt]# yum install -y gcc gcc-c++ make zlib-devel pcre-devel

[[email protected] opt]# useradd -M -s /sbin/nologin nginx
[[email protected] opt]# cd /usr/local/nginx-1.12.0/
[[email protected] nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module
[[email protected] nginx-1.12.0]# make && make install
[[email protected] nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

3.3配置验证实现负载均衡

3.3.1upstream模块实现负载均衡

[[email protected] nginx-1.12.0]# vim /usr/local/nginx/conf/nginx.conf
#在nginx.conf的gzip下面写入tomcat服务器池,tomcat-server表示一个名称,可以理解为服务器的域名
#gzip  on;

    upstream tomcat-server {
                server 20.0.0.130:8080 weight=1;#根据加权轮循算法调度访问后端的tomcat服务器
                server 20.0.0.136:8080 weight=1;
                }
location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://tomcat-server; #配置代理服务器
        }
[[email protected] nginx-1.12.0]# nginx -t #检查配置文件的语法
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[[email protected] nginx-1.12.0]# nginx #启动服务
[[email protected] nginx-1.12.0]# netstat -napt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      53804/nginx: master
[[email protected] nginx-1.12.0]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success
[[email protected] nginx-1.12.0]# firewall-cmd --reload
success

3.3.2验证负载均衡

? 客户机上访问nginx服务器地址,然后刷新一次,结果如下面两张图:

动态分离实现过程演示

? 此次只是为了实现动静分离的目的,所以只需要进行必要的演示即可,采用nginx服务器和一台tomcat服务器即可。

3.4模拟访问动静态资源(非同一web页面)

为了方便管理还是推荐写一个nginx服务的管理脚本

[[email protected] nginx-1.12.2]# vim /etc/init.d/nginx  ##编写service启动脚本
#!/bin/bash
# chkconfig: - 99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
    start)
        $PROG
        ;;
    stop)
        kill -s QUIT $(cat $PIDF)
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    reload)
        kill -s HUP $(cat $PIDF)
        ;;
    *)
                echo "Usage: $0 {start|stop|restart|reload}"
                exit 1
esac
exit 0
[[email protected] nginx-1.12.2]# chmod +x /etc/init.d/nginx
[[email protected] nginx-1.12.2]# chkconfig --add nginx

3.4.1暂时注释原有的nginx的代理服务配置

location / {
            root   html;
            index  index.html index.htm;
            #proxy_pass http://tomcat-server;
        }

3.4.2修改默认的站点目录文件(显示页面)(声明nginx作为静态资源访问的请求处理端)

[[email protected] html]# vim index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p><em>this is a static web page.</em></p> #em表示斜体
</body>
</html>

重启服务此时访问nginx服务器,获取的是:

3.4.3在tomcat1上写一个jsp的动态页面

#创建一个站点目录demo,编写一个jsp脚本
vim /usr/local/tomcat/webapps/demo/index.jsp
<!DOCCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/ html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>动态页面</title>
</head>
<body>
<div>动态页面1</div>
</body>
</html>

更改server.xml
<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Context docBase="/usr/local/tomcat/webapps/demo" path="" reloadable="false">
         </Context>
        <!--<Context docBase="/web/webapp1" path="" reloadable="false">
         </Context> -->

那么此时在nginx服务器上需要location对访问的jsp文件进行ip跳转访问的配置:

location ~.*.jsp$ {       ##匹配jsp页面跳转代理服务器池
           proxy_pass http://tomcat-server;
           proxy_set_header Host $host;
        }

3.4.4测试验证

3.5对于同一web页面实现动态访问tomcat,静态资源从nginx上获取

使用一张图片作为jsp文件,其中包含一张jpg格式的图片从nginx服务器上获取

具体配置如下

nginx上:需要创建demo目录(demo和tomcat上的目录的名称必须一致)存放jpg

#首先取消上面的代理注释内容,因为测试的时候访问的是20.0.0.128
server {
        listen       80;
        server_name  localhost;

        location ~.*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
            root html/demo;
            expires 30d;
        }
        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        location ~.*.jsp$ {       ##匹配jsp页面跳转代理服务器池
           proxy_pass http://tomcat-server;
           proxy_set_header Host $host;
        }
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://tomcat-server;
        }

tomcat:

jsp文件中添加一个图片链接:

[[email protected] demo]# vim /usr/local/tomcat/webapps/demo/index.jsp
<!DOCCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/ html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>动态页面</title>
</head>
<body>
<div>动态页面1</div><br>
<img src="cat.jpg"> #添加的内容
</body>
</html>
~         

jsp资源:在demo目录下

[[email protected] demo]# ls
index.jsp

图片资源在:html目录下

[[email protected] html]# ls
50x.html  demo  index.html
[[email protected] html]# cd demo/
[[email protected] demo]# ls
cat.jpg
[[email protected] demo]#

此时重启nginx服务访问20.0.0.128

第一次访问的是文字+图片,第二次由于在第二台服务器上没有进行相关配置则访问内容依旧和之前负载均衡的内容一样。

简单总结

? 其实结合此次实践,可以理解如何将动静分离和负载均衡结合起来,从而搭建nginx+tomcat集群服务了。如果说最后实现动态文字所代表的动态资源,加上这个可爱的小猫代表的静态资源(理解动静分离),结合前面的负载均衡完善tomcat2服务器配置就可以根据算法实现负载均衡了。

? 总之,我们需要对配置文件非常熟悉,了解其功能模块,最后需要明白是如何基于各种模块或指令上下文进行访问跳转的,匹配的关系需要理清楚(逻辑关系)。

原文地址:https://blog.51cto.com/14557673/2485054

时间: 2024-08-07 21:19:03

实践出真知——一文教你搭建Nginx+Tomcat集群,实现负载均衡及动静分离的相关文章

nginx tomcat 集群与负载均衡配置实例

一.nginx tomcat 中用到的概念介绍 1.反向代理,当客户端的请求到来之后,反向代理接收这个请求然后将这个请求转发到后台的服务器上,如果做负载均衡的话,就会将这个请求分发到负载均衡的那些服务器上去. 正向代理端代理的是客户端 反向代理代理的是服务端.请求这个反向代理服务器,就好比是直接请求资源所在的服务端. 2.这里说到的负载均衡,就是nginx接收到客户端的请求之后将这些请求按照自己配置的方式分发给后台服务器(tomcat服务器),分发方式有轮回方式,weight 配置权重,权重越大

nginx反向代理tomcat集群达到负载均衡,同时使用proxy_cache做web缓存

Nginx最早是作为一款优秀的反向代理软件,以高并发下的卓越性能被越来越多的用户所用户,国内最早研究nginx的是张宴,该大牛的博客地址:http://zyan.cc/ .但是随着需求的发展,nginx的功能已经不再单单是反向代理,现在已经更倾向作为web容器. Nginx从0.7.48版本开始,支持了类似Squid的缓存功能.Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对

Nginx实现集群的负载均衡配置过程详解

Nginx实现集群的负载均衡配置过程详解 Nginx 的负载均衡功能,其实实际上和 nginx 的代理是同一个功能,只是把代理一台机器改为多台机器而已. Nginx 的负载均衡和 lvs 相比,nginx属于更高级的应用层,不牵扯到 ip 和内核的修改,它只是单纯地把用户的请求转发到后面的机器上.这就意味着,后端的 RS 不需要配置公网. 一.实验环境 Nginx 调度器 (public 172.16.254.200 privite 192.168.0.48)RS1只有内网IP (192.168

Nginx实现tomcat集群进行负载均衡

一.背景 随着业务量和用户数量的激增,单一的tomcat部署应用已经无法满足性能需求,而且对于每次发布项目期间服务不可用的问题也凸显,既然出现了这个问题,那么我们本文就借助nginx来完美的解决这个问题. 二.基本概念 1.说明:关于Nginx的概念和介绍以及Centos7下安装步骤,请移步:Centos7安装Nginx实战 2.正向代理和反向代理 假设我们给定客户端A.代理服务器B.以及最终服务器C 正向代理:代理服务器B来代替客户端A来访问最终服务器C并将最终结果转发给客户端A,站在客户端A

夺命雷公狗---linux NO:41 linux下nginx的集群与负载均衡

集群,比如买了一代推服务器下来放一块他也就相当聚群,负载均衡就是让这一大堆服务器帮忙来平均干活他就是所谓的负载均衡,如下图所示: 比如我用192.168.8.155充当与服务器A,  192.168.8.166   和  192.168.8.177  来充当  pic 主机1  和pic  主机2,如下所示: 然后开始修改 服务器A(192.168.8.155)  conf  目录下的  nginx.conf  文件即可: upstream imgserver{ server 192.168.8

.net core webapi使用nginx实现集群和负载均衡

第一步:先编写webapi接口: 接口介绍: 1.接口采用appkey和appsecret 2.访问的话,在报文头加上,appkey和sign. 1.sign由请求地址(例如:http://www.xxx.com/api/user/xx/,那么地址是/api/user/xx/)+appsecret+queryString或者报文体使用SHA1散列算法得出. Filter代码: 1 string appKey = "fjdsakljg"; 2 string appSecret = &qu

haproxy+keepalived搭建nginx+lamp集群

haproxy+keepalived搭建nginx+lamp集群 实验拓扑: 实验环境: 主机 Ip地址 软件 haproxy主调度器 192.168.100.154 keepalived-1.2.13.tar.gz haproxy-1.4.24.tar.gz haproxy从调度器 192.168.100.155 keepalived-1.2.13.tar.gz haproxy-1.4.24.tar.gz Nginx1 192.168.100.152 nginx-1.6.2.tar.gz Ng

架构之路:nginx与IIS服务器搭建集群实现负载均衡(三)

参考网址:https://blog.csdn.net/zhanghan18333611647/article/details/50811980 [前言] 在<架构之路:nginx与IIS服务器搭建集群实现负载均衡(二)>中提到有好多有趣的地方,接下来就为大家一块儿讲讲在深入研究过程中遇到那些有趣的事情. ·实战之行--发现问题 ·探索之旅--寻出问题原因 ·解决之道--解决问题 [实战之行] 在<架构之路:nginx与IIS服务器搭建集群实现负载均衡(二)>中做了小Demo,当时做

架构之路:nginx与IIS服务器搭建集群实现负载均衡(二)

[前言] 在<架构之路:nginx与IIS服务器搭建集群实现负载均衡(一)>中小编简单的讲解了Nginx的原理!俗话说:光说不练假把式.接下来,小编就和大家一起来做个小Demo来体会一下Nginx的神奇之处. [准备工作] ·安装一款文本编辑器(这里以Notepad++为例) ·下载Nginx(这里以Nginx-1.4.7为例,其他版本操作相同) ·建两个简单网页:在文件夹test1新建一个html页内容为--我是Test1,在文件夹test2新建一个html页内容为--我是Test2) ·将