TOMCAT之性能跟踪入门

先扫清前面的障碍,再慢慢进入核心

转一下网上的我关心的话题,实施起来

 

~~~

使用Nginx作为反向代理时,Tomcat的日志记录的客户端IP就不在是真实的客户端IP,而是Nginx代理的IP。要解决这个问题可以在Nginx配置一个新的Header,用来存储$remote_add,然后再Tomcat获取记录这个值。

 

1.Nginx新增配置:

 

 

[java] view plaincopyprint?

 

  1. proxy_set_header  X-Real-IP  $remote_addr;  

 

 

 

可以参见:http://wiki.nginx.org/NginxHttpProxyModule

其实就是新增了一个名为X-Real-IP值为真实客户端IP的头信息。

 

2.修改tomcat日志配置:

 

[c-sharp] view plaincopyprint?

 

  1. <Valve className="org.apache.catalina.valves.AccessLogValve"  
  2.                 directory="logs"  prefix="tomcat_access_log." suffix=".txt"  
  3.                 pattern="%a %r %t %{X-Real_IP}i" resolveHosts="false"/>  

 

 

可以参见:http://www.docjar.org/docs/api/org/apache/catalina/valves/AccessLogValve.html

没有Nginx这一层的时候直接用%a就可以获得客户端IP,现在我们得用%{X-Real-IP}i 来获得真实的IP了。

~~~~~~~~~~~~~~~~~~

Tomcat的访问日志是靠org.apache.catalina.valves.AccessLogValve来控制的,你可以修改$tomcat/conf/server.xml来启用它 ($tomcat是Tomcat安装的目录)。AccessLogValve默认应该是注释掉的,简单的将其注释去掉,然后重启Tomcat就可以了。

以下是Tomcat默认的配置:

<Valve className=“org.apache.catalina.valves.AccessLogValve”
directory=“logs” prefix=“localhost_access_log.” suffix=“.txt”
pattern=“common” resolveHosts=“false”/>

你可以设置日志保存的目录(directory),日志的文件名的前缀(prefix),后缀(suffix)和日志的具体格式。保存目录,文件名的前缀、后缀都很简单,一般默认设置也就可以了。resolveHost出于性能的考虑,一般也设为false. 但访问日志的格式(pattern)却有很多的选项供你选择。以下列出了一些基本的日志格式项:

  • %a – 远程主机的IP (Remote IP address)
  • %A – 本机IP (Local IP address)
  • %b – 发送字节数,不包含HTTP头,0字节则显示 ‘-’ (Bytes sent, excluding HTTP headers, or ‘-’ if no bytes
    were sent)
  • %B – 发送字节数,不包含HTTP头 (Bytes sent, excluding HTTP headers)
  • %h – 远程主机名 (Remote host name)
  • %H – 请求的具体协议,HTTP/1.0 或 HTTP/1.1 (Request protocol)
  • %l – 远程用户名,始终为 ‘-’ (Remote logical username from identd (always returns ‘-’))
  • %m – 请求方式,GET, POST, PUT (Request method)
  • %p – 本机端口 (Local port)
  • %q – 查询串 (Query string (prepended with a ‘?’ if it exists, otherwise
    an empty string)
  • %r – HTTP请求中的第一行 (First line of the request)
  • %s – HTTP状态码 (HTTP status code of the response)
  • %S – 用户会话ID (User session ID)
  • %t – 访问日期和时间 (Date and time, in Common Log Format format)
  • %u – 已经验证的远程用户 (Remote user that was authenticated
  • %U – 请求的URL路径 (Requested URL path)
  • %v – 本地服务器名 (Local server name)
  • %D – 处理请求所耗费的毫秒数 (Time taken to process the request, in millis)
  • %T – 处理请求所耗费的秒数 (Time taken to process the request, in seconds)

你可以用以上的任意组合来定制你的访问日志格式,也可以用下面两个别名common和combined来指定常用的日志格式:

  • common – %h %l %u %t "%r" %s %b
  • combined -
    %h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"

另外你还可以将cookie, 客户端请求中带的HTTP头(incoming header), 会话(session)或是ServletRequest中的数据都写到Tomcat的访问日志中,你可以用下面的语法来引用。

  • %{xxx}i – 记录客户端请求中带的HTTP头xxx(incoming headers)
  • %{xxx}c – 记录特定的cookie xxx
  • %{xxx}r – 记录ServletRequest中的xxx属性(attribute)
  • %{xxx}s – 记录HttpSession中的xxx属性(attribute)

比如下面是实际的一个访问日志格式的配置:

<Valve className=“org.apache.catalina.valves.AccessLogValve”
directory=“logs” prefix=“phone_access_log.” suffix=“.txt”
pattern=“%h %l %T %t %r %s %b %{Referer}i %{User-Agent}i MSISDN=%{x-up-calling-line-id}i”resolveHosts=“false”/>

其中日志格式(pattern)指定为”%h %l %T %t %r %s %b %{Referer}i %{User-Agent}i MSISDN=%{x-up-calling-line-id}i“,则实际的访问日志中将会包括:

  • %h – 远程主机名
  • %l - 远程用户名,始终为 ‘-’
  • %T - 处理请求所耗费的秒数
  • %t – 访问日期和时间
  • %r – HTTP请求中的第一行
  • %s – HTTP状态码
  • %b – 发送字节数,不包含HTTP头(0字节则显示 ‘-’)
  • %{Referer}i – Referer URL
  • %{User-Agent}i – User agent
  • MSISDN=%{x-up-calling-line-id}i – 手机号

实际的访问日志如下:

xxx.xxx.xx.xxx – 0.270 [14/Jul/2008:13:10:53 +0800] POST /phone/xxx/gprs HTTP/1.1 200 91812 – SonyEricssonW890i/R1EA Profile/MIDP-2.1 Configuration/CLDC-1.1 MSISDN=11111111111

~~~~~~~~~~~~~~~~~~~~

注意%D %T参数,是下一步的锚点!!

~~~~~~~~~~~~~~~~~~~~~

1 - Tomcat Server的组成部分 
1.1 - Server 

A Server element represents the entire Catalina servlet container. (Singleton) 

1.2 - Service 

A Service element represents the combination of one or more Connector components that share a single Engine
Service是这样一个集合:它由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请求 

1.3 - Connector 

一个Connector将在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户 
TOMCAT有两个典型的Connector,一个直接侦听来自browser的http请求,一个侦听来自其它WebServer的请求 
Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求 
Coyote JK2 Connector 在端口8009处侦听来自其它WebServer(Apache)的servlet/jsp代理请求 

1.4 - Engine 

The Engine element represents the entire request processing machinery associated with a particular Service 
It receives and processes all requests from one or more Connectors 
and returns the completed response to the Connector for ultimate transmission back to the client 
Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名 
当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理 
Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理 

1.5 - Host 

代表一个Virtual Host,虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配 
每个虚拟主机下都可以部署(deploy)一个或者多个Web App,每个Web App对应于一个Context,有一个Context path 
当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理 
匹配的方法是“最长匹配”,所以一个path==""的Context将成为该Host的默认Context 
所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配 

1.6 - Context 

一个Context对应于一个Web Application,一个Web Application由一个或者多个Servlet组成 
Context在创建的时候将根据配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类 
当Context获得请求时,将在自己的映射表(mapping table)中寻找相匹配的Servlet类 
如果找到,则执行该类,获得请求的回应,并返回 

假设来自客户的请求为: 
http://localhost:8080/wsota/wsota_index.jsp 

1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得 

2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应 

3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host 

4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机) 

5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context 

6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为""的Context去处理) 

7) path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet 

8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类 

9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法 

10)Context把执行完了之后的HttpServletResponse对象返回给Host 

11)Host把HttpServletResponse对象返回给Engine 

12)Engine把HttpServletResponse对象返回给Connector 

13)Connector把HttpServletResponse对象返回给客户browser

时间: 2024-09-30 21:50:35

TOMCAT之性能跟踪入门的相关文章

Mysql教程:性能跟踪语句

原文链接:http://blog.chinaunix.net/u/29134/showart_480834.html MYSQL5.0家族提供的性能跟踪器确实很爽. 要注意两点. 1.不过版本要在5.0.37之后 手册上介绍:(SHOW PROFILES and SHOW PROFILE were added in MySQL 5.0.37. ) Important Please note that the SHOW PROFILE and SHOW PROFILES functionality

tomcat 接口性能突然变慢

问题描述 tomcat 接口性能突然变慢 我们的系统在运行一天到2天如果不重启,经常在某一秒所有的接口都变慢,之后一直很慢,执行full gc依旧很慢,必须重启才会变快.cpu负载是2,没有吃swap 解决方案 以前遇到过类似问题,重装后解决了. 解决方案二: 我擦重装操作系统吗?我这是线上的服务器,每次都有几台到十几台出现问题,每次出现问题的不是相同的服务器 解决方案三: Java吃了80%的内存?是不是消耗过多. 解决方案四: java虚拟机内存调整

JSP生成静态页面-Tomcat提高性能之王道

常见的分类信息首页,需读取至少六次数据库:其他子页面,五至十几次次不等. 在使用数据库连接池的情况下,Tomcat可以支撑的并发量也十分有限.系统资源主要消耗在两方面: 1.数据库操作,频繁的从数据库返回结果: 2.Tomcat解析JAVA文件. 将动态页面按一定规则创建一匹.html纯静态页面的过程,称之为生成静态页面. 优点 无须访问数据库,节省了最大的系统消耗. Tomcat直接返回.html静态文件,无须解析JAVA文件,最大限度的提高效率. 安全,避免了非法传递参数所导致的错误. 缺点

修改Tomcat Connector运行模式,优化Tomcat运行性能

omcat是一个小型的轻量级应用服务器,也是JavaEE开发人员最常用的服务器之一.不过,许多开发人员不知道的是,Tomcat Connector(Tomcat连接器)有bio.nio.apr三种运行模式,那么这三种运行模式有什么区别呢,我们又如何修改Tomcat Connector的运行模式来提高Tomcat的运行性能呢? 下面,我们先大致了解Tomcat Connector的三种运行模式. bio bio(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统

nginx或tomcat的性能优化调整详解

最近花了一点时间进行了NGINX加TOMCAT7集群压力测试,下面通过对一些常见问题的回答来说明如何调优服务器的性能,是自己的一些经验,且无实际数据,如有纰漏请见谅. 背景: TOMCAT7已加APR或者NIO.已装简单监控JCONSOLE,监控服务器内存,线程等基本情况. 问题1  一个Tomcat他的maxThreads到底配置多少合适? 一个好的maxThreads的配置就是达到资源的合理化应用. 资源池: 在讲其它东西之前,我们先引入一个概念,就是资源池.tomcat7中,他对http请

resin和tomcat的性能哪个更好?resin4.0.35还有硬编码的最大连接数限制吗?

问题描述 在网上看到的这二者的比较都莫衷一是.有人说二者差不多.有人说单实例resin能支持10000的并发,而tomcat只能支持到1000-2000.哪个是对的?还有,resin4.0.35免费版还有最大连接数256的限制吗?网上很多人说v3的时候是有这个限制的,写死在代码里了.我找了resin4.0.35的源码也没确定到底还有没有. 问题补充:为什么我把cxf实现的应用部署在resin上面,只能通过浏览器和xmlspy访问呢?soapUI和程序,还有cxf命令行工具都不能访问.而部署在to

利用Eclipse Profile Plugin对Tomcat进行性能监控分析

目前新版本的Eclipse在启动应用服务器的时候有一个新的选项:Start the server in profiling mode. 我个人使用的是tomcat6.0 但是我在一开始点击这个按钮的时候,出现了错误提示信息: Could not launch in profiling mode because no profilers are configured. 经过一番搜索,发现要求安装TPTP(Test and Performance Tools Platform),下面我把我的安装步骤

通向架构师的道路(第四天)之Tomcat性能调优-让小猫飞奔

一.总结前一天的学习 从"第三天"的性能测试一节中,我们得知了决定性能测试的几个重要指标,它们是: ü   吞吐量 ü   Responsetime ü   Cpuload ü   MemoryUsage 我们也在第三天的学习中对Apache做过了一定的优化,使其最优化上述4大核心指标的读数,那么我们的Apache调优了,我们的Tomcat也作些相应的调整,当完成今的课程后,到时你的"小猫"到时真的会"飞"起来的,所以请用心看完,这篇文章一方面用

Tomcat 生产服务器性能优化

  增加JVM堆(heap) 解决内存泄漏问题 线程池(thread pool)的设置 压缩 调节数据库性能 Tomcat原生库(native library) 其他选项 第一步  – 提高JVM栈内存Increase JVM heap memory 你使用过tomcat的话,简单的说就是"内存溢出". 通常情况下,这种问题出现在实际的生产环境中.产生这种问题的原因是tomcat使用较少的内存给进程,通过配置TOmcat的配置文件(Windows 下的catalina.bat或Linu