• 青蛙学Linux—Nginx+Tomcat实现动静分离以及负载均衡


    Tomcat也是一个Web服务器,用于运行JSP页面和Servlet。虽然Tomcat也可以处理静态网页,但是其性能与并发能力远远比不上Nginx,而且Tomcat在高并发环境下处理动态请求的性能也不高,所以通过Nginx与Tomcat的整合来适应高并发的环境。

    Nginx可以通过以下两种方式来实现与Tomcat的整合:

    • 将静态页面请求交由Nginx处理,动态页面的请求交由Tomcat处理
    • 将所有的请求都交由后端的Tomcat进行处理,Nginx利用自身的负载均衡功能实现多台Tomcat服务器的负载均衡

    1、安装Tomcat

    1.1、构建JAVA环境

    Tomcat的运行需要JAVA环境的支持,所以我们在安装Tomcat之前必须先构建一个JAVA环境。JAVA环境需要安装JDK,JDK可以在https://www.oracle.com/technetwork/java/javase/downloads/index.html下载。

    这里我们使用的是JDK 8u191(1.8.0_191)的版本,JDK的安装非常简单,Oracle提供给我们的是二进制可执行程序,在上面提供的网址中下载相应版本的tar.gz包之后,直接解压到相应的路径即可使用。

    安装好JDK后,我们必须配置环境变量以便Tomcat进行调用,这里把JDK安装到/usr/local/jdk目录下,然后在/etc/profile中配置以下的环境变量:

    export JAVA_HOME=/usr/local/jdk
    export PATH=$PATH:$JAVA_HOME/bin
    export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

    测试:

    [root@localhost ~]# java -version
    java version "1.8.0_191"
    Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
    Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

    1.2、安装Tomcat

    Tomcat的官网为http://tomcat.apache.org

    这里选择Tomcat 8.5.37的版本进行安装。与JDK一样,Tomcat在官网上同样提供给我们的是二进制可执行程序的tar.gz包,我们只要下载后解压到指定的目录即可。这里我们将Tomcat安装到/usr/local/tomcat目录下。

    1.3、Tomcat的目录结构

    Tomcat的可执行脚本位于安装目录下的bin目录中,重点关注以下三个脚本文件:

    startup.sh    # 启动Tomcat
    shutdown.sh   # 关闭Tomcat
    catalina.sh   # 配置Tomcat运行时需要的一些环境变量

    Tomcat的配置文件位于安装目录下的conf目录中,重点关注以下配置文件:

    server.xml           # Tomcat的主配置文件
    logging.properties   # 配置Tomcat的日志输出格式

    Tomcat的日志文件位于安装目录下的logs目录中。

    Tomcat自带的默认站点位于安装目录下的webapps目录下,该目录有以下几个子目录:

    docs          # Tomcat文档
    examples      # 部署实例
    host-manager  # 通过Web管理Tomcat
    manager       # 通过Web管理Tomcat
    ROOT          # 自带网站的根目录

    1.4、Tomcat的简单配置

    Tomcat的主配置文件server.xml位于安装目录下的conf目录中,我们通过该文件进行简单的配置(端口号和虚拟主机的配置):

    端口配置
    # 通过HTTP协议访问Tomcat的端口,默认为8080
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    虚拟主机配置
    <Host name="localhost"  appBase="webapps"
          unpackWARs="true" autoDeploy="true">
    
      <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html -->
      <!--
      <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
      -->
    
      <!-- Access log processes all example.
           Documentation at: /docs/config/valve.html
           Note: The pattern used is equivalent to using pattern="common"
           日志配置,配置日志的文件名、扩展名和保存位置
      -->
      <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
             prefix="localhost_access_log" suffix=".txt"
             pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    
    </Host>

    其中:

    • name:定义虚拟主机的域名,也可以使用IP地址
    • debug:定义日志输出级别
    • appBase:定义存放Web应用的根目录,可以是绝对路径或相对于$CATALINA_HOME(Tomcat安装目录)的目录
    • unpackWARs:定义Tomcat是否将WAR文件解压后运行,true为自动解压后运行
    • autoDeploy:定义Tomcat是否自动发布appBase目录下的所有Web应用(包括新加入的Web应用),true为自动发布

    也可以在<Host></Host>中定义以下内容,实现一个虚拟主机下的不同Web应用:

    <Context path="" docBase="" debug=""/>

    其中:

    • path:定义Web应用的URL入口,比如path=“jsp”,则请求的URL应该为http://xxx/jsp
    • docBase:定义Web应用的路径,可以使用绝对路径也可以使用相对路径,也可以为WAR文件的路径

    1.5、启动Tomcat

    进入Tomcat安装目录下的bin目录,运行:

    [root@localhost bin]# ./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/jdk
    Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
    Tomcat started.

    当前安装Tomcat的主机IP地址为192.168.0.110,访问http://192.168.0.110:8080:

    1

    Tomcat的欢迎页面。看到这个页面就说明Tomcat启动成功。

    在Tomcat的Web根目录下,还放置了一个名为info.jsp的探针文件,我们访问http://192.168.0.110:8080/info.jsp:

    2

    2、Nginx+Tomcat实现动静分离

    Nginx通过反向代理的方式将相应的请求转发给Tomcat以实现动静分离。这里通过一个实例来展示Nginx+Tomcat如何实现动静分离。

    实验环境:

    仅使用一台主机进行实验,主机IP为192.168.0.110,安装Nginx和Tomcat,Tomcat的端口为8080。通过配置Nginx将访问JSP文件的请求交由Tomcat处理。

    Nginx配置部分(仅展示配置文件中server和location配置的相关部分):

    server {
        listen       80;
        server_name  localhost 192.168.0.110;
        
        location / {
            root   html;
            index  index.html index.htm;
        }   
            
        location ~ .jsp$ {
            proxy_pass    http://127.0.0.1:8080;
        }
    }

    我们首先来访问http://192.168.0.110:

    1

    然后访问http://192.168.0.110/info.jsp:

    2

    JSP文件也访问成功。服务器名称与域名均显示127.0.0.1是因为在Nginx反向代理时没有配置将真实IP发送给后端。

    如何验证JSP文件真的是由Tomcat处理的呢,我们可以访问一个不存在的JSP文件,看看它的错误信息:

    3

    404错误,由Tomcat给出,同样,访问一个不存在的html,看看错误信息:

    4

    html文件的404由Nginx给出,这就说明了我们的配置已经实现了动静分离。

    3、Nginx实现Tomcat的负载均衡

    Nginx实现Tomcat的负载均衡同样是通过upstream定义一组主机,然后通过反向代理将请求转到该组主机上。以下通过一个实例来展示如何通过Nginx来实现Tomcat的负载均衡。

    实验环境:

    • 主机A:IP地址为192.168.0.110,安装Nginx 1.14.2,无Tomcat环境
    • 主机B:IP地址为192.168.0.88,安装Tomcat 8.5.37,无Nginx环境
    • 主机C:IP地址为192.168.0.106,安装Tomcat 8.5.37,无Nginx环境
    • 主机D:IP地址为192.168.0.61,安装Tomcat 8.5.37,无Nginx环境

    其中,主机A为前端服务器,通过Nginx提供负载均衡调度功能,主机BCD为后端服务器组,运行Tomcat提供Web服务,Tomcat端口均为8080。在BCD三台主机的Tomcat默认站点目录下均有一个名为info.jsp的探针文件。站点通过IP进行访问,没有进行域名解析。

    我们首先来访问下BCD三台主机,看看它们的Tomcat是否正常提供服务:

    http://192.168.0.88:8080/info.jsp1

    http://192.168.0.106:8080/info.jsp

    2

    http://192.168.0.61:8080/info.jsp

    3

    在主机A上配置整个站点的请求均转发到后端Tomcat服务器组,配置如下(仅展示Nginx配置文件中http、server和location部分的相关配置;这里为了展现负载均衡的效果,使用的是轮询算法,其实动态页面应该使用ip_hash算法,以解决session共享的问题):

    http{
        upstream tomcat_server{
            server  192.168.0.88:8080   max_fails=3 fail_timeout=20s;
            server  192.168.0.106:8080  max_fails=3 fail_timeout=20s;
            server  192.168.0.61:8080   max_fails=3 fail_timeout=20s;
        }
        server {
            listen       80;
            server_name  localhost 192.168.0.110;
            location / {
                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;
            }
    }

    访问http://192.168.0.110/info.jsp:

    4

    5

    6

    Nginx成功为Tomcat提供了负载均衡功能。

  • 相关阅读:
    【拓扑排序】【堆】CH Round #57
    【数论】【筛法求素数】【欧拉函数】bzoj2818 Gcd
    【数论】【枚举约数】【欧拉函数】bzoj2705 [SDOI2012]Longge的问题
    【暴力】vijos P1897 学姐吃牛排
    【kruscal】【最小生成树】【并查集扩展】bzoj3714 [PA2014]Kuglarz
    【set】bzoj2761 [JLOI2011]不重复数字
    【尺取法】【Multiset】bzoj1342 [Baltic2007]Sound静音问题
    【神奇の做法】bzoj2456 mode
    【博弈论】bzoj2463 [中山市选2009]谁能赢呢?
    【set】bzoj3715 [PA2014]Lustra
  • 原文地址:https://www.cnblogs.com/yu2006070-01/p/10223656.html
Copyright © 2020-2023  润新知