• tomcat简单使用


    下载解压tomcat
    [root@localhost]# tar zxf apache-tomcat-8.5.4.tar.gz -C /usr/local/tomcat

    yum自带JDK,注意区别JRE和JDK
    java-1.8.0-openjdk.x86_64 : OpenJDK Runtime Environment
    java-1.8.0-openjdk-devel.x86_64 : OpenJDK Development Environment


    tomcat 前期设置

    export JAVA_HOME=/usr/local/java #定义JAVA_HOME的环境变量
    export PATH=$JAVA_HOME/bin:$PATH
    export CATALINA_BASE=/usr/local/tomcat export PATH=$CATALINA_BASE/bin:$PATH 启动脚本catalina.sh添加如下使得在IPV4上监听JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true "

    yum安装的JAVA默认路径

    /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64


    tomcat自带的三个APP使用

    image_thumb311

    (1)Server Status(tomcat状态信息)

    编辑conf/tomcat-users.xml后,重启tomcat加载用户信息

    <role rolename="manager-gui"/> #添加manager-gui角色

    <user username="tomcat" password="s3cret" roles="manager-gui"/> #创建用户并加入角色

    (2)Manager App(tomcat下各应用管理)

    与Server Status共用账号密码

    (3)Host Manager (虚拟主机管理)

    <role rolename="admin-gui"/> 
    <user username="tomcat" password="s3cret" roles="admin-gui"/> 
    

    此版本tomcat还有一个IP地址访问过滤,默认只允许本机访问,解除即可正常访问管理页面。

    $CATALINA_BASE/webapps/manager/META-INF/context.xml #Server Status和Manager App的访问控制
    $CATALINA_BASE/webapps/host-manager/META-INF/context.xml #Host Manager的访问控制

    <Context antiResourceLocking="false" privileged="true" >
      <Valve className="org.apache.catalina.valves.RemoteAddrValve"
             allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />
    </Context>
    

    虚拟主机配置

    (1)server.xml添加Host组件即可实现多个虚拟主机。

    <Host name="www.a.com"  appBase="/data/tomcat/a"         #appBase如果是相对路径则是相对$CATALINA_BASE
          unpackWARs="true" autoDeploy="true">
        <Context path="" docBase="ROOT" reloadable="true" />
    </Host>
    
    <Host name="www.b.com"  appBase="/data/tomcat/b"         #appBase指定网页存放路径     
          unpackWARs="true" autoDeploy="true">
        <Context path="" docBase="ROOT" reloadable="true" /> #docBase如果是相对路径则是相对appBase的目录
    </Host>                                                  #path表示url,docBase为空则是appBase路径

    (2)创建本地目录mkdir –pv /data/tomcat/{a,b}

    (3)抄了一段JSP代码做测试页面,是一个记录访问次数的代码段,放置在Host组件的appBase对应的路径下,并分别把代码保存为/data/tomcat/{a,b}/{a,b}.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="GB2312"%> 
    <html> 
    <head>
        <title>WEB A</title> 
    </head> 
    <body> 
        <% 
            int n = 0;
            String counter = (String)application.getAttribute("counter"); 
            if(counter != null){ 
                n = Integer.parseInt(counter); 
            } 
            if(session.isNew()) 
                ++n; 
        %> 
        <h1>you are the <%out.print(n);%> times access</h1> 
        <% 
            counter = String.valueOf(n); 
            application.setAttribute("counter", counter); 
        %> 
    </body> 
    </html>
    

    (4)使用域名访问www.a.com:8080/a.jsp、www.b.com:8080/b.jsp可以使用hosts文件让客户端正常解析两个域名,Host组件内可以使用<Alias></Alias>定义主机别名


    Valve

    valve类似于过滤器,有多种不同的Valve:

    AccessLogValve:访问日志Valve;
    ExtendedAccessValve:扩展功能的访问日志Valve;
    JDBCAccessLogValve:通过JDBC将访问日志信息发送到数据库中;
    RequestDumperValve:请求转储Valve;
    RemoteAddrValve:基于远程地址的访问控制;
    RemoteHostValve:基于远程主机名称的访问控制;
    SemaphoreValve:用于控制Tomcat主机上任何容器上的并发访问数量;
    JvmRouteBinderValve:在配置多个Tomcat为以Apache通过mod_proxy或mod_jk作为前端的集群架构中,当期望停止某节点时,
    可以通过此Valve将用记请求定向至备用节点;使用此Valve,必须使用JvmRouteSessionIDBinderListener;
    ReplicationValve:专用于Tomcat集群架构中,可以在某个请求的session信息发生更改时触发session数据在各节点间进行复制;
    SingleSignOn:将两个或多个需要对用户进行认证webapp在认证用户时连接在一起,即一次认证即可访问所有连接在一起的webapp;
    ClusterSingleSingOn:对SingleSignOn的扩展,专用于Tomcat集群当中,需要结合ClusterSingleSignOnListener进行工作;

    (1)server.xml配置文件里面的AccessLogValve

    <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" />

    (2)webapps/manager/META-INF/context.xml里面的RemoteAddrValve

    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
             allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />

    一般会在tomcat前端增加反向代理,不会让tomcat直接面向用户请求,此时需要定义tomcat连接器相关参数
    增加前端节点可以做动静态资源的分离

    使用Nginx作为前端

    image_thumb6

    (1)配置nginx

    在Nginx启用反向代理前保证客户端能够正常访问Nginx主页,Nginx能够访问tomcat(注意firewall)

    编辑/etc/nginx/nginx.conf,添加proxy_pass,下述表示所有请求无差别转发到tomcat

    image_thumb31

    注意:proxy_pass使用IP和主机名的区别,如果后端的tomcat使用了基于主机名的虚拟主机,则Nginx转发的时候,就需要使用主机名,否则tomcat将会访问到默认虚拟主机。

    (2)nginx作为前端并分离动静态资源

    ........(前面配置省略)
    include /etc/nginx/default.d/*.conf;
            location / {              #非jsp文件如html、图片等静态资源的请求会被此匹配,直接从nginx的root路径获取
    
            }
            location ~ .jsp$ {
                proxy_pass http://192.168.56.131:8080;       #仅将jsp文件的请求转发到后端
            }
    

    使用Apache作为前端反向代理

    image_thumb51

    使用特定的模块实现(主模块:proxy_module 子模块:proxy_module_http(ajp)),早期没有proxy_module_ajp的时候有一个支持ajp的第三方模块(JK)

    httpd –M 查看已经装载的模块
    proxy_module (shared)
    proxy_http_module (shared)
    proxy_ajp_module (shared)

    配置文件/etc/httpd/conf/httpd.conf

    ProxyRequests Off
    ProxyVia On
    ProxyPreserveHost On
    ProxyPass / http://192.168.56.131:8080/
    ProxyPassReverse / http://192.168.56.131:8080/
    

    ProxyVia On 转发请求的时候带上来源
    ProxyRequests Off 正向代理显式关闭才能使用反向代理
    ProxyPreserveHost On 支持在后端主机上使用基于主机名的虚拟主机,即客户端请求报文带主机名,能直接把这个首部转发后端,这样就能够访问到tomcat基于主机名的虚拟主机,如果客户端用IP访问依然是访问tomcat的默认主机。
    ProxyPass 如果使用ajp协议与tomcat交互,只需要把url改为http://192.168.56.131:8080/,path为”/”结尾,url也要”/”结尾
    ProxyPass /status ! 符号!可以在代理时排除指定页面


    httpd/nginx作为前端负载均衡

    image_thumb8

    nginx server:192.168.56.129 前端网卡:192.168.45.129
    tomcat server1:192.168.56.131
    tomcat server1:192.168.56.132

    (1)nginx负载均衡及会话绑定编辑nginx配置文件,增加如下内容

     image_thumb2

    后端tomcat上部署同样的资源文件,我这里使用上述的记录访问次数的jsp页面,在客户端上访问nginx时,每次刷新浏览器都会负载均衡到不同的tomcat后端

    image_thumb4 image_thumb7

    会话绑定:在nginx配置文件中的upstream里面添加ip_hash,可以将来自同一ip的客户端固定代理至后端某一台tomcat上。此时刷新浏览器,每次访问到的tomcat都不变。

    (2)Apache作为前端负载均衡

    http://httpd.apache.org/docs/2.4/howto/reverse_proxy.html 官方文档
    httpd的反代负载均衡由mod_proxy_balancer模块实现,编辑httpd配置文件

    <proxy balancer://lbmember>
    BalancerMember http://192.168.56.131:8080
    BalancerMember http://192.168.56.132:8080
    </proxy>
    ProxyPass / balancer://lbmember/
    ProxyPassReverse / balancer://lbmember/
    

    注意:测试中ProxyPass的url最后没有加”/”,出现访问错误。

    image_thumb101

    (3)Apache前端的会话绑定
    http://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxyset
    http://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html 官方文档

    按照官方文档进行设置

    image_thumb3

    Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
    <proxy balancer://lbmember>
        BalancerMember http://192.168.56.131:8080 route=1
        BalancerMember http://192.168.56.132:8080 route=2
        ProxySet stickysession=ROUTEID
    </proxy>
    ProxyPass / balancer://lbmember/
    ProxyPassReverse / balancer://lbmember/

    route= 设置服务器id
    stickysession=ROUTEID 使用服务器ID进行会话保持
    设置后客户端带着负载均衡器给的cookie值(该值就是route)去访问服务器,实现会话保持。
    第一次请求前端负载,响应报文中有Set-Cookise字段,客户端获取到cookies并在随后的请求中附带cookies首部

    (4)httpd 自带的负载均衡管理页面

    ProxyPass /balancer-manager !       #要放在前面,否则匹配到下面的proxypass,此管理页面也会被代理至后端
    ProxyPass / balancer://lbmember/
    ProxyPassReverse / balancer://lbmember/
    <Location "/balancer-manager">
        SetHandler balancer-manager
    </Location>

    访问http://192.168.45.129/balancer-manager就可以进入一个简单的状态显示页面


    一般不建议单个tomcat实例内存过大,所以同一台主机可以启用多个tomcat实例,并且使用Apache为同一主机的不同tomcat做反向代理,如下结构。

    image_thumb10


    tomcat会话管理器实现session同步

    session.DeltaManager官方文档 https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html

    使用会话绑定有一个缺陷,当某台后端tomcat挂了,所有该服务器的会话信息将丢失,所以可以构建tomcat集群,集群内各服务器共享会话信息,于是集群内每个tomcat都有其他成员建立的会话信息。这种方式因为每台服务器上都要保存其他会话信息,占用内存较大,不适合大规模

    (1)to your <Engine> or your <Host> element to enable clustering.

    (2)Make sure your web.xml has the <distributable/> element

    (3)按照官方文档修改配置文件

    (4)显示cookies的jsp脚本

    <% session.setAttribute("test","test");%>
    <h1> SessionID:<%= session.getId()%></h1>
    

    (5)客户端访问会被代理到不同的后端,但是session保持不变

    image_thumb17
    image_thumb16

    注意:测试环境中按照官方配置<cluster>无法启动,tomcat日志提示multicast的问题。ifconfig eth0 broadcast 228.0.1.4 修改广播地址就可以,有待研究

    如果在serve.xml中<Engine name="Catalina" defaultHost="localhost" jvmRoute="1"> 设置jvmRoute会发现获取的session后面附加了jvmRoute的值


    附:

    Tomcat配置文件server.xml详解

    各组件的协作关系如下

    image_thumb71

  • 相关阅读:
    Go语言基础介绍
    webpack教程——css的加载
    Git忽略规则.gitignore梳理
    vue2.0路由-适合刚接触新手简单理解
    JAVA实现DES加密实现详解
    计算机网络: IP地址,子网掩码,网段表示法,默认网关,DNS服务器详解
    Storm:最火的流式处理框架
    神片和神回复
    论C#未来发展
    弄清UTF8和Unicode
  • 原文地址:https://www.cnblogs.com/otherside/p/9175739.html
Copyright © 2020-2023  润新知