一、tomcat环境结构/原理
JDK(java sdk) java的开发工具包
--|JAVA基础API: .java源程序编译成.class字节码文件
   --|JAVA编译器(jre):jre调用JVM将.class字节码文件编译成机器可识别执行的程序(执行java程序)
   --|JVM:java虚拟机,有独立的控制器,内存域…..
   --|大量的java工具
JVM堆内存(java对象的活动空间)
   --|永久存储区:存储JVM自己的类和方法对象
   --|新生区(JVM生成的所在新对象放在新生区中,类的诞生、成长、消亡的区域)
       ----|伊甸区Eden space:类被new出来
       ----|幸存区Survivor space 
           ------|survivor 0区
           ------|Survivor 1区
   --|老年区:一旦对象经历了一定数量和垃圾收集循环后,便进入此区域。
JVM垃圾回收过程:
当伊甸园的空间用完时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收,将伊甸园区中的不再被其他对象所引用的对象进行销毁。然后将伊甸园中的剩余对象移动到幸存0区。若幸存0区也满了,再对该区进行垃圾回收,然后移动到1区。那如果1区也满了呢?再移动到老年区。

原理:
1. JVM垃圾回收机制与GC性能调优
垃圾回收主要是对新生区与老年区块内存进行回收。
1)GC流程:
[older generation][survivor 1][survivor 2][eden]
Young generation=eden + survivor
当Eden区满触发young GCyoung GC去掉一部分没用的object,把老的还被引用的object发到survivor里,等下几次GC后,survivor再放到old里面当old满触发full GC(很消耗内存),把old,young里大部分垃圾回收掉,这个时候用户线和都会被block.
2)性能调优:
JVM堆的大小决定了GC的运行时间。如果JVM堆的大小超过一定的限度,那么GC的运行时间会很长。
对象生存的时间越长,GC需要的回收时间也越长,影响了回收速度。
大多数对象都是短命的,所以,最好能让这些对象的生存期在GC的一次运行周期内
应用程序中,建立与释放对象的速度决定了垃圾收集的频率
如果GC一次运行周期超过3-5秒,这会很影响应用程序的运行,如果可以,应该减少JVM堆的大小了。
前辈经验之谈:通常情况下,JVM堆的大小应为物理内存的80%。
2. Apache与tomcat的整合
Apache只支持静态网页,tomcat是支持java程序的容器,本身可以做web server但是在处理静态页面时没有apache迅速。
Apache2.2版本后,出现的两种连接器http-proxy和proxy-ajp模块,apache的proxy(代理)模块可以实现双向代理,连接器的实现原理:
http-proxy模块:只需打开tomcat的http功能,然后用apache的proxy代理功能将动态请求交给tomcat处理,而静态数据交给apache自身就可以了
proxy-ajp模块:是专门为tomcat整合所开发的,通过ajp协议专门代理对tomcat的请求.

二、环境安装(apache+tomcat+jdk)
源码安装包统一存放路径:/usr/local/src/…
必备安装包:
apche:   http://mirrors.tuna.tsinghua.edu.cn/apache/httpd/httpd-2.2.24.tar.gz
TOMCAT: http://mirrors.cnnic.cn/apache/tomcat/tomcat-6/v6.0.36/bin/apache-tomcat-6.0.36.tar.gz
JDK:     http://download.chinaunix.net/down.php?id=33932&ResourceID=61&site=1

按需可选包:
memcache:
https://github.com/downloads/libevent/libevent/libevent-2.0.13-stable.tar.gz
http://memcached.org/   memcached-1.4.15.tar.gz
apache-ant:
http://archive.apache.org/dist/ant/binaries/apache-ant-1.6.5-bin.tar.gz

1、apache安装:略
2、jdk,tomcat包安装直接解压,解压目录路径添加至环境变量中即可.
# cd /usr/local/src/
# chmod +x jdk-6u26-dlj-linux-amd64.bin
# ./jdk-6u26-dlj-linux-amd64.bin 
# cd jdk1.6.0_26/
# mkdir -p /usr/local/java
# mv jdk1.6.0_26 ../java/
# vi /etc/profile         添加环境变量
  #add java enviroment varaible
  export JAVA_HOME=/usr/local/java/jdk1.6.0_26
  export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
  export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

# source /etc/profile
# java --version
Error occurred during initialization of VM
java/lang/NoClassDefFoundError: java/lang/Object
如果出错解决如下:
# cd jdk1.6.0_26/lib/
# unpack200 tools.pack tools.jar
# cd ../jre/lib/
# unpack200 rt.pack rt.jar
# java -version
  java version "1.6.0_26"
  Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
  Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
查看验证:
# echo $JAVA_HOME
  /usr/local/java/jdk1.6.0_26
# echo $PATH
  /usr/local/java/jdk1.6.0_26/bin:/usr/local/java/jdk1.6.0_26/jre/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin

#tar -zxvf apache-tomcat-6.0.36.tar.gz
#mv apache-tomcat-6.0.36 /usr/local/tomcat
[root@localhost tomcat]# ./bin/startup.sh     直接执行tomcat启动脚本
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/java/jdk1.6.0_26
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar


问题总结:
Could not find the main class: nagement.jmxremote.ssl=false. 
环境变量问题,定义类,lib下可能没取到:
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:$TOMCAT_HOME/bin:$ANT_HOME/bin:$JAVA_HOME/lib

三、配置文件
apache与tomcat整合
1、apache配置说明: httpd.conf
apache与tomcat整合通过apache的proxy模块, Apache通过ajp协议与tomcat进行通信,ip地址和端口唯一确定了tomcat节点和配置的ajp接受端口。
ProxyPreserveHost on
ProxyPass /sso  balancer://sso lbmethod=bytraffic stickysession=jsessionid|JSESSIONID

    BalancerMember ajp://127.0.0.1:8009/sso loadfactor=1

ProxyPass / http://127.0.0.1:8080/
ProxyPa***everse / http://127.0.0.1:8080/

2、tomcat配置说明: /usr/local/tomcat/conf/server.xml

#连接器所监听的端口,http协议接受用户的请求及相关参数

#连接器所监听的端口, AJP协议只可以接受前端apache服务器的请求


# Tomcat 虚拟目录的设置

3、添加tomcat管理用户

  
      

4、测试
直接访问:http://ip或http://ip/sso测试

 

 

========================proxypass说明=====================================

##################### httpd.conf ######################
     Apache Module mod_proxy_balancer
官网样例:
Before we dive into the technical details, here's an example of how you might use mod_proxy_balancer to provide load balancing between two back-end servers:


BalancerMember http://192.168.1.50:80
BalancerMember http://192.168.1.51:80

ProxyPass /test balancer://mycluster
-------------------------------------------
实例:
ProxyPass /center  balancer://center lbmethod=bytraffic stickysession=jsessionid|JSESSIONID

    BalancerMember ajp://127.0.0.1:8009/center loadfactor=1

ProxyPass /service  balancer://service lbmethod=bytraffic stickysession=jsessionid|JSESSIONID

    BalancerMember ajp://127.0.0.1:8009/service loadfactor=1

ProxyPass /ps  balancer://ps lbmethod=bytraffic stickysession=jsessionid|JSESSIONID

    BalancerMember ajp://127.0.0.1:8009/ps loadfactor=1

将对http://localhost/ps/***的本地请求内部转换成到ajp://127.0.0.1:8009/ps/***
如果代理的指令类型以balancer://开头那么会创建一个虚拟工作单元,并不直接和后端服务器通讯。它负责对一些“真正”的工作单元进行管理。
这种情况下可以给虚拟工作单元添加一系列额外参数。
如下:
参数        默认值         描述
lbmethod   byrequests      选择均衡器的负载均衡方式。可以是byrequests,进行加权请求计数,或者是bytraffic,进行加权流量字节计数均衡。默认按请求数。
stickysession            均衡器粘连会话名称。该值常常会被设置为类似JSESSIONID或者PHPSESSIONID之类的值,他依赖于支持会话的后端应用服务器。
如果后端服务器使用不同的cookie名称或者URL编码的ID(像servlet容器),使用|来分开他们。第一个部分针对cookie,第二个针对路径。  
loadfactor    1         工作单元负载系数。用于BalancerMember。它是一个1到100之间的数字,用于定义应用于该工作单元的正规化权重负载

########################### tomcat ########################

-------------------------------------------
conf/server.xml



参数说明:
path:指定访问该Web应用的URL入口
docBase:指定Web应用的文件路径,可以给定绝对路径,也可以给定相对于的appBase属性的相对路径
reloadable:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,
如果监测到有class文件被更新的,服务器会自动重新加载Web应用