大型网站高并发实战-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 
- 安装jdk(java 开发工具包)环境 
- sun jdk :java官方开发的。 
- open jdk :开源组织开发的 
- 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:日志相关的配置信息; 
- 顶级类组件: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请求。 
- standalone:通过内置的web server直接接收来自于client的请求; 
- proxy: 
- in-process:使用独立的web server反代用户请求至jvm进程中的tomcat web container;web server和jvm在同一主机;独立/网络:web server和jvm在不同主机; 
- verson: 查看版本 
- configtest:语法检测 
- start:tomcat服务启动 
- stop [n] [-force] :tomcat服务停止 
- LAMT(linux apache mysql tomcat)架构 
- LNMT(linux Nginx mysql tomcat)架构 
- 配置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指令即可; 
- 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:都会被移除。 
4.2 tomcat安装部署
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/tomcatexport PATH=$CATALINA_HOME/bin:$PATH#环境变量生效/etc/profile.d/tomcat.shcatalina start#catalina stop#查看端口是否启动 也可以访问 http://ip:8080ss nutlp|grep 8080
配置文件:conf目录下
tomcat主配置的文件server.xml
tomcat组件:由java类实现;有些组件的实现方式不止一种;有些组件还要嵌套别的组件;每个组件在通过指定的类型实现时需要传递一些属性;
3. tomcat的运行模式:
4. catalina.sh脚本(总入口脚本,包括如下功能):
5. tomcat 可以处理静态资源,只是性能不如apache和nginx。
4.3 Tomcat 集群部署
注解:使用apache或者nginx的静态资源解析能力以及负载均衡能力;tomcat只负责动态请求处理。后端mysql可以使用N个实例(上图只画了一个)共同访问共享存储上的数据库文件。
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,allowAllow from all</Location></VirtualHost>
上述配置关键参数解释:
配置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.comProxyVia OnProxyRequests OffProxyPreserveHost On<Proxy *>Order deny,allowAllow from all</Proxy>ProxyPass /status !#实现session绑定ProxyPass / balancer://tcsrvs/ stickysession=JSESSIONIDProxyPassReverse / balancer://tcsrvs/ stickysession=JSESSIONID<Location />Order deny,allowAllow 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>
