ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>嘿咻视频在线看,国产日韩精品一区二区三区,97人人澡人人爽91综合色http://www.aygfsteel.com/xiaomage234/category/53838.html生命本就是一‹Æ¡å‡„¾ŸŽçš„æ¼‚流åQŒè®°å¿†ä¸­æ”¾ä¸ä¸‹çš„åQŒæ°¸˜qœæ˜¯å­©ææ—¶ä»£çš„那一份浪漫与¾U¯çœŸåQ?/description>zh-cnThu, 12 Oct 2017 15:00:50 GMTThu, 12 Oct 2017 15:00:50 GMT60转: Nginx + Tomcat + HTTPS 配置不需要在 Tomcat 上启ç”?SSL 支持http://www.aygfsteel.com/xiaomage234/archive/2017/10/12/432853.htmlž®é©¬æ­?/dc:creator>ž®é©¬æ­?/author>Thu, 12 Oct 2017 03:02:00 GMThttp://www.aygfsteel.com/xiaomage234/archive/2017/10/12/432853.htmlhttp://www.aygfsteel.com/xiaomage234/comments/432853.htmlhttp://www.aygfsteel.com/xiaomage234/archive/2017/10/12/432853.html#Feedback0http://www.aygfsteel.com/xiaomage234/comments/commentRss/432853.htmlhttp://www.aygfsteel.com/xiaomage234/services/trackbacks/432853.html

最˜q‘做了个Web™å¹ç›®, 架构上ä‹É用了 Nginx +tomcat 集群, 且全站HTTPSåQŒç”¨nginx 做负载,nginxå’Œtomcat 使用内网http通信åQŒé‡åˆ°http cssåQŒjs静态资源被‹¹è§ˆå™¨æ‹¦æˆªé—®é¢˜ï¼Œ¾|‘上搜烦到的很多文章在描˜q?Nginx + Tomcat 启用 HTTPS 支持的时候,都必™åÕdœ¨ Nginx å’?Tomcat 两边同时配置 SSL 支持åQŒä»Šå¤©åšä¸ªæ€È»“ã€?/p>

遇到问题

  1. nginx强制使用https讉K—®(httpè·Œ™{到https)
  2. httpçš„jsåQŒcss ½{‰é™æ€èµ„源被‹¹è§ˆå™¨æ‹¦æˆªï¼ˆhttp不被信ä“QåQ?/li>

最后的解决æ–ÒŽ¡ˆ

首先解决½W¬ä¸€ä¸ªé—®é¢?/strong>全站https 
参è€?/a> 
三种方式åQŒè·Ÿå¤§å®¶å…׃ín一ä¸?/p>

nginxçš„rewriteæ–ÒŽ³•

server {   listen  192.168.1.111:80;   server_name test.com;   rewrite ^(.*)$  https://$host$1 permanent; }   

nginxçš?97状态码åQŒæˆ‘选择了这¿Uæ–¹å¼?/strong>

server {       listen       192.168.1.11:443;  #ssl端口       listen       192.168.1.11:80;   #用户习惯用http讉K—®åQŒåŠ ä¸?0åQŒåŽé¢é€šè¿‡497状态码让它自动跛_ˆ°443端口       server_name  test.com;       #ä¸ÞZ¸€ä¸ªserver{......}开启ssl支持       ssl                  on;       #指定PEM格式的证书文ä»?       ssl_certificate      /etc/nginx/test.pem;        #指定PEM格式的私钥文ä»?      ssl_certificate_key  /etc/nginx/test.key;        #让httpè¯äh±‚重定向到httpsè¯äh±‚        error_page 497  https://$host$uri?$args;   }   

index.htmlåˆäh–°¾|‘页

<html>   <meta http-equiv="refresh" content="0;url=https://test.com/">   </html>  

当http讉K—®åˆ°index.html时候自动蟩转到https


接下来解å†?strong style="box-sizing: border-box;">½W¬äºŒä¸ªé—®é¢?/strong> 
如果tomcat å’Œnginx 双方没有配置X-Forwarded-Proto tomcatž®×ƒ¸èƒ½æ­£¼‹®åŒºåˆ†å®žé™…用æˆäh˜¯http ˜q˜æ˜¯httpsåQŒå¯¼è‡´tomcat 里配¾|®çš„é™æ€èµ„æºè¢«è®¤äØ“æ˜¯http而被‹¹è§ˆå™¨æ‹¦æˆªï¼Œrequest.getScheme()æ€ÀL˜¯ httpåQŒè€Œä¸æ˜¯å®žé™…çš„http或https

分别配置一ä¸?Nginx å’?Tomcat åQŒæžœç„¶å¥½äº†ã€?nbsp;
配置 Nginx çš„è{发选项åQ?/strong>

 proxy_set_header       Host $host;       proxy_set_header  X-Real-IP  $remote_addr;       proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;       proxy_set_header X-Forwarded-Proto  $scheme;  
  • 1
  • 2
  • 3
  • 4

配置Tomcat server.xml çš?Engine 模块下配¾|®ä¸€ä¸?ValveåQ?/strong>

<Valve className="org.apache.catalina.valves.RemoteIpValve"   remoteIpHeader="X-Forwarded-For"   protocolHeader="X-Forwarded-Proto"   protocolHeaderHttpsValue="https"/>  
  • 1
  • 2
  • 3
  • 4

é?0端口配置 
Nginx增加以下配置 
proxy_set_header Host $host:$server_port; é?0端口 åQŒç”¨80端口æ—?不需è¦?server_port 
proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
proxy_set_header X-Forwarded-Proto $scheme; 

Tomcat server.xml配置 
<Engine name="Catalina" defaultHost="localhost"> 
<Valve className="org.apache.catalina.valves.RemoteIpValve" 
remoteIpHeader="X-Forwarded-For" 
protocolHeader="X-Forwarded-Proto" 
protocolHeaderHttpsValue="https" httpsServerPort="7001"/> é?0端口æ—Óž¼Œå¿…须增加httpsServerPort配置åQŒä¸ç„¶request.getServerPort()æ–ÒŽ³•˜q”回 443. 
</Engine>

关于 RemoteIpValve,可以阅读�doc

http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html



]]>
Tomcat7调试˜qè¡ŒçŽ¯å¢ƒæ­å¾ä¸Žæºä»£ç åˆ†æžå…¥é—¨http://www.aygfsteel.com/xiaomage234/archive/2015/12/24/428814.htmlž®é©¬æ­?/dc:creator>ž®é©¬æ­?/author>Thu, 24 Dec 2015 07:54:00 GMThttp://www.aygfsteel.com/xiaomage234/archive/2015/12/24/428814.htmlhttp://www.aygfsteel.com/xiaomage234/comments/428814.htmlhttp://www.aygfsteel.com/xiaomage234/archive/2015/12/24/428814.html#Feedback0http://www.aygfsteel.com/xiaomage234/comments/commentRss/428814.htmlhttp://www.aygfsteel.com/xiaomage234/services/trackbacks/428814.html原文  http://zhh2009.iteye.com/blog/1557891


1. 需要准备好下面˜q™äº›å·¥å…·

 

JDK 1.6+

Maven 2�

TortoiseSVN 1.7+ (ä»?.7å¼€å§?.svn"目录集中攑֜¨ä¸€å¤„了åQŒä¸å†æ¯ä¸ªç›®å½•下都放一ä»?

Eclipse 3.5+

 

˜q?个工具不在这里描˜q°æ€Žä¹ˆé…ç½®äº†ï¼Œå¦‚果你是有两三年开发经验的Java开发äh员,正常来讲都一直在用了ã€?/p>

另外åQŒåˆ†æžtomcat源代码不需要对˜q?个工具做什么特ŒDŠé…¾|®ã€?/p>

 

 

 

2. 下蝲Tomcat的源代码

 

Apache旗下的开源项目基本上都放在这: http://svn.apache.org/repos/asf

里面包含了tomcat、struts、hadoop、hbase½{‰æµè¡Œçš„开源项目的源代码,

可以直接用浏览器打开˜q™ä¸ªURLåQŒæˆ–者用TortoiseSVNçš„Repository Browser打开它ã€?/p>

tomcatçš„svnæ˜? http://svn.apache.org/repos/asf/tomcat , 如下图所½C?


 

目前tomcatæœ?个大分支: 

5.5 : http://svn.apache.org/repos/asf/tomcat/tc5.5.x

6.0 : http://svn.apache.org/repos/asf/tomcat/tc6.0.x

7.0 : http://svn.apache.org/repos/asf/tomcat/tc7.0.x

8.0 : http://svn.apache.org/repos/asf/tomcat/trunk

 

5.5分支会在今年9æœ?0号后停止¾l´æŠ¤åQŒæ‰€ä»¥é™¤éžæœ‰åŽ†å²é—ç•™¾pȝ»ŸåQŒä¸æŽ¨èå†åŽ»è¯Õd®ƒçš„代码,

 

6.0分支是比较成熟的åQŒåœ¨ç”Ÿäñ”环境用得比较多,

目前官方对这个分支进入维护、bugfix阶段åQŒå¾ˆž®‘有新功能添加进来了åQ?/p>

我个äºÞZ¹Ÿä¸æŽ¨èè¯»å®ƒçš„代码åQŒä»£ç ç›¸å¯?.0æ¥è®²æ¯”è¾ƒè„äØ•ã€?/p>

 

7.0分支完整实现了servlet 3.0规范åQŒå·²é™†ç®‹å‘布äº?7个小版本åQŒå·±¾lç¨³å®šäº†åQŒå¯ç”¨äºŽç”Ÿäñ”环境åQ?/span>

代码æ¯?.5ã€?.0分支òq²å‡€æ•´æ´å¾—多åQŒè¿™ä¹Ÿæ˜¯æˆ‘强烈向你推荐的版本ã€?/span>

 

8.0分支主要å…Ïx³¨web socketå’ŒspdyåQŒæ­£å¤„于‹z»è·ƒå¼€å‘阶ŒDµï¼Œä»£ç å˜åŠ¨æ¯”è¾ƒé¢‘ç¹åQŒä¿æŒå…³æ³¨å³å¯ã€?/p>

 

 

所以这½‹‡æ–‡ç« è®²çš„æ˜¯7.0分支åQŒç ”½I¶tomcat推荐直接提取svn的源代码:

 

用TortoiseSVN checkout˜q™ä¸ªsvn的代ç ?http://svn.apache.org/repos/asf/tomcat/tc7.0.x/trunk

攑ֈ°D:\Tomcat7\trunk (你可以换别的目录)

 

然后再从˜q™ä¸‹è½½ä¸€ä¸ªäºŒ˜q›åˆ¶åˆ†å‘åŒ?Binary Distributions)

http://labs.mop.com/apache-mirror/tomcat/tomcat-7/v7.0.27/bin/apache-tomcat-7.0.27.zip

 

解压后放到D:\Tomcat7åQŒé¡ºä¾¿æŠŠ"apache-tomcat-7.0.27"重命名成launch吧,

用这个二˜q›åˆ¶åˆ†å‘åŒ…è€Œä¸æ˜¯ä»Žæºä»£ç æž„å»ºåªæ˜¯äØ“äº†èŠ‚çœæ—¶é—ß_¼Œ

直接用它conf目录里面的配¾|®æ–‡ä»¶å’Œwebapps下的例子ã€?/p>

 

 

3. 把它变成maven工程

 

主要是添加几个依èµ?ecj、ant、jaxrpc½{?åQŒå¦åˆ™çš„话导入eclipse后会有编译错误,

另外åQŒå› ä¸ºtomcat不是标准的maven工程™å¹ç›®åQŒæ¯”如没有src\main\java˜q™æ ·çš„目录,

所以要调整一下sourceDirectoryå’ŒtestSourceDirectoryåQŒä¸‹é¢æ˜¯ä¸€ä¸ªå®Œæ•´çš„pomæ–‡äšgåQ?/p>

直接攑ֈ°D:\Tomcat7目录卛_¯(pom.xml与之前的launch、trunk目录òq¶åˆ—)

 

(æ³? pom.xmlæ–‡äšg在附件中)

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  <modelVersion>4.0.0</modelVersion>   <groupId>org.apache.tomcat</groupId>  <artifactId>Tomcat7.0</artifactId>  <name>Tomcat7.0</name>  <version>7.0</version>   <build>   <finalName>Tomcat7.0</finalName>   <sourceDirectory>trunk/java</sourceDirectory>   <testSourceDirectory>trunk/test</testSourceDirectory>   <resources>    <resource>     <directory>trunk/java</directory>    </resource>   </resources>   <testResources>    <testResource>     <directory>trunk/test</directory>    </testResource>   </testResources>   <plugins>    <plugin>     <groupId>org.apache.maven.plugins</groupId>     <artifactId>maven-compiler-plugin</artifactId>     <version>2.3</version>     <configuration>      <source>1.6</source>      <target>1.6</target>     </configuration>    </plugin>   </plugins>  </build>   <dependencies>   <dependency>    <groupId>junit</groupId>    <artifactId>junit</artifactId>    <version>4.4</version>    <scope>test</scope>   </dependency>   <dependency>    <groupId>org.eclipse.jdt.core.compiler</groupId>    <artifactId>ecj</artifactId>    <version>3.7.2</version>   </dependency>   <dependency>    <groupId>ant</groupId>    <artifactId>ant</artifactId>    <version>1.7.0</version>   </dependency>   <dependency>    <groupId>wsdl4j</groupId>    <artifactId>wsdl4j</artifactId>    <version>1.6.2</version>   </dependency>   <dependency>    <groupId>javax.xml</groupId>    <artifactId>jaxrpc</artifactId>    <version>1.1</version>   </dependency>  </dependencies>  </project>
 

 

4. 导入Eclipse

 

 

在命令行½H—口中进入D:\Tomcat7目录åQŒæ‰§è¡?mvn eclipse:eclipse ž®±å¯ä»¥è{成eclipse工程™å¹ç›®äº†ï¼Œ

然后打开eclipseåQŒç‚¹"File->Import->General->Existing Projects into Workspace"åQ?/p>

最后打开D:\Tomcat7ž®Þpƒ½çœ‹åˆ°Tomcat7.0˜q™ä¸ª™å¹ç›®äº†ã€?/p>

 

(如果eclipse装了m2e插äšg不用执行mvn eclipse:eclipse的,可以直接导入maven工程)

 

 

5. 在Eclipse中让Tomcatè·‘è“væ?/h3>

 

在Eclipse中打开org.apache.catalina.startup.Bootstrap¾c»ï¼Œ

在编辑区叛_‡»åQŒç‚¹"Run As->Run configurations"åQŒç„¶åŽåŒå‡?Java Aplication"ž®×ƒ¼šå‡ºæ¥ä¸€ä¸ªæ–°çš?Bootstrap"åQ?/p>

选中它,在右边点�Arguments"那一栏,把下面的内容copy�VM arguments"�

-Dcatalina.home=launch -Dcatalina.base=launch -Djava.endorsed.dirs=launch/endorsed -Djava.io.tmpdir=launch/temp -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=launch/conf/logging.properties

 

如下�


 

然后点run按钮åQŒå°±å¯ä»¥å¯åЍtomcat了,启动成功会在Eclipseçš„console中显½C?

 

 

2012-6-10 14:25:31 org.apache.catalina.startup.Catalina start 信息: Server startup in 359 ms
 

 

 

除上面这¿Uæ–¹å¼å¤–åQŒè¿™é‡Œè¿˜æœ‰ä¸€ä¸ªEclipseçš„launch脚本 (start-tomcat7.launch  (æ³? 在附件中) ) åQ?/p>

 

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication"> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> <listEntry value="/Tomcat7.0/trunk/java/org/apache/catalina/startup/Bootstrap.java"/> </listAttribute> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> <listEntry value="1"/> </listAttribute> <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.apache.catalina.startup.Bootstrap"/> <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="start"/> <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="Tomcat7.0"/> <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dcatalina.home=launch -Dcatalina.base=launch -Djava.endorsed.dirs=launch/endorsed -Djava.io.tmpdir=launch/temp -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=launch/conf/logging.properties"/> </launchConfiguration>
 

可以攑ֈ°D:\Tomcat7目录åQŒç„¶åŽflush一下EclipseåQŒåœ¨Eclipse中右击这个文ä»Óž¼Œç‚¹Run As启动TomcatåQŒç‚¹Debug As可以调试Tomcatã€?/p>

 

下图是Tomcat在Eclipse中的™å¹ç›®å¸ƒå±€:


 

最后,打开你的‹¹è§ˆå™¨ï¼Œè¾“å…¥ http://127.0.0.1:8080/examples/ çœ‹çœ‹ä¾‹å­å§ã€?/p>

 

 

6. ½Ž€å•的源代码阅è¯ÀLŒ‡å?

 

 

包名                    用é€?================================================= javax                 servlet/jsp/el相关的api org.apache.catalina   tomcat自èínæž¶æž„ org.apache.coyote     http、ajp协议实现相关的类 org.apache.el         实现el规范 org.apache.jasper     实现jsp规范、编译jspæ–‡äšg org.apache.juli       tomcat的日志系¾l?org.apache.naming     jndi实现 org.apache.tomcat     tomcat的工具包、net、digester xml解析å™?/pre> 

 

 

阅读™åºåº:

 

可以从org.apache.catalina.startup.Bootstrap˜q™ä¸ª¾cÕd¼€å§‹çœ‹èµøP¼Œ

然后到org.apache.catalina.startup.Catalina, 

 

在Catalina¾cÖM¸­ä¼šè§¦å‘conf/server.xmlæ–‡äšg的解析,

˜q™æ—¶è¦çœ‹org.apache.tomcat.util.digester中的¾c»ï¼Œ

解析的过½E‹ä¸­ä¼šç”¨åˆ°org.apache.catalina.startup包中的很多RuleSet¾c»ï¼Œ

 

server.xmlæ–‡äšg解析完后åQŒä¼šç”Ÿæˆorg.apache.catalina.core包中的各¿UStandardXXX¾cȝš„实例åQ?/p>

比如StandardServer、StandardService、StandardEngine½{‰ç­‰åQ?/p>

˜q™äº›Standard¾l„äšg都是有生命周期的åQŒæŽ¥ç€ä¼šè°ƒç”¨ä»–们的init、start½{‰æ–¹æ³•,

会触发下面这些组件进入init、start状�/p>

org.apache.catalina.connector.Connector

org.apache.coyote.http11.Http11Protocol

org.apache.tomcat.util.net.JIoEndpoint

 

在JIoEndpoint(或NioEndpoint、AprEndpoint)中会监听8080˜q™æ ·çš„端口,

有请求进来了åQŒå°±˜q›è¡Œç›¸å…³çš„io操作åQŒæŽ¥ç€è½¬åˆ°org.apache.coyote包中的相应类˜q›è¡Œåè®®è§£æžåQ?/p>

生成org.apache.catalina.connector.Requestå’Œorg.apache.catalina.connector.Response实例åQ?/p>

然后转到各种Valve、应用FilteråQŒæœ€åŽåˆ°è¾‘Öº”用的Servlet/JSPã€?/p>

 

下图描述了Tomcat7的核心架�


 



]]>zookeeper 大量˜qžæŽ¥æ–­å¼€é‡è¿žåŽŸå› æŽ’æŸ¥[转]http://www.aygfsteel.com/xiaomage234/archive/2015/09/10/427237.htmlž®é©¬æ­?/dc:creator>ž®é©¬æ­?/author>Thu, 10 Sep 2015 02:41:00 GMThttp://www.aygfsteel.com/xiaomage234/archive/2015/09/10/427237.htmlhttp://www.aygfsteel.com/xiaomage234/comments/427237.htmlhttp://www.aygfsteel.com/xiaomage234/archive/2015/09/10/427237.html#Feedback0http://www.aygfsteel.com/xiaomage234/comments/commentRss/427237.htmlhttp://www.aygfsteel.com/xiaomage234/services/trackbacks/427237.html

问题现象

最后发现线上的zookeeper的日志zookeeper.out æ–‡äšgå±…ç„¶æœ?GåQŒåŽæ¥è®¾¾|®ä¸‹æ—¥å¿—为滚动输出,参考:

http://blog.csdn.net/hengyunabc/article/details/19006911

但是改了之后åQŒå‘çŽîC¸€å¤©çš„æ—¥å¿—量就æ˜?00多MåQŒæ»šåŠ¨æ—¥å¿—ä¸€å¤©å°±è¢«å†²æŽ‰äº†åQŒè¿™ä¸ªä¸¿U‘å­¦ã€?/p>

再仔¾l†æŸ¥çœ‹ä¸‹æ—¥å¿—里的内容åQŒå‘现有很多˜qžæŽ¥å»ºç«‹å¥½ï¼Œé©¬ä¸Šåˆæ–­å¼€åQ?/p>

  1. 2014-11-24 15:38:33,348 [myid:3] - INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@1001] - Closed socket connection for client /10.0.0.3:47772 (no session established for client)  
  2. 2014-11-24 15:38:33,682 [myid:3] - INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxnFactory@197] - Accepted socket connection from /10.0.0.3:32119  
  3. 2014-11-24 15:38:33,682 [myid:3] - WARN  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@349] - caught end of stream exception  
  4. EndOfStreamException: Unable to read additional data from client sessionid 0x0, likely client has closed socket  
  5.         at org.apache.zookeeper.server.NIOServerCnxn.doIO(NIOServerCnxn.java:220)  
  6.         at org.apache.zookeeper.server.NIOServerCnxnFactory.run(NIOServerCnxnFactory.java:208)  
  7.         at java.lang.Thread.run(Thread.java:745)  
  8. 2014-11-24 15:38:33,682 [myid:3] - INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@1001] - Closed socket connection for client /10.0.0.0:32119 (no session established for client)  
从日志输出的旉™—´æ¥çœ‹åQŒç§’˜qžç§’断,非常诡异ã€?/span>

排查问题

用netstat查看¾|‘络˜qžæŽ¥çжæ€?/h3>

到client的服务器上查看连接的状态:

  1. netstat -antp | grep 2181  

发现有很多TIME_WAIT状态的˜qžæŽ¥åQ?/span>

  1. tcp        0      0 10.0.0.3:44269         10.0.1.77:2181         TIME_WAIT   -                     
  2. tcp        0      0 10.0.0.3:43646         10.0.1.77:2181         TIME_WAIT   -                     
  3. tcp        0      0 10.0.0.3:44184         10.0.1.77:2181         TIME_WAIT   -                     
  4. tcp        0      0 10.0.0.3:44026         10.0.1.77:2181         TIME_WAIT   -                     
  5. tcp        0      0 10.0.0.3:43766         10.0.1.77:2181         TIME_WAIT   -    

但是TIME_WAIT状态的˜qžæŽ¥æ˜¯çœ‹ä¸åˆ°˜q›ç¨‹åïLš„。搜索研½I¶äº†ä¸‹netstat的参敎ͼŒå‘现没有办法输出TIME_WAIT状态的˜qžæŽ¥çš„pidåQŒåªå¥½å°è¯•其它的办法ã€?/span>

再用 jstack -l pid 来查看进½E‹çš„¾U¿ç¨‹æ ˆï¼Œä¹Ÿæ²¡æœ‰å‘çŽîC»€ä¹ˆå¼‚常的东东。查看到有几个zookeeper˜qžæŽ¥çš„线½E‹ï¼Œä½†ä¹Ÿæ˜¯æ­£å¸¸çŠ¶æ€ã€?br />

再检查了机器的IOåQŒCPUåQŒå†…存,也没有异常的情况ã€?/p>

没找åˆîC»€ä¹ˆæœ‰ç”¨çš„信息åQŒåªå¥½å†ç ”究下netstat的参敎ͼš
发现�netstat -ae 输出了一些信息:

  1. tcp        0      0 10.0.0.3:41772     10.0.1.77:eforward     TIME_WAIT   root       0            
  2. tcp        0      0 10.0.0.3:41412     10.0.1.77:eforward     TIME_WAIT   root       0            
  3. tcp        0      0 10.0.0.3:24226     10.0.1.77:2181         TIME_WAIT   root       0            
  4. tcp        0      0 10.0.0.3:24623     10.0.1.77:2181         TIME_WAIT   root       0  

发现user是root。于是以为是非Java应用åQŒåœ¨ä¸æ–­åœ°è¿žæŽ¥zookeeper。于是停止java½E‹åºåQŒå‘现没有TIME_WAIT˜qžæŽ¥äº†ã€?/span>
但是¼‹®è®¤æ˜¯Java应用的问题,于是再重启Java应用åQŒä½†æ²¡æœ‰å†å‘现TIME_WAIT情况。很诡异ã€?/span>

问题不能重现了,相当的蛋疹{€‚忽然想到线上的应用也许也有˜q™ä¸ªé—®é¢˜åQŒäºŽæ˜¯åˆ°¾U¿ä¸‹zookeeper服务器上查看了下åQŒæžœç„¶å‘现有同样的问题ã€?/p>

用tcpdump抓包和wireshark分析

先用tcpdump来查看下具体的网¾lœè¿žæŽ¥ï¼Œå‘现的确是连接连上再断开。于是先保存成capæ–‡äšgåQŒå†ç”¨wireshark来分析:

  1. tcpdump -vv host 192.168.66.27 and port 2181 -w 2181.cap  
但是也没有发çŽîC»€ä¹ˆæœ‰ç”¨ä¿¡æ¯ï¼Œçš„确是TCP˜qžæŽ¥˜qžä¸ŠåQŒå†FINåQŒACK˜qžæŽ¥æ–­å¼€ã€?/span>

查看应用日志åQŒå‘现Tomcat webcontext没有正常启动

没办法了åQŒæœ‰ä¸¤ç§è€ƒè™‘åQŒä¸€ä¸ªæ˜¯ç”¨straceåQŒäºŒæ˜¯ç”¨btrace。但是btrace好久没用˜q‡äº†åQŒä¸å¤ªæƒ³å†åŽ»çœ‹ä¾‹å­æ–‡æ¡£ã€?/p>

˜q˜å¥½åQŒå޻䏋btrace之后åQŒå…ˆåŽÈœ‹äº†ä¸‹åº”用的日志,发现应用报了一些ClassLoader的错误:

  1. Nov 24, 2014 7:32:43 PM org.apache.catalina.loader.WebappClassLoader loadClass  
  2. INFO: Illegal access: this web application instance has been stopped already.  Could not load org.apache.zookeeper.ClientCnxnSocketNIO.  The eventual following stack trace is caused by an err  
  3. or thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.  
  4. java.lang.IllegalStateException  
  5.         at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1564)  
  6.         at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523)  
  7.         at ch.qos.logback.classic.spi.PackagingDataCalculator.loadClass(PackagingDataCalculator.java:198)  
  8.         at ch.qos.logback.classic.spi.PackagingDataCalculator.bestEffortLoadClass(PackagingDataCalculator.java:226)  
  9.         at ch.qos.logback.classic.spi.PackagingDataCalculator.computeBySTEP(PackagingDataCalculator.java:132)  
  10.         at ch.qos.logback.classic.spi.PackagingDataCalculator.populateUncommonFrames(PackagingDataCalculator.java:107)  
  11.         at ch.qos.logback.classic.spi.PackagingDataCalculator.populateFrames(PackagingDataCalculator.java:99)  

å› äØ“æœ‰ç»éªŒäº†åQŒé©¬ä¸ŠçŸ¥é“这个Tomcatå› äØ“å…¶å®ƒåŽŸå› webcontext实始化失败退出,然后后面的一些线½E‹ç‘ô¾l­è·‘æ—Óž¼Œä¼šæŠ›å‡ºClassLoaderåQŒæˆ–者Class not found的异常ã€?/span>

于是猜想到原因了åQ?/p>

Tomcat webcontext初始化失败,zookeeper的重˜qžçº¿½E‹è‡ªåŠ¨ä¸æ–­é‡˜qžã€?/strong>

但是ä¸ÞZ»€ä¹ˆé‡å¯Tomcat之后åQŒæ²¡æœ‰é‡çްTIME_WAIT的情况?

再折腾了下,发现只有当zookeeper重启后,应用才会出现大量的TIME_WAIT˜qžæŽ¥ã€‚报的是下面˜q™ä¸ªå¼‚常åQ?/p>

  1. 2014-11-24 19:42:44,399 [Thread-3-SendThread(192.168.90.147:4181)] WARN  org.apache.zookeeper.ClientCnxn - Session 0x149c21809731325 for server 192.168.90.147/192.168.90.147:4181, unexpected error, closing socket connection and attempting reconnect  
  2. java.lang.NoClassDefFoundError: org/apache/zookeeper/proto/SetWatches  
  3.         at org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:867) ~[zookeeper-3.4.5.jar:3.4.5-1392090]  
  4.         at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:352) ~[zookeeper-3.4.5.jar:3.4.5-1392090]  

˜q™ä¸ªå¼‚常的原因,是某些zookeeper的类没有加蝲到ã€?/span>

最¾lˆåŽŸå› åˆ†æž?/h2>

梳理下整个流½E‹ï¼š

  1. Tomcat启动åQŒåˆå§‹åŒ–webcontextåQ?/li>
  2. 初始化spring, spring初始某些些beanåQŒè¿™äº›bean包括了zookeeper的连接相关的beanåQ?/li>
  3. ˜q™æ—¶zkClientåQˆç‹¬ç«‹çº¿½E‹ï¼‰å·²ç»˜qžæŽ¥ä¸ŠæœåŠ¡å™¨äº†ï¼Œä½†æ˜¯classloader没有加蝲到org/apache/zookeeper/proto/SetWatches¾c»ï¼›
  4. springåˆå§‹åŒ–å¤±è´¥ï¼Œå¯ÆD‡´Tomcat webcontext初始化也å¤ÞpÓ|åQŒåº”用在挂è“v状态,但zkClient¾U¿ç¨‹˜q˜æ˜¯æ­£å¸¸çš„ï¼›
  5. zookeeper服务器重启,zkClient开始重˜qžï¼Œ˜qžæŽ¥ä¸Šzookeeper服务器;
  6. zkClient触发watch的一些代码,ClassLoaderž®è¯•加蝲org/apache/zookeeper/proto/SetWatches¾c»ï¼Œä½†æ˜¯å‘现找不到类åQŒäºŽæ˜¯æŠ›å‡ºå¼‚常;
  7. zkClientæ•èŽ·åˆ°å¼‚å¸¸ï¼Œè®¤äØ“é‡è¿žå¤ÞpÓ|åQŒclose掉connectionåQŒä¼‘眠几¿U’之后,再次重连åQ?/li>

于是出现了zkClient反复重试˜qžæŽ¥zookeeper服务器,而且都是¿U’连¿U’断的情å†üc€?/p>


æ€È»“åQ?/h2>

˜q™æ¬¡æŽ’查èŠ×ƒº†ä¸å°‘æ—‰™—´åQŒæœ‰ä¸ªåŽŸå› æ˜¯å¼€å§‹æ²¡æœ‰åŽ»æŸ¥çœ‹åº”ç”¨çš„æ—¥å¿—ï¼Œä»¥äØ“åº”ç”¨çš„æ˜¯æ­£å¸¸çš„ï¼Œè€Œä¸”zookeeper.out的输出日志很多,也有一ŒD‰|—¶é—´äº†ã€?/p>

˜q˜æœ‰¾U¿ä¸Šçš„应用比较坑爹,‹zÕdŠ¨å·²ç»˜q‡æœŸå¾ˆä¹…了,但是½E‹åº˜q˜æ˜¯¾U¿ä¸Šè·‘,也没有äh½Ž¡æ˜¯å¦å‡ºé—®é¢˜äº†ã€?/p>

所以,主要¾_‘ÖŠ›æ”‘Öœ¨å„种¾|‘络˜qžæŽ¥çŠ¶æ€çš„èŽ·å–ä¸Šã€‚å¯¹åŽÀLŸ¥çœ‹åº”用日志比较排斥ã€?/p>

˜q˜æœ‰ä¸€ä¸ªåŽŸå› æ˜¯åQŒé—®é¢˜æ¯”较诡异,有点éšùN‡çŽŽÍ¼Œå½“发现可以重现时åQŒåŸºæœ¬å·²¾lå‘现问题所在了ã€?/p>

排查问题˜q˜æ˜¯è¦è€å¿ƒæ”‰™›†ä¿¡æ¯åQŒå†åˆ†æžåˆ¤æ–­ã€?/p>

]]>提升tomcat服务器性能的七条经éª?/title><link>http://www.aygfsteel.com/xiaomage234/archive/2014/07/29/416280.html</link><dc:creator>ž®é©¬æ­?/dc:creator><author>ž®é©¬æ­?/author><pubDate>Tue, 29 Jul 2014 02:31:00 GMT</pubDate><guid>http://www.aygfsteel.com/xiaomage234/archive/2014/07/29/416280.html</guid><wfw:comment>http://www.aygfsteel.com/xiaomage234/comments/416280.html</wfw:comment><comments>http://www.aygfsteel.com/xiaomage234/archive/2014/07/29/416280.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/xiaomage234/comments/commentRss/416280.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/xiaomage234/services/trackbacks/416280.html</trackback:ping><description><![CDATA[from:http://passover.blog.51cto.com/2431658/732629<br /><br /><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">在线上环境中我们是采用了tomcatä½œäØ“Web服务器,它的处理性能直接关系到用户体验,在åã^时的工作和学习中åQŒå½’¾U›_‡ºä»¥ä¸‹ä¸ƒç§è°ƒä¼˜¾léªŒã€?/p><h1><span style="padding: 0px; margin: 0px; font-size: 22px;">1. 服务器资æº?/span></h1><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">    服务器所能提供CPU、内存、硬盘的性能对处理能力有军_®šæ€§åª„响ã€?br style="padding: 0px; margin: 0px;" />    (1) å¯¹äºŽé«˜åÆˆå‘æƒ…å†µä¸‹ä¼šæœ‰å¤§é‡çš„è¿½Ž—,那么CPU的速度会直接媄响到处理速度ã€?br style="padding: 0px; margin: 0px;" />    (2) 内存在大量数据处理的情况下,ž®†ä¼šæœ‰è¾ƒå¤§çš„内存定w‡éœ€æ±‚,可以ç”?Xmx -Xms -XX:MaxPermSize½{‰å‚数对内存不同功能块进行划分。我们之前就遇到˜q‡å†…存分配不­‘»I¼Œå¯ÆD‡´è™šæ‹ŸæœÞZ¸€ç›´å¤„于full GCåQŒä»Žè€Œå¯¼è‡´å¤„理能力严重下降ã€?br style="padding: 0px; margin: 0px;" />    (3) ¼‹¬ç›˜ä¸»è¦é—®é¢˜ž®±æ˜¯è¯Õd†™æ€§èƒ½åQŒå½“大量文äšg˜q›è¡Œè¯Õd†™æ—Óž¼Œ¼‚ç›˜æžå®¹æ˜“成为性能瓉™¢ˆã€‚最好的办法˜q˜æ˜¯åˆ©ç”¨ä¸‹é¢æåˆ°çš„缓存ã€?/p><h1><span style="padding: 0px; margin: 0px; font-size: 22px;">2. 利用¾~“存和压¾~?/span></h1><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">    对于静态页面最好是能够¾~“å­˜èµäh¥åQŒè¿™æ ·å°±ä¸å¿…每次从磁盘上诅R€‚这里我们采用了Nginxä½œäØ“¾~“存服务器,ž®†å›¾ç‰‡ã€css、jsæ–‡äšg都进行了¾~“å­˜åQŒæœ‰æ•ˆçš„减少了后端tomcat的访问ã€?/p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">    另外åQŒäؓ了能加快¾|‘络传输速度åQŒå¼€å¯gzip压羃也是必不可少的。但考虑到tomcat已经需要处理很多东西了åQŒæ‰€ä»¥æŠŠ˜q™ä¸ªåŽ‹ç¾ƒçš„å·¥ä½œå°±äº¤ç»™å‰ç«¯çš„Nginx来完成。可以参考之前写的ã€?a target="_blank" style="padding: 0px; margin: 0px; color: #4b0002; text-decoration: none;">利用nginx加速web讉K—®</a>》ã€?/p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">    除了文本可以用gzip压羃åQŒå…¶å®žå¾ˆå¤šå›¾ç‰‡ä¹Ÿå¯ä»¥ç”¨å›¾åƒå¤„理工具预先进行压¾~©ï¼Œæ‰‘Öˆ°ä¸€ä¸ªåã^衡点可以让画质损失很ž®è€Œæ–‡ä»¶å¯ä»¥å‡ž®å¾ˆå¤šã€‚曾¾læˆ‘ž®Þp§˜q‡ä¸€ä¸ªå›¾ç‰‡ä»Ž300多kb压羃到几十kbåQŒè‡ªå·±å‡ ä¹Žçœ‹ä¸å‡ºæ¥åŒºåˆ«ã€?/p><h1><span style="padding: 0px; margin: 0px; font-size: 22px;">3. 采用集群</span></h1><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">    单个服务器性能æ€ÀL˜¯æœ‰é™çš„,最好的办法自然是实现横向扩展,那么¾l„徏tomcat集群是有效提升性能的手ŒDüc€‚我们还是采用了Nginxæ¥ä½œä¸ø™¯·æ±‚分‹¹çš„æœåŠ¡å™¨ï¼ŒåŽç«¯å¤šä¸ªtomcatå…׃ínsession来协同工作。可以参考之前写的ã€?a target="_blank" style="padding: 0px; margin: 0px; color: #4b0002; text-decoration: none;">利用nginx+tomcat+memcached¾l„徏web服务器负载均è¡?/a>》ã€?/p><h1><span style="padding: 0px; margin: 0px; font-size: 22px;">4. 优化tomcat参数</span></h1><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">    ˜q™é‡Œä»¥tomcat7的参数配¾|®äؓ例,需要修改conf/server.xmlæ–‡äšgåQŒä¸»è¦æ˜¯ä¼˜åŒ–˜qžæŽ¥é…ç½®åQŒå…³é—­å®¢æˆïL«¯dns查询ã€?/p><pre style="padding: 0px; margin-top: 0px; font-family: 'Courier New', monospace; font-size: 12px; overflow: auto; width: 712.796875px; color: #555555; background: #f7f7f7;"><ol style="padding: 5px 0px; margin: 0px; color: #5c5c5c; list-style-position: initial; list-style-image: initial; border-left-width: 3px; border-style: none none none solid; border-left-color: #146b00; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: #006699; font-weight: bold; background-color: inherit;"><</span><span style="padding: 0px; margin: 0px; border: none; color: #006699; font-weight: bold; background-color: inherit;">Connector</span> <span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">port</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">=</span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">"8080"</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">   </span></span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">           <span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">protocol</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">=</span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">"org.apache.coyote.http11.Http11NioProtocol"</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">  </span></span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">           <span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">connectionTimeout</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">=</span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">"20000"</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">  </span></span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">           <span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">redirectPort</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">=</span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">"8443"</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">   </span></span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">           <span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">maxThreads</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">=</span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">"500"</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">   </span></span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">           <span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">minSpareThreads</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">=</span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">"20"</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">  </span></span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">           <span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">acceptCount</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">=</span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">"100"</span> </span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">           <span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">disableUploadTimeout</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">=</span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">"true"</span> </span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">           <span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">enableLookups</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">=</span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">"false"</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">   </span></span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">           <span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">URIEncoding</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;">=</span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">"UTF-8"</span> <span style="padding: 0px; margin: 0px; border: none; color: #006699; font-weight: bold; background-color: inherit;">/></span> </span></li></ol></pre><h1><span style="padding: 0px; margin: 0px; font-size: 22px;">5. 改用APRåº?/span></h1><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">    tomcat默认采用的BIO模型åQŒåœ¨å‡ ç™¾òq¶å‘下性能会有很严重的下降。tomcat自带˜q˜æœ‰NIO的模型,另外也可以调用APR的库来实现操作系¾lŸçñ”别控制ã€?/p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">    NIO模型是内¾|®çš„åQŒè°ƒç”¨å¾ˆæ–¹ä¾¿åQŒåªéœ€è¦å°†ä¸Šé¢é…ç½®æ–‡äšg中protocol修改æˆ?span style="padding: 0px; margin: 0px; font-family: 宋体;"><span style="padding: 0px; margin: 0px; font-size: 16px;"><span style="padding: 0px; margin: 0px; line-height: 18px;">org.apache.coyote.http11.Http11NioProtocolåQŒé‡å¯å³å¯ç”Ÿæ•ˆã€‚上面配¾|®æˆ‘已经改过了,默认的是HTTP/1.1ã€?/span></span></span></p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">    APR则需要安装第三方库,在高òq¶å‘下会让性能有明显提升。具体安装办法可以参è€?a style="padding: 0px; margin: 0px; color: #4b0002; text-decoration: none;">http://www.cnblogs.com/huangjingzhou/articles/2097241.html</a>。安装完成后<span style="padding: 0px; margin: 0px; font-size: 16px; line-height: 18px; font-family: 宋体;">重启卛_¯ç”Ÿæ•ˆã€‚如使用默认protocalž®±æ˜¯apråQŒä½†æœ€å¥½æŠŠž®†protocol修改æˆ?span style="padding: 0px; margin: 0px; font-size: 14px; line-height: 25px; font-family: Helvetica, Tahoma, Arial, sans-serif; background-color: #efefef;">org.apache.coyote.http11.Http11AprProtocolåQŒä¼šæ›´åŠ æ˜Žç¡®</span></span><span style="padding: 0px; margin: 0px; line-height: 25px; font-family: Helvetica, Tahoma, Arial, sans-serif; background-color: #efefef;">ã€?/span></p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">    在官æ–ÒŽ‰¾åˆîC¸€ä¸ªè¡¨æ ÆD¯¦¾l†è¯´æ˜Žäº†˜q™ä¸‰¿Uæ–¹å¼çš„区别åQ?/p><pre style="padding: 0px; margin-top: 0px; font-family: 'Courier New', monospace; font-size: 12px; overflow: auto; width: 712.796875px; color: #555555; background: #f7f7f7;"><ol style="padding: 5px 0px; margin: 0px; color: #5c5c5c; list-style-position: initial; list-style-image: initial; border-left-width: 3px; border-style: none none none solid; border-left-color: #146b00; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">                  Java Blocking Connector   Java Nio Blocking Connector   APR/native Connector </span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">                             BIO                         NIO                       APR </span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">Classname                AjpProtocol               AjpNioProtocol           AjpAprProtocol </span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">Tomcat Version           3.x onwards                 7.x onwards              5.5.x onwards </span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">Support Polling              NO                          YES                       YES </span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">Polling Size                 N/A                   maxConnections             maxConnections </span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">Read Request Headers      Blocking                  Sim Blocking                   Blocking </span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">Read Request Body         Blocking                  Sim Blocking                   Blocking </span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">Write Response            Blocking                  Sim Blocking                   Blocking </span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">Wait for next Request     Blocking                  Non Blocking               Non Blocking </span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">Max Connections        maxConnections              maxConnections             maxConnections </span></li></ol></pre><h1><span style="padding: 0px; margin: 0px; font-size: 22px;">6. 优化¾|‘络</span></h1><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">    Joel也明¼‹®æå‡ÞZº†ä¼˜åŒ–¾|‘卡驱动可以有效提升性能åQŒè¿™ä¸ªå¯¹äºŽé›†¾Ÿ¤çŽ¯å¢ƒå·¥ä½œçš„æ—¶å€™å°¤ä¸ºé‡è¦ã€‚ç”±äºŽæˆ‘ä»¬é‡‡ç”¨äº†linux服务器,所以优化内核参æ•îC¹Ÿæ˜¯ä¸€ä¸ªéžå¸”R‡è¦çš„工作。给一个参考的优化参数åQ?/p><pre style="padding: 0px; margin-top: 0px; font-family: 'Courier New', monospace; font-size: 12px; overflow: auto; width: 712.796875px; color: #555555; background: #f7f7f7;"><ol style="padding: 5px 0px; margin: 0px; color: #5c5c5c; list-style-position: initial; list-style-image: initial; border-left-width: 3px; border-style: none none none solid; border-left-color: #146b00; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">1. ä¿®æ”¹/etc/sysctl.cnfæ–‡äšgåQŒåœ¨æœ€åŽè¿½åŠ å¦‚ä¸‹å†…å®¹ï¼š </span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"> </li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.core.netdev_max_backlog</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">32768</span> </span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.core.somaxconn</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">32768</span> </span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.core.wmem_default</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">8388608</span> </span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.core.rmem_default</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">8388608</span> </span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.core.rmem_max</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">16777216</span> </span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.core.wmem_max</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">16777216</span> </span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.ipv4.ip_local_port_range</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">1024</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> 65000 </span></span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.ipv4.route.gc_timeout</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">100</span> </span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.ipv4.tcp_fin_timeout</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">30</span> </span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.ipv4.tcp_keepalive_time</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">1200</span> </span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.ipv4.tcp_timestamps</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">0</span> </span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.ipv4.tcp_synack_retries</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">2</span> </span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.ipv4.tcp_syn_retries</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">2</span> </span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.ipv4.tcp_tw_recycle</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">1</span> </span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.ipv4.tcp_tw_reuse</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">1</span> </span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.ipv4.tcp_mem</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">94500000</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> 915000000 927000000 </span></span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.ipv4.tcp_max_orphans</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">3276800</span> </span></li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;"><span style="padding: 0px; margin: 0px; border: none; color: red; background-color: inherit;">net.ipv4.tcp_max_syn_backlog</span><span style="padding: 0px; margin: 0px; border: none; background-color: inherit;"> = </span><span style="padding: 0px; margin: 0px; border: none; color: blue; background-color: inherit;">65536</span> </span></li><li style="padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 20px; color: inherit; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none;"> </li><li style="margin-left: 20px; line-height: 1.3em; list-style: decimal-leading-zero outside; border: none; padding: 0px 3px 0px 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important;"><span style="padding: 0px; margin: 0px; border: none; color: black; background-color: inherit;">2. ä¿å­˜é€€å‡ºï¼Œæ‰§è¡Œsysctl -p生效 </span></li></ol></pre><h1><span style="padding: 0px; margin: 0px; font-size: 22px;">7. 让测试说è¯?/span></h1><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">    优化¾pȝ»Ÿæœ€å¿Œè®³çš„就是只调优不测试,有时不适当的优化反而会让性能更低。以上所有的优化æ–ÒŽ³•都要在本地进行性能‹¹‹è¯•˜q‡åŽå†ä¸æ–­è°ƒæ•´å‚敎ͼŒ˜q™æ ·æœ€¾lˆæ‰èƒ½è¾¾åˆ°æœ€ä½³çš„优化效果ã€?/p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;"> </p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">补充Bio、Nio、Apr模式的测试结果:</p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">    对于˜q™å‡ ¿Uæ¨¡å¼ï¼Œæˆ‘用ab命ä×o模拟1000òq¶å‘‹¹‹è¯•10000词,‹¹‹è¯•¾l“果比较意外åQŒäؓ了确认结果,我每¿Uæ–¹å¼åå¤æµ‹è¯•了10多次åQŒåƈ且在两个服务器上都测试了一遍。结果发现Bioå’ŒNio性能差别非常微弱åQŒé𾿀ªé»˜è®¤å±…然还是Bio。但是采用apråQŒè¿žæŽ¥å¾ç«‹çš„速度会有50%ï½?00%的提升。直接调用操作系¾lŸå±‚果然¼œžé€Ÿå•ŠåQŒè¿™é‡Œå¼ºçƒˆæŽ¨èapr方式åQ?/p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;"> </p><p style="padding: 0px; margin: 0px; clear: both; height: auto; overflow: hidden; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff;">参考资料:<br style="padding: 0px; margin: 0px;" /><a style="padding: 0px; margin: 0px; color: #4b0002; text-decoration: none;">http://16.199.geisvps.com/bbs/2836/24238.html</a></p><img src ="http://www.aygfsteel.com/xiaomage234/aggbug/416280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/xiaomage234/" target="_blank">ž®é©¬æ­?/a> 2014-07-29 10:31 <a href="http://www.aygfsteel.com/xiaomage234/archive/2014/07/29/416280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat7调试˜qè¡ŒçŽ¯å¢ƒæ­å¾ä¸Žæºä»£ç åˆ†æžå…¥é—¨http://www.aygfsteel.com/xiaomage234/archive/2013/08/21/403124.htmlž®é©¬æ­?/dc:creator>ž®é©¬æ­?/author>Wed, 21 Aug 2013 04:30:00 GMThttp://www.aygfsteel.com/xiaomage234/archive/2013/08/21/403124.htmlhttp://www.aygfsteel.com/xiaomage234/comments/403124.htmlhttp://www.aygfsteel.com/xiaomage234/archive/2013/08/21/403124.html#Feedback0http://www.aygfsteel.com/xiaomage234/comments/commentRss/403124.htmlhttp://www.aygfsteel.com/xiaomage234/services/trackbacks/403124.html阅读全文

]]>
下蝲Tomcat源码åQŒåÆˆä½œäØ“å·¥ç¨‹å¯¼å…¥åˆ°Eclipseä¸?http://www.aygfsteel.com/xiaomage234/archive/2013/08/21/403118.htmlž®é©¬æ­?/dc:creator>ž®é©¬æ­?/author>Wed, 21 Aug 2013 02:41:00 GMThttp://www.aygfsteel.com/xiaomage234/archive/2013/08/21/403118.htmlhttp://www.aygfsteel.com/xiaomage234/comments/403118.htmlhttp://www.aygfsteel.com/xiaomage234/archive/2013/08/21/403118.html#Feedback0http://www.aygfsteel.com/xiaomage234/comments/commentRss/403118.htmlhttp://www.aygfsteel.com/xiaomage234/services/trackbacks/403118.html导入Tomcat的源代码åQŒå…¶å®žå¾ˆ½Ž€å•,可是如果没有扑ֈ°æ­£ç¡®çš„æ–¹æ³•,你会‹¹ªè´¹å¤§é‡çš„æ—¶é—ß_¼Œæˆ‘就是浪费了好多旉™—´åœ¨é…¾|®ç¼–译环境上。最正确的办法是到Tomcat的官方网址åŽÀL‰¾åˆ°ç­”案ã€?/div>
可以参考下边的˜qžæŽ¥åQŒè¿™ä¸ªæ˜¯å…³äºŽTomcat7çš„ã€?/div>
http://tomcat.apache.org/tomcat-7.0-doc/building.html
1. 讄¡½®çŽ¯å¢ƒ
   1.1 JDK1.6 or above           JAVA_HOME
   1.2 Ant 1.8.1 or later        ANT_HOME
 
2. Check out the latest tomcat source code
svn --force export http://svn.apache.org/repos/asf/tomcat/tc7.0.x/tags/TOMCAT_7_0_11/ D:\Tomcat7\
上边的命令SVN会把最新的Tomcat7011的源码下载到你的¼‹¬ç›˜D:\Tomcat7\ ä¸?br />SVN 下蝲地址 http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
 
3. 为Eclipse¾~–译工程
   cd ${tomcat.source}
   ant ide-eclipse
  [注] a. ${tomcat.source} æ˜¯ä½ ä¸‹è²çš„æºç åœ¨æœºå™¨ä¸Šçš„路径
       b. ant ide-eclipse: ˜q™ä¸ª˜q‡ç¨‹ä¼šæ¯”较慢åQŒå› ä¸ÞZ¼šä¸‹è²ä¸€äº›ä¾èµ–çš„½W¬ä¸‰æ–¹jaråQŒè¿™äº›jar都会攑ֈ°ä½ åœ¨
          build.properties 中设¾|®çš„ ${base.path} æ‰€æŒ‡å‘çš„èµ\å¾?/div>
4. 讄¡½®Eclipse 环境 (Class-path Variables)
   è®„¡½®TOMCAT_LIBS_BASEåQŒANT_HOME
   TOMCAT_LIBS_BASE 要指å?nbsp;${base.path}
   ANT_HOME 指向安装ant的目录就好了
5. 导入工程
   File -> Import and choose Existing Projects into Workspace
6. ¾~–译问题
   å¾€å¾€æˆ‘们在这时会遇到一些编译错误,˜q™æ˜¯å› äؓ我们Eclipse中JRE环境讄¡½®çš„不正确åQŒéœ€è¦è°ƒæ•?/div>
   6.1 Java Compiler, 需è¦?6.0 (1.6) 以上
       Window -> Preferences -> Java -> Complier -> JDK Compliance -> 6.0 (1.6)
   6.2 Default JRE, 需è¦?1.6 以上
       Window -> Preferences -> Java -> Installed JREs -> jdk1.6
       å½“ç„¶åQŒè¿™ä¸ªä¹Ÿå¯ä»¥åœ¨å·¥½E‹ä¸­è®‘Ö®šåQŒå¦‚果你˜q˜æœ‰å…¶ä»–的工½E‹å¿…™åȝ”¨ä»¥å‰çš„jdk版本的话ã€?/div>
   6.3 Eclipse 版本问题
       è°ƒæ•´å¥½Java Compiler å’?JRE 后,一般可以编译通过了,但是我就遇到了Eclipse版本问题åQŒæ€ÀLœ‰ä¸€ä¸?nbsp;
       compiler ArrayIndexOutofBoundaryException 的错误,后来更新了一下Eclipse,ž®±å¥½äº†ï¼Œæˆ‘用çš?/div>
       Eclipse 版本æ˜?.2的。我又用了Eclipse Galileo试着打开工程åQŒå°±æ²¡æœ‰¾cÖM¼¼çš„问题ã€?/div>
7. 最周到的服�/div>
   åˆîCº†˜q™é‡ŒåQŒæ‚¨çš„å·¥½E‹åº”该就¾~–译成功了。该æƒÏxƒ³æ€Žä¹ˆrun, debug TOMCAT了,怎么讄¡½®å•Šï¼Ÿå“ˆï¼Œæœ€å‘¨åˆ°çš„æœåŠ?/div>
   æ¥äº†åQŒåœ¨ run(debug) ... -> Java Application 中,我们会看到已¾læœ‰ä¸¤ä¸ªapplications 了,分别叫做
   start-tomcat, stop-tomcat.


]]> Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÃÜÔÆÏØ| ·À³Ç¸ÛÊÐ| °¢Í¼Ê²ÊÐ| Ã÷Ë®ÏØ| ÌÀÔ­ÏØ| ¹ÝÌÕÏØ| Æ½Ë³ÏØ| Çð±±ÏØ| À¼ÏªÊÐ| Ú¯°²ÏØ| ³ç×óÊÐ| ʯÚäÏØ| ÀàÎÚÆëÏØ| µÆËþÊÐ| äµË®ÏØ| ºîÂíÊÐ| Ì©ÐËÊÐ| ÈÄÑôÏØ| °²´ïÊÐ| ÑÉêÈ| ò£ÉÏÏØ| ¼ÎÉÆÏØ| ʯÖù| ÓÀµÂÏØ| ½ðÏçÏØ| ÓÀÌ©ÏØ| ¹¢Âí| ÎߺþÊÐ| ÀÖÍ¤ÏØ| ÃɳÇÏØ| ×ÊÖÐÏØ| ¶õÂ×´º×ÔÖÎÆì| Æ½Â½ÏØ| Ì©°²ÊÐ| ÔÆ¸¡ÊÐ| Á½µ±ÏØ| Ìì×£| ºÍÌïÊÐ| µÂÁî¹þÊÐ| ºéÑÅÏØ| Ìì¶ëÏØ|