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