• 1. Apache Tomcat 10 YEARS
  • 2. 目录-----tomcat最佳实践1,WEB SERVER介绍 2,TOMCAT目录结构 3,TOMCAT端口管理 4,TOMCAT账号管理 5,TOMCAT配置数据库 6,TOMCAT监控软件安装 7,TOMCAT环境变量 8,TOMCAT和JVM的配置 9,TOMCAT基于名称的虚拟主机 10,TOMCAT IP访问控制 11,TOMCAT访问日志记录 12,TOMCAT状态验证 13,TOMCAT设置SSL访问 14,TOMCAT安全策略 15,TOMCAT的URL编码格式 16,TOMCAT传输压缩 17,TOMCAT集群和负载均衡 18,ECD部门AP(TOMCAT)部署规范
  • 3. WEB SERVER介绍Web服务器 Jetty(目前google/Yahoo使用) 体积小,灵活,适合作为嵌入式应用 Tomcat 集群和监控支持较好,功能完整,实现规范,是SUN支持的项目 Jweb tomcat+apache=jweb 参考资料较少,普及率较低 J2EE服务器 JBoss AS     GlassFish  Weblogic WebSphere Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和Jsp规范总能在 Tomcat中得到体现 Jakarta项目是在Apache软件基金会营运的公开源代码软件开发项目之一。开发着面向编程语言Java的程序库,框架等。 Jakarta项目是在Apache软件基金会营运的公开源代码软件开发项目之一。开发JAVA的程序库,框架。 本文致力于tomcat的最佳实践,介绍了tomcat的各种功能和使用技巧。
  • 4. TOMCAT目录结构目录结构七层
  • 5. TOMCAT目录结构CATALINA_HOME指的是tomcat的安装目录,如C:\Tomcat6.0 bin目录:控制tomcat的启动与关闭,以及与启动关闭有关的安全管理 conf目录:配置文件 lib目录:Tomcat容器使用的所有jar包和多个web应用程序共享的jar包 log目录:Tomcat生成的日志文件。日志文件是按天为单位生成 temp目录:Tomcat用来存放临时文件 webapps目录: Tomcat默认的web应用程序存放位置 work目录: Tomcat将jsp文件转换为java servlet的地方
  • 6. TOMCAT目录结构Server.xml图形化 一个server可有多个sercice 一个sercice可有多个connector 和一个engine
  • 7. TOMCAT目录结构常用的配置文件简单介绍 server.xml:Tomcat中最重要的配置文件,定义了tomcat的体系结构 设置端口,集群,web应用,访问日志等主要功能。 tocmat-users.xml:Tocmat管理员身份的配置文件 关键是设置管理员账号的密码 context.xml:全局context的配置文件。 将数据库JNDI在这里定义好 logging.properties: Tocmat日志配置文件 可以修改默认的Tocmat日志路径和名称
  • 8. TOMCAT端口管理说明:当一个server需要部署2个或2个以上TOMCAT时,请按照本规则进行部署 目的:统一端口使用规则,避免端口冲突,合理规划端口资源,方便故障诊断 注意: 1,正式环境中,虽然ajp和http仅会用到其中之一端口,但不要取消ajp或者http端口 2,出现端口争用问题后,可以使用probe查看TOMCAT占用端口信息 3,有些操作系统,当端口出现争用情况后,OS可能会另外为TOMCAT分配一个端口 4,不要分配8000以下端口给TOMCAT,即使OS仅保护1024以下端口 5,正式环境部署,请参照端口TOMCAT端口管理表部署 6,443类端口可在http端口前统一加3即可。 例如,8080端口对应的443实际端口就是38080
  • 9. TOMCAT端口管理表项目名Shutdown端口 http端口Ajp端口mio8080800080809000mio8081800180819001mio8082800280829002mio8083800380839003mio8084800480849004mio8085800580859005mio8086800680869006mio8087800780879007mio8088800880889008mio8089800980899009
  • 10. TOMCAT账号管理设置: 1,修改TOMCAT_HOME/conf/tomcat-users.xml 2,仅设置两个role:admin,manager。 3,创建一个管理账号,并加入admin,manager的role 4,tomcat的管理,发布,监控全部使用该管理账号 修改好的tomcat-users.xml文件示例
  • 11. TOMCAT配置数据库 设置: 1,修改TOMCAT_HOME/conf/context.xml 2,将数据库的JDBC驱动放入TOMCAT_HOME/lib下 3,重启TOMCAT,进行验证即可 4,使用方法: Resource name=“jdbc/MioDS”中明确指出 名称是“jdbc/MioDS” 5,代码中DataSource ds =(DataSource)ctx.lookup("java:comp/env/jdbc/MioDS"); 优点: 1,管理:不需要修改代码即可以适应开发,测试,正式环境,因为名称都是“jdbc/MioDS” 2,监控:TOMCAT监控程序可以实时显示数据源状态 3,安全:项目开发和测试人员不必知道数据库账号这类敏感信息 4,性能:使用连接池可以提升系统效能 注意:文章中使用的“jdbc/MioDS”仅仅是示例作用,可以根据项目具体命名
  • 12. TOMCAT配置数据库context.xml文件示例 WEB-INF/web.xml 具体参数含义参考: http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html
  • 13. TOMCAT监控软件安装监控软件:Lambda Probe 软件介绍:Lambda Probe(Tomcat Probe)是一个基于Web以实时的方式来管理单 个Tomcat主机的工具。它除了具备标准Tomcat Manager大部份功能之外 还提供一些能够帮助Web开发者和系统管理员更加清楚地了解Tomcat运 行情况的功能。 登陆账号: tomcat-users.xml文件中设置的user账号具有admin,manager的role 安装方法:1,以命令行方式启动的tomcat 在catalina.bat/catalina.sh中 在JAVA_OPTS项中添加-Dcom.sun.management.jmxremote 2,以服务方式启动的tomcat 在JAVA OPTIONS中添加一行 -Dcom.sun.management.jmxremote 3,将probe.war安装包放在tomcat_home/webapps下即可 管理界面:http://localhost:8080/probe
  • 14. TOMCAT环境变量正确方法:在需要运行的tomcat的catalina.sh/catalina.bat中设置java_home变量即设置了三个变量 java_home, catalina_home, catalina_base 设置catalina_home,catalina_base危害: 导致被设置的服务器仅能在指定CATALINA_HOME目录中运行唯一的TOMCAT 注意: 1,不要在正式系统中部署安装版的TOMCAT 2,不要在任何系统path中写入TOMCAT环境变量,包括CATALINA_HOME, CATALINA_BASE,JAVA_HOME
  • 15. TOMCAT和JVM的配置1,系统选型最重要:重要项目AP尽可能使用64位系统 64位系统JVM内存最高可以设置为3800MB左右 32位系统JVM内存最高可以设置为1500MB左右 单一TOMCAT 64位系统可以使用内存3800MB,32位仅能使用1500MB 2,根据系统物理内存大小合理设置下列五个参数catalina.sh/catalina.bat -server -Xms300m -Xmx300m -XX:PermSize=100m -XX:MaxPermSize=100m -Xms=-Xmx -XX:PermSize=-XX:MaxPermSize 正式服务器必须设置以上参数,以尽可能压榨服务器性能 以上参数经过长久验证,可以稳定运行在各种操作系统平台和JDK版本上 相关参数具体取值自己考虑,不要超过(物理内存-其他程序内存)的80%即可。 3,没有特殊理由,不要设置除上述五个参数之外的JVM参数 原因:1,无法保证各种操作系统平台的可移植性 2,过度干涉JVM内存管理会导致无法预料的后果
  • 16. TOMCAT和JVM的配置非服务方式启动的TOMCAT配置方法 修改 tomcat_home/bin/catalina.sh 添加以下内容: JAVA_HOME=/export/home/jdk1.6.0_16 JAVA_OPTS="-server -Xms3000m -Xmx3000m -XX:PermSize=400m -XX:MaxPermSize=400m -Dcom.sun.management.jmxremote“ 修改 tomcat_home/bin/catalina.bat 添加以下内容: set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_16 set JAVA_OPTS=-server -Xms300m -Xmx300m -XX:PermSize=100m -XX:MaxPermSize=100m -Dcom.sun.management.jmxremote 两者区别: linux/unix系统使用.sh文件,不需要set,但有”“ Windows系统使用.bat文件,需要set,但不能有”“ 64位系统JVM内存最高可以设置为3800MB左右 32位系统JVM内存最高可以设置为1500MB左右
  • 17. TOMCAT和JVM的配置服务方式启动的TOMCAT配置方法—针对WINDOWS系统 在JAVA选项中,设置JAVA OPTIONS,添加以下三个参数,每行一个,不能并列 -XX:PermSize=256m -XX:MaxPermSize=256m -Dcom.sun.management.jmxremote Initial memory pool 1000 Maximum menory pool 1000 不要设置thread stack size 该值依据操作系统会有很大不同
  • 18. TOMCAT基于名称的虚拟主机使用场景:一个IP地址对应多个项目并且使用相同的端口号 例如80端口 使用条件:有几个项目就要有几个域名并且域名与项目一一对应 使用范围:国内IDC提供的虚拟主机都是基于名称的虚拟主机技术共享IP地址 缺点:在使用虚拟主机的时候,仅能使用域名对项目访问不能使用IP访问 优点:可以节省公网IP地址资源,节约成本。 因为1个公网IP地址成本远远高于5个域名的成本
  • 19. TOMCAT基于名称的虚拟主机设置方法: 1,通过修改server.xml文件设置tomcat_home/conf/server.xml的Engine下 每个host可以设置一个域名,并且可以绑定一些域名的别名 appBase指定的是项目的路径,可以使用绝对路径,也可以使用相对路径,也可以随意命名 可以设置非常多数量的域名用来指定到对应的项目上去,来解决公网IP紧缺问题 2,通过http://localhost:8080/host-manger/html访问tomcat控制台,通过页面进行设置
  • 20. TOMCAT访问控制使用情形:项目仅对部分用户开放,虽然有账号登陆功能,但是结合IP地址会更加安全 要求:1,项目本身仅对部分用户开放,而不是部分功能对用户开放 2,针对用户群最好有固定的IP地址段则会使策略更加有效 设置:在tomcat_home/conf/server.xml中的Host中添加下面内容 21. TOMCAT访问日志记录使用情形:详细记录用户访问记录对很多问题都有帮助 益处: 1,提供项目日常访问量,用户数,来源等信息 2,分析问题时候快速定位问题用户 设置:在tomcat_home/conf/server.xml中的Host中添加下面内容 Pattern是设置日志格式的,可以使用pattern=“combined” 记录详细日志信息 resolveHosts是关于是否将IP转化为主机名 一般不需要,会影响系统性能
  • 22. TOMCAT访问日志记录通过F5转发请求后的日志处理: 1,需要在F5设备上在header中insert x-forwarded-for 2,需要在tomcat上修改日志记录格式才可以记录客户端真实IP地址     3,代码中获取客户端真实IP地址: <%=request.getHeader(“x-forwarded-for”)%> 可以获取客户端真实IP地址 <%=request.getRemoteAddr()%>无法获取客户端真实IP地址,仅能获取代理服务器地址 <%=request.getRemoteHost()%>无法获取客户端真实IP地址,仅能获取代理服务器地址
  • 23. TOMCAT访问日志记录访问日志的分析和挖掘还需要结合google analytics来进行。 类似google analytics的有piwik,yahoo 如果日志文件超过文本编辑器的打开尺寸,可以使用analog,weblog expert,awstats,w3perl来处理那种 体积的日志文件。 目前部门的解决方案: 1,tocmat/apache访问日志记录 作为黑客攻击后分析的主要信息来源 2,webtrain台湾总部日志记录 作为台湾总部规划的参考 3,google analytics日志记录 作为用户信息分析和挖掘的主要手段 4,yahoo日志记录 作为日常流量的评估工具
  • 24. TOMCAT状态验证目的:在AP或者项目出现问题之后,可以使用该方法进行测试,帮助快速定位问题位置 URL:http://x.x.x.x:x/dbtest/test.jsp (xxxx:x是服务器的IP和端口信息) 验证内容: 1,AP和数据库连接是否正常 2,AP本身是否正常 3,AP运行基本信息 4,JNDI是否正确 。。。。。。 注意事项:验证内容以能达到目的而提供最少内容为宜,如果验证脚本太过复杂,会使该项的目的失去意义
  • 25. TOMCAT设置SSL访问 SSL访问要求: 1,证书 server.key 2,密钥 password 设置方法:修改tomcat/conf/server.xml文件 将以下内容替换原来8443的即可,不要确保路径正确并存在证书
  • 26. TOMCAT安全策略现状:任何AP都会有安全漏洞,基于目前部门的实际情形,无法完全避免。 目标:尽量减少安全漏洞的出现,增加黑客破解的成本。 安全策略: 1,设置超过16位长度的用户名和密码---提升暴力破解的成本 2,定期检查访问日志,周期性的抽查访问日志 3,将manager,probe项目重命名为ecd-server,ecd-manager 4,设置访问控制列表 6,使用apache作为前端代理服务器,控制部分URL不转发或者将URL重写 例如,仅转发项目特定的URL,其余全部不转发,保证安全性。
  • 27. TOMCAT的URL编码格式如果URL当中会有非英文字符,那么需要通过AP进行URL编码格式的定义,否则URL中的非英文字符无法保证正确解析。 无特殊要求的情况下,需要将URL编码设置为和项目统一的编码格式。 部门目前统一使用UTF-8字符编码方式
  • 28. TOMCAT传输压缩通过启用传输压缩功能,可以减少server的网络流量,节省带宽 Tomcat默认没有自动gzip压缩,可以尝试启用tomcat的gzip压缩。 部门建议: 使用apache处理前端请求,并且在apache端进行传输压缩的设置。减少AP的压力 Tomcat进行传输压缩的设置方法:修改server.xml 验证:http://www.gidnetwork.com/tools/gzip-test.php
  • 29. TOMCAT集群和负载均衡模式: 1,故障转移 有两台tomcat A B,A负责接收请求响应,B作为A的故障转移服务器,不处理请求,仅在A宕机之后作为应急响应,才会处理请求。在A恢复之后,就又不接受请求了。 2,负载均衡 有两台tomcat A B,A B共同接受请求响应,分摊流量,一台宕机不会影响应用的使用,并且对用户透明 3,session复制 上述两种集群,当服务器宕机故障转移时,会影响宕机时的用户,之后的用户不会影响。
  • 30. TOMCAT集群和负载均衡最初架构: TOMCAT当前端AP处理所有请求
  • 31. TOMCAT集群和负载均衡第一次改进: Apache作为前端AP,提升稳定性 Apache将动态内容转发给tomcat处理
  • 32. TOMCAT集群和负载均衡第二次该进: Tomcat做负载均衡接受apache请求 这样可以避免tomcat宕机导致应用不可用 因为apache宕机的概率远远小于tomcat 另外,维护操作可以不影响业务运行
  • 33. TOMCAT集群和负载均衡第三次该进: Tomcat进行session复制,从而保证 任何业务和用户都不会因为停机而中断
  • 34. TOMCAT集群和负载均衡第四次该进: 消除apache单点故障利用LVS 目前,我们使用的是F5硬件设备实现 LVS的部分, 提升稳定性,降低复杂程度。
  • 35. TOMCAT集群和负载均衡实际请求流程
  • 36. ECD部门AP(TOMCAT)部署规范目的: 1,便于服务器管理和维护 2,便于服务器备份操作 3,便于应急人员(非项目直接维护人员)快速熟悉系统环境 4,便于应用服务器快速迁移(故障迁移时候非常重要) 5,防止在服务器上胡乱放置文件夹带来的安全隐患(人为误删除) 注意: 1,本规范以TOMCAT为例,其余AP服务器以同样方式处理即可,无需一一举例 2,LINUX环境和SOLARIS环境的路径唯一区别:绝对路径少了/export开头 SOLARIS /export/home/ecd LINUX /home/ecd 3,WINDOWS在非系统盘根目录建ECD文件夹,后续路径相同 4,不接受C盘(windows系统)部署系统 5,不接受磁盘空间小于40GB磁盘分区部署系统
  • 37. ECD部门AP(TOMCAT)部署规范SOLARIS环境 /export/home/ecd/ 部门AP服务器部署的根目录 /export/home/ecd/tomcat 所有tomcat安装目录 /export/home/ecd/weblogic 所有weblogic安装目录 /export/home/ecd/jdk 所有jdk安装目录 /export/home/ecd/soft 所有soft存放目录 /export/home/ecd/backup 所有备份文档存放目录 如果服务器需要安装三个版本的JDK,那么在/export/home/ecd/jdk安装即可 /export/home/ecd/jdk/jdk1.6 /export/home/ecd/jdk/jdk1.5 /export/home/ecd/jdk/jdk1.4 强制安装路径是大家都熟悉的,可以做到尽量公用,也便于资源统一管理 将安装文件,备份文件归入对应的目录,可以避免在磁盘空间不足之后,清理 磁盘空间时,因为不知道用途而无法进行安全和彻底的清理
  • 38. ECD部门AP(TOMCAT)部署规范TOMCAT版本对项目影响较小,统一使用固定版本的TOMCAT,降低维护难度 TOMCAT4 和TOMCAT5共存,统一使用TOMCAT5 TOMCAT5 和TOMCAT6共存,统一使用TOMCAT6 TOMCAT4,TOMCAT5,TOMCAT6没有理由共存一台服务器 集群和负载均衡可能会在同一台机器使用多个TOMCAT,依照下面的规则命令 1,项目+端口名称(防止服务器用途变更出现两个或两个以上项目后命名冲突) 2,端口是可以接受请求处理的端口,而不是ajp或者其他类型端口 3,项目名称尽量小写,降低unix/linux服务器操作难度(频繁切换大小写很痛苦) 4,TOMCAT集群尽量避免使用8080端口 例如项目MIO做集群使用了三个TOMCAT在一台服务器上,那么其目录结果如下: /export/home/ecd/tomcat/mio8081 说明项目名称和请求端口 /export/home/ecd/tomcat/mio8082 说明项目名称和请求端口 /export/home/ecd/tomcat/mio8083 说明项目名称和请求端口 /export/home/ecd/tomcat/tomcat6.20 说明tomcat版本号 /export/home/ecd/tomcat/for-mio-person 说明维护项目的人员 /export/home/ecd/tomcat/upload 上传项目文件目录,便于版本历史追溯