vlambda博客
学习文章列表

大型网站高并发实战-Tomcat

4. Tomcat服务器

4.1 编程语言概要

  • 编程语言

    • 系统级:C,C++, go (依赖于glibc)

    • 应用级:C#,Java,Python, Perl, ruby (虚拟机)

      动态网站:Java (servlet, jsp), Python(Django, Flask), Perl(module), ruby(ror),php

    • 语言流派:指令+数据

      面向过程:以指令为核心,围绕指令组织数据

      面向对象:以数据为核心,围绕数据组织程序,程序存在的目的是为了加工数据

      类:方法、属性

    • 动态

      客户端动态 apple

      服务器端动态:

      CGI ;

      一次编译,到处运行

      两种接口:开发接口、运行接口

       jdk:

      J2SE ==> Java 2 SE

      J2EE ==> Java 2 EE

      J2ME ==> Java 2 ME

    • webapp server

      jsp --> tomcat, jboss, jetty

      php --> php-fpm

      python --> (Django)

    • Java语言

      Green, Oak, Java

      JDK:Java Development Kit

      JVM:Java Virtual Machine

      Java语言的特性:

      面向对象、多线程、结构化错误处理

      垃圾收集、动态连接、动态扩展

      JAVA技术体系:

      Java程序设计语言

      Java应用编程接口(API)

      Java class文件格式

      Java虚拟机

    • java编译

      源代码:.java

      字节码:.class

    4.2 tomcat安装部署

    1. 安装jdk(java 开发工具包)环境

      • sun jdk   :java官方开发的。

      • open jdk  :开源组织开发的

      rpm -ivh jdk-7u57-linux-x64.rpmcd /usr/javavim /etc/profile.d/java.sh #配置环境变量export JAVA_HOME=/usr/java/latest #环境变量配置推荐风格,先写home,在拼接。export PATH=$JAVA_HOME/bin:$PATH #PATH变量需要最后,因为搜索有优先级,若是放到前面容易不生效。. /etc/profile.d/java.shjava -version

    2. 部署tomcat

    tar xf apache-tomcat-7.0.55.tar.gz -C /usr/localln -sv apache-tomcat-7.0.55 tomcat#添加环境变量vim /etc/profile.d/tomcat.shexport CATALINA_HOME=/usr/local/tomcat export PATH=$CATALINA_HOME/bin:$PATH#环境变量生效. /etc/profile.d/tomcat.shcatalina start#catalina stop#查看端口是否启动 也可以访问 http://ip:8080ss nutlp|grep 8080

    配置文件:conf目录下

    • server.xml:核心主配置文件

    • context.xml:每个webapp都有其配置文件,这些配置文件通常位于webapp应用程序目录下的WEB-INF目录中,用于定义会话管理器、JDBC;此配置文件用于为所有的webapp提供默认配置;

    • web.xml:每个webapp部署之后才能被访问;此文件则用于为所有webapp提供默认部署方式的配置;

    • tomcat-users.xml:用户认证账号配置文件;

    • catalina.policy:当使用-security启动tomcat实例时会读取此配置文件来其安全运行策略;

    • catalina.properties:Java属性的定义文件,用于设定类加载器路径,以及一些JVM性能调整的相关参数;

    • logging.properties:日志相关的配置信息;

    tomcat主配置的文件server.xml

        tomcat组件:由java类实现;有些组件的实现方式不止一种;有些组件还要嵌套别的组件;每个组件在通过指定的类型实现时需要传递一些属性;

    • 顶级类组件:server(代表一个tomcat实例)

    • 服务类组件:service (将连接器关联至内部的engine)

    • 容器类组件:engine (代表一个web container  #负责请求处理),host,context

    • 连接器组件:connectorr  负责捕获客户端请求,支持如下三种协议。

      http

      https

      ajp(apache jserv procotol,tomcat集群环境使用)

    • 被嵌套类组件:valve, logger, realm, ...

      #组件实例:<server> <service> <connector port="80" protocol="HTTP/1.1" /> ... <engine>  <host name="www.lianshu.com" appBase="/webapps" unpackWARs="true" autoDeploy="true"> #类似于apache的虚拟主机,appBase 表示网站根目录 <Context path="/test" docBase="testapp2" reloadable="true"/> #表示多个应用,如 proc,ws,ihdmgr等模块。 </context> </host> ... </engine> </service> ... </server>

       测试页   #index.jsp 

      <%@ page language="java" %><%@ page import="java.util.*" %><html> <head> <title>JSP test Page</title> </head> <body> <% out.println("Hello,world"); %> </body></html>
    • 这段代码规定了Tomcat监听HTTP请求的端口号等信息。可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。


    3. tomcat的运行模式:

    • standalone:通过内置的web server直接接收来自于client的请求;

    • proxy:

    • in-process:使用独立的web server反代用户请求至jvm进程中的tomcat web container;web server和jvm在同一主机;独立/网络:web server和jvm在不同主机;

    4. catalina.sh脚本(总入口脚本,包括如下功能):

      • verson:   查看版本

      • configtest:语法检测

      • start:tomcat服务启动

      • stop [n] [-force]  :tomcat服务停止

      5. tomcat 可以处理静态资源,只是性能不如apache和nginx。

    4.3 Tomcat 集群部署

    • LAMT(linux apache mysql tomcat)架构

    • LNMT(linux Nginx mysql tomcat)架构

    注解:使用apache或者nginx的静态资源解析能力以及负载均衡能力;tomcat只负责动态请求处理。后端mysql可以使用N个实例(上图只画了一个)共同访问共享存储上的数据库文件。

    1. 配置apache服务器

      • 加载反向代理模块

        mod_proxy_http  #基于http的反向代理,通常默认是装载的

        mod_proxy_ajp    #基于ajp协议的反向代理,根据不同的协议选择不同的加载模块。

        mod_proxy_balancer #负载均衡模块

      • 配置apache的http反向代理

        由于经常修改主配置文件容易出错,并且主配置文件中有一个include 指令可以自动加载 /etc/httpd/*.conf 文件,所以我们可以在目录/etc/httpd/conf.d中创建一个负载均衡模块mod_http.conf 文件,具体配置如下:

        若是配置虚拟主机需要取消Main Server; 注释DocumentRoot指令即可;

      NameVirtualHost *:80 #2.2版本需要配置,2.4版本不需要配置#如下apache的配置类似nginx的upstream模式;#loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围为1-100。<Proxy balancer://tcsrvs> #tcsrvs 为负载名称:tomcat service集群BalancerMember http://172.16.100.7:8080 loadfactor=1BalancerMember http://172.16.100.8:8080 loadfactor=1</Proxy>
      #配置虚拟主机<VirtualHost *:80>ServerName www.lianshu.comProxyVia On #代理打开ProxyRequests Off #否开启apache正向代理的功能ProxyPreserveHost On #开启反向代理<Proxy *>Order deny,allowAllow from all</Proxy>ProxyPass /status ! #是否允许状态页代理 !表示不允许代理过去。报404错误ProxyPass / balancer://tcsrvs/ #根目录 负载均衡到后端,如果要实现动静分离,则可以使用正则表达式进行过滤处理,动态请求交给后端。#stickysession:调度器的sticky session的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID。实现session绑定效果。但是动态负载就不可以体现了。ProxyPassReverse / balancer://tcsrvs/ stickysession=JSESSIONID #反向代理重定向<Location /> Order deny,allow Allow from all</Location></VirtualHost>    

    上述配置关键参数解释:

    • ProxyRequests {On|Off}:是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off。

    • ProxyVia  {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。

    配置apache的ajp反向代理

        需要加载的模块:mod_proxy_ajp, mod_proxy_balancer:

    NameVirtualHost *:80 <Proxy balancer://tcsrvs> BalancerMember ajp://172.16.100.7:8009 loadfactor=1 #和上面只有协议不同,端口不同 BalancerMember ajp://172.16.100.8:8009 loadfactor=1  </Proxy> <VirtualHost *:80> ServerName www.lianshu.com ProxyVia On ProxyRequests Off ProxyPreserveHost On <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass /status ! #实现session绑定 ProxyPass / balancer://tcsrvs/ stickysession=JSESSIONID ProxyPassReverse / balancer://tcsrvs/ stickysession=JSESSIONID <Location /> Order deny,allow Allow from all </Location> </VirtualHost>

    配置tomcat服务器集群

    若是为了实现session绑定,则需要在tomcat主配置文件engine(引擎)里面分别添加如下路由属性。

    jvmRoute=tomcatA

    jvmRoute=tomcatB

    tomcatA 节点

    <%@ page language="java" %><html><head><title>TomcatA</title></head><body><h1><font color="red">TomcatA.lianshu.com</font></h1><table align="centre" border="1"><tr> <td>Session ID</td><% session.setAttribute("lianshu.com","lianshu.com"); %> <td><%= session.getId() %></td></tr><tr><td>Created on</td><td><%= session.getCreationTime() %></td></tr></table></body></html>

    tomcatB 节点

    <%@ page language="java" %><html><head><title>TomcatB</title></head><body><h1><font color="blue">TomcatB.lianshu.com</font></h1><table align="centre" border="1"><tr> <td>Session ID</td><% session.setAttribute("lianshu.com","lianshu.com"); %><td><%= session.getId() %></td></tr><tr> <td>Created on</td> <td><%= session.getCreationTime() %></td></tr></table></body></html>