tomcat

tomcat:
php:
开发语言:脚本语言
运行环境:解释执行
zend engine:opcode
xcache,APC,eaccelerator

MVC(model-view-controller):模式-试图-控制器,即把一个应用的输入、处理、输出流程按照model、view、controller的方式进行分离,这样一个应用层被分为三个层--模型层、试图层、控制层。
    data:数据
    bussiness:业务
    presentation:展示
smarty
    web:

用c/c++做开发cpu,os
移植困难
维护成本高

用c/c++做开发驱动
高速

c/c++
c:面向过程
c++:面向对象

c:API(application programming interface)应用编程接口:包含多个系统调用
os,system call:

windows,API
POSIX(protabl operating system):可移植操作系统

Linux,API,Linux(compiling:Linux,running:windows)
.dll
.so

ABI(application binary interface):应用程序二进制接口

oak:橡树,智能
Java包含四个独立的又彼此相关的技术:
Java程序设计语言
Java API
Java class文件格式
jvm(Java virtual machine)

java程序语言+java API = *.java

.java通过java编译器编译 ---》.class通过class load在jvm(需要依赖公共类库)上面运行

Java语言写完后经过Java编译器编译完成后就变成了class
once for all:一次编译,到处运行:write once,run anywhere

bytecode:字节码

.java--》.class(bytecode)

jvm的实现方式:
1.一次解释器,解释字节码并执行,就是把字节码解释成计算机能识别的二进制语言;
2.即时编译器(just-in-time compliter),依赖于更多内存缓存解释后的结果
3.自适应编译器,缓存20%左右代码,提高80%左右的速度;

Java设计语言:sun
Java API:

jvm:hotspot jvm
jre:Java 运行时环境(运行)
jdk:Java 开发环境(开发(编译)+运行)

jvm:openjdk(开发+运行)

Java API类库
第三方类库

jdk=Java+API+jvm:用于实现Java程序开发的最小环境
jre=jvm+Java se API
java SE=JDK + 额外类库,面向桌面级类库
java EE=java SE+企业级类库(servlet,jps,jmx)

Java应用领域的不同,java可分为三类:
Java se:standard edtion,j2se标准版
Java ee:enterprise 企业版edition,j2ee
Java me:mobile edtion,j2me移动版,j2me

1995年,Java 1.0面世,James gosling,green project

applet:小程序
动态网站

CGI(common gateway interface):通用网关接口
CGI:协议

html:
mime,a.cgi

html
<html>
    <title></title>
    <body></body>
</html>

servlet(只是相当于增加了类似于http协议的CGI):CGI,html必须硬编码在java代码中,所以产生了jsp
JSP(是属于servlet一个子类,嵌入到html网页的一个类,主要用于动态的网页开发):java server page
jasper:将存在着嵌入在html文档的程序整的个儿转换为servlet

<%language="java">
SSH:structs spring hebernate

JSP----》serviet
Jasper

applet,servlet,jsp:用来开发运行在不用场景的应用程序

JSP:
.jsp--》.Java--》(jvm).class

jdk:javac(java的编译器),.Java--》.class

CGI,servlet,.Java

web
servlet container:servlet容器(包含了jdk和监控jdk运行的容器)
web container:web容器(包含了servlet和jsp的以及连接器的容器)

jvm instance

jvm 运行时数据区域:
程序计数器
java虚拟机栈

线程私有内存区(运行时数据区域):
程序计数器
Java虚拟机栈(用来保存本地变量)

线程共享内存区:
方法区
堆:Java自动内存回收gc(garbage collector)

类:操作
对象:方法

溢出:

本地方法栈
java方法栈

垃圾回收算法:
1.标记+清除
2.复制
二分之一
3.标记整理算法

垃圾回收器:
serial
parnew
parallel scavenge
serial old
parallel old

CMS:concurrent mark sweep并行标记清除
    特点:并发收集、低停顿
    缺点:无法收集浮动垃圾,由于基于标记+清除算法会产生碎片

G1

溢出:

sun:
jre
jdk

open:
openjdk

jdk 1.6
jdk 1.7

安装:
rpm
通用二进制格式: .bin
源码

yum list all | grep java

./jdk-6u21-linux-i586-rpm.bin

cd /usr/local/java

vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.6.0_21
export PATH=$JAVA_HOME/bin:$PATH

source /etc/profile.d/java.sh
java -version

jvm:java

java配置参数:
-xx:+<option>:开启此参数指定的功能;
-xx:-<option>:关闭功能
-xx:<option>=<value>:给option指定的选项功能
java -xx:+printflagsfinal

-D<name>=<value>:set a system property

vim Test.java
public class Test{
public static void main(String[] args){
System.out.println("Hello Welcome to MageEdu Linux Learning Center!");
}
}

javac Test.java
java Test.class

类加载器:把程序(也叫一个类)加载到java环境中来运行
一个类的生命周期
loading(加载)
verification(验证)
preparation(准备)
resolution(解析)
initialization(初始化)
using(使用)
unloading(卸载)

sun jdk监控和故障处理工具:
jps,jvm process status tool:显示指定系统内所有的Hotspot虚拟机进程的列表信息
jstat,jvm statistics monitoring tool:收集并显示Hotspot虚拟机各方面的运行数据
jinfo:显示正在运行的某Hotspot虚拟机配置信息
jmap:生成某Hotspot虚拟机的内存存储快照

可视化工具:
jconsole:java的监控与管理控制台
jvisualvm:

servlet:CGI,java
硬编码,html

jsp:<% %>,html
jasper, .jsp-->.java

将jsp编码还要转换成servlet编码格式的才能使用

java ee apis:
eib
jmx
jta
javamail

java se apis:
jnai
jaxp

java ee application servers:
WebSphere
weblogic
oc4j
jboss
Jonas
geronimo
glassfish

risen

sun --》tws
RI:reference implimentation
参考实现

ASF:Apache software foundation
jserv

o'reilly(是一个出版社):tomcat
男猫

Tomcat:JDK+servlet,jps
java ee: 不完整实现

/web/htdocs/discuz
DocumentRoot

alias /phpwind
/web/bbs/phpwind

http://www.magedu.com/phpwind

安装配置tomcat:
tar -zxvf apache-tomcat-7.0.42.tar.gz -C /usr/local/
cd /usr/local/
ln -sv apache-tomcat-7.0.42 tomcat
cd tomcat
bin/catalina.sh --help
vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$CATALINA_HOME/bin:$PATH

catalina.sh version
catalina.sh configtest
catalina.sh start
ss tunlp
jps

Tomcat的配置文件:
server.xml
context.xml:为部署于此tomcat实例上的所有web应用程序提供的默认配置文件,每个webapp都可以使用独有的context.xml,通常放置于webapp目录的META-INF子目录中,常用于定义会话管理器,Realm以及JDBC等
web.xml:为部署于此Tomcat实例上的所有web应用程序提供默认部署描述符:通常用于为webapp提供基本的servlet定义和MIME映射表等
tomcat-users.xml:
catalina.policy:当基于security选项启动tomcat实例时会读取此配置文件;此文件是JAVA的安全策略配置文件,配置访问codebase或某次java类的权限。
catalina.properties:java属性定义文件,设定类加载器路径、安全包列表和一些调整性能的参数信息
logging.properties:定义日志相关的配置信息,如日志级别、文件路径等

webapp体系结构:
webapp有特定的组织格式,是一种层次性目录结构,通常包含了servlet代码文件、jsp页面文件,类文件,部署描述符文件等等,一般会打包成归档格式。
/:web应用程序的根目录
/WEB-INF:此webapp的私有资源目录,通常web.xml和context.xml均放置于此目录
/WEB-INF/classes:此webapp自有的类
/WEB-INF/lib:此webapp自有能够被打包为jar格式的类

webapp的归档格式:
EJB类归档的扩展名为.jar
web应用程序的归档扩展名为.war
资源适配器的扩展名.rar
企业级应用程序的扩展名.ear
web服务的扩展名为.ear或.war

tomcat的配置层次:
vim server.xml
<server>
<service>
<connector />
<engine>
<host>
<context>
</context>
</host>
</engine>
</service>
</server>

Tomcat:
顶级组件(位于整个配置的顶层):server
容器组件(可以包含其他组件的组件):engine,host,context
连接器组件(连接用户请求至tomcat):connector
http,ssl,ajp(apache jserv protocol)
被嵌套类(位于一个容器当中,不能包含其他组件):value,logger,realm

tomcat:server+service(决定哪种connector连接到哪个engine)+engine(相当于servlet container)+connector(连接server和engine)+host+context(上下文)

容器类组件:
engine:核心容器,catalina引擎,负责通过connector接收用户请求
host:类似于httpd中的虚拟主机支持基于FQDN的虚拟主机
context:最内层的容器类组件,一个context代表一个web应用程序,配置context的主要目录,指定对应的webapp的根目录,还能为webapps指定额外的属性,如部署方式等

顶级组件:
server:表示一个运行于jvm中的tomcat实例

服务组件:
service:将连接器关联至engine,因此一个service内部可以有多个connector,但只能有一个engine

嵌套类组件
realm(领域):可以用于任何容器类的组件中,关联一个用户认证库,实现认证和授权
UserDatebaseRealm:使用JNDI自定义的用户认证库,tomcat-users.xml中
JDBCRealm:基于JDBC连接至数据库中查找用户
valve(阀门):拦截请求并在将其转至对应的webapp之前进行某种处理操作,可用于任何容器中
access log value
remote address filter value:基于ip做访问控制
logger:日志记录器,用于记录组件内部的状态信息;可用于除context之外的任何容器中

Tomcat 应用程序“部署”
部署是指将webapp及其所依赖类库等装载进tomcat实例上,一边接受用户请求
部署方式:
静态方式:在tomcat启动之前进行的webapp部署
动态方式:在不打断tomcat运行的前提下,通过tomcat manager或其它的命令行工具进行部署
TCD:Tomcat Client Deployer

 部署由一类"操作"组成:
    Deploy:将webapp的源文件放置于目标目录、配置tomcat服务器能够基于某contcxt路径访问此webapp,并将其特有的类由类加载器进行装载等
    Redeploy:重新部署,主要用于升级时
    Undeploy:取消部署,停止应用程序并从tomcat实例上移除其部分文件和部署名
    stop:停止
    start:将停止的webapp启动起来

部署方式:
    tomcat manager
    ANT 脚本
    war类归档程序的部署:将归档文件复制到$CATALINA_BASE/webapps/目录中,并重启tomcat即可:tomcat会自动展开war归档
    manager进行热部署

apache jserv protocal:二进制协议,使用httpd反向代理用户请求至tomcat时,在httpd和tomcat之间使用

vim server.xml
<Connector port="80" ...>
<Connector port="8080" address="127.0.0.1" maxThread="1024" enableLookups="false" ...>
<Host name="www.a.com" appBase="/www/webapps" unpackWARS="true" autoDeploy="true">
<Context path="" docBase="ROOT" reloadable="true" />
<Context path="/test" docBase="testapp" reloadable="true" />
<Value className="org.apache.catalina.valves,AccessLogVale" directory="logs">
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r"%s %b"/>
</Host>

mkdir -pv /www/webapps/ROOT/
vim /www/webapps/ROOT/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title> JSP test page.</title>
</head>
<body>
<%out.println("Hello,world!");%>
</body>
</html>

mkdir /www/webapps/testapp
vim /www/webapps/testapp/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title> JSP test page.</title>
</head>
<body>
<%out.println("Hello,magedu!");%>
</body>
</html>

配置文件中path相当于在浏览器中输入主机名后面是否要加定义的path目录,这个目录不需要存在,例如path=""表示要在浏览器中输入http://www.chenjiao.com/ ,如果path="/test"表示要在浏览器中输入http://www.chenjiao.com/test

catalina start

http://www.a.com
http://www.a.com/test

telnet localhost 8005
shutdown

配置用户和密码:
cd /usr/local/tomcat/conf
vim tomcat-users.xml
<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="admin-gui">
<user username="tomcat" password="tomcat" roles="tomcat,manager-gui,admin-gui"/>
</tomcat-users>

tomcat自带两个管理类的app:
server status:
获取状态信息
部署应用程序
host manager:
管理虚拟主机

tomcat的部署方式:

ajp:Apache jserv protocol(Apache使用反向代理的协议)

tomcat的安装
yum install jdk

tar -zxvf apache-tomcat-7.0.33.tar.gz -C /usr/local
cd tomcat

tomcat的主配置文件
cd conf

web.xml:一个默认的应用程序部署描述符
部署:将一个web应用程序所依赖的类装载进jvm

连接器:
ajp
http(web服务器)
https
proxy
apr(Apache portable runtime):java可运行时环境

每一个连接器都需要java类来实现

vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin

catalinash version
version.sh
catalinash start

TI1:
http:80,ajp:8009

TI2;
http:80

多实例
MySQL:同一物理服务器
运行多个MySQL,3306

Apache代理服务器采用模块有:
mod_proxy
mod_proxy_http
mod_proxy_ajp
mod_proxy_banlancer
mod_jk
mod_jk2

规划:Apache+tomcat
用Apache当做代理服务器,tomcat当做后端的真实代理服务器

采用mod_proxy做代理服务器

Apache:192.168.10.7

yum install apr-util-devel apr-devel

tar -jxvf apr-1.4.6tar.bz2 apr-util-1.5.2tar.bz2

cd apr-1.4.6
./configure --prefix=/usr/local/apr --disable-ipv6
make && make install

cd apr-util
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install

tar -zxvf httpd-2.4.2
cd httpd-2.4.2
./configure --prefix=/usr/local/apache --enable-proxy --enable-proxy-http --enable-prox
y-ajp
make && make install

代理一台tomcat:

采用http协议
cd /etc/http/conf.d/
vim mode_proxy.conf
ProxyVia on
ProxyRequests off
ProxyPreserveHost on
ProxyPass / http://192.168.10.6:8080/
ProxyPa***everse / http://192.168.10.6:8080/
<Location />
Order Allow,Deny
Allow from all
</Location>

采用ajp:
cd /etc/http/conf.d/
vim mode_proxy.conf
ProxyVia on
ProxyRequests off
ProxyPreserveHost on
ProxyPass / ajp://192.168.10.6:8009/
ProxyPa***everse / ajp://192.168.10.6:8009/
<Location />
Order Allow,Deny
Allow from all
</Location>

代理多台tomcat:
cd /etc/http/conf.d/
vim mode_proxy.conf
ProxyVia on
ProxyRequests off
ProxyPreserveHost on
<Proxy balancer://lb>
BalancerMember http://192.168.10.6:8080 loadfactor=1 route=TomcatA
BalancerMember http://192.168.10.7:8080 loadfactor=1 route=TomcatB
</Proxy>

<Location /lbmanager>
SetHandler balancer-manager
</Location>

ProxyPass /lbmanager !(表示访问lbmanager时不向后面代理)
ProxyPass / balancer://lb/ stickysession=JSESSIONID
ProxyPa***everse / balancer://lb/

<Location />
Order Allow,Deny
Allow from all
</Location>

TC1:192.168.10.6

./jdk-6u21-linux.i586-rpm.bin
tar -zxvf apache-tomcat-7.0.40.tar.gz -C /usr/local

vim /etc/profil.d/java.sh
export JAVA_HOME=/usr/java/jdk
export PATH=$PATH:/JAVA_HOME/bin

vim /etc/profil.d/tomcat.sh
export CATALINA=/usr/local/tomcat
export PATH=$PATH:/CATALINA/bin

vim /usr/local/tomcat/conf/server.xml
<Engine name="Catalina" defaultHost="locahost" jvmRoute=TomcatA>

cd /usr/local/tomcat/webapps/ROOT
vim index.jsp
内容见文档

scp /etc/profile.d/java.sh tomcat.sh 192.168.10.9:/etc/profile.d

TC2:192.168.10.7

./jdk-6u21-linux.i586-rpm.bin
tar -zxvf apache-tomcat-7.0.040.tar.gz -C /usr/local

vim /usr/local/tomcat/conf/server.xml
<Engine name="Catalina" defaultHost="locahost" jvmRoute=TomcatB>

cd /usr/local/tomcat/webapps/ROOT/
vim index.jsp
内容见文档

采用mod_jk做反向代理:

代理一台tomcat:
yum install httpd-devel
tar -zxvf tomcat-connectors-1.2.37-src.tar.gz
cd tomcat-connectors-src
cd native
./configure --with-apxs=/usr/sbin/apxs
make && make install
cd /usr/lib64/httpd/modules
cd /etc/httpd/conf.d
mv mod_proxy.conf mod_proxy.conf_bak(把以前采用mod_proxy模块进行的代理配置文件删除掉)

vim mod_jk.conf
LoadModule jk_module modules/mod_jk.so
JkWorksFile /etc/httpd/conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /* TomcatA
JkMount /status/ statA

vim workers.properties
worker.list=TomcatA,statA
worker.TomcatA.port=8009
worker.TomcatA.host=192.168.10.6
worker.TomcatA.type=ajp13
worker.TomcatA.lbfactor=1
worker.stat1.type = status

service httpd restart

http://172.16.100.6/status

代理多台tomcat:
vim mod_jk.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /* lbcA
JkMount /status/ statA

vim workers.properties
worker.list=lbcA,statA
worker.TomcatA.port=8009
worker.TomcatA.host=192.168.10.6
worker.TomcatA.type=ajp13
worker.TomcatA.lbfactor=1
worker.TomcatB.type=ajp13
worker.TomcatB.port=8009
worker.TomcatB.host=192.168.10.7
worker.TomcatB.lbfactor=1
worker.lbcA.type=lb
worker.lbcA.sticky_session=0或者1
wooker.lbcA.balance_workers=TomcatA,TomcatB
worker.stat1.type = status

session复制:
tomcat支持session集群
session服务器:
tomcat支持将会话保存了memcached

Cluster
LB
4层lb
lvs,haproxy(tcp)
7层lb
apache(mod_jk,mod_proxy):ajp
apache(mod_proxy),haproxy,nginx:http
HA
HP

Tomcat Cluster配置:
在tomcat1和tomcat2上面在配置文件server.xml中添加

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.50.10.1" bind="172.16.100.1"(在另一台换成它的地址) port="45564"
frequency="500" dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="172.16.100.1"(在另一台换成它的地址) port="4000" autoBind="100"
selectorTimeout="5000" maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter="..gif;..js;..jpg;..htm;..html;..txt;"/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/" watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

以上内容定义在Engine容器中,则表示对所有主机均启动用集群功能。如果定义在某Host中,则表示仅对此主机启用集群功能。

总结:构建DeltaManager集群步骤:
1.在各节点的server.xml的engine或host容器添加如上内容:注意修改MemberShip组件中的多播地址address=“228.0.0.4”,建议修改Receiver中的address为本机能够传递心跳信息的地址;
2.在各节点为使用组播地址添加组播路由,格式:route add -net $MCAST_ADDRESS netmask 255.255.255.255 dev eth0
3.在相应应用程序的web.xml(把web.xml拷到部署工程的目录中的WEB-INF目录下)中添加<distributable\>

各种学习网站
www.sourceforge.org
www.slideshare.net
www.wordpress.com
www.github.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章