2007年11月21日星期三

Tomcat 6下NIO及SSL配置

Tomcat 6支持三种HTTP connector,分别是:
  1. Http11Protocol 传统的Blocking IO,也是缺省配置     
  2. Http11NioProtocol 使用JDK 1.4以后的NIO包,提供Non-Blocking的HTTP引擎
  3. Http11AprProtocol 使用Apache Portable Runtime库,利用本地代码提供高性能的(仍然是Blocking方式)HTTP引擎
以下是三种方式的比较:

                  Java Blocking Connector       Java Nio Blocking Connector       APR Connector

    Classname                 Http11Protocol                  Http11NioProtocol         Http11AprProtocol
    Tomcat Version           3.x 4.x 5.x 6.x                       6.x                              5.5.x 6.x
    Support Polling            NO                                      YES                               YES

    Polling Size                 N/A                   Unlimited - Restricted by mem        Unlimited
    Read HTTP Request     Blocking                     Non Blocking                        Blocking
    Read HTTP Body         Blocking                     Blocking                                Blocking

    Write HTTP Response   Blocking                     Blocking                              Blocking
    SSL Support                 Java SSL                    Java SSL                             Open SSL
    SSL Handshake            Blocking                     Non blocking                        Blocking

    Max Connections          maxThreads               See polling size                 See polling size

由于Tomcat 6的缺省配置还是Blocking IO,在AprListener找到tcnative库后自动改为APR connector。因此需要修改配置使用NIO connector。修改server.xml,将原来的

    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

改为

     <Connector port="8080" minSpareThreads="5" maxSpareThreads="75"
      maxThreads="1000" strategy="ms" maxHttpHeaderSize="8192" acceptorThreadCount="2"
      emptySessionPath="true" protocol=" org.apache.coyote.http11.Http11NioProtocol"
      enableLookups="false" redirectPort="8443" acceptCount="100"
      connectionTimeout="20000" disableUploadTimeout="true" />

以使用NIO connector,注意红色的部分。

支持SSL的步骤(转贴自:http://www.xyhot.com/article.asp?id=280):

   1. 生成server key
      以命令行方式切换到目录%TOMCAT_HOME%,在command命令行输入如下命令( jdk1.4以上带的工具):
      keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit -keystore server.keystore -validity 3600
      用户名输入域名,如localhost(开发或测试用) 或hostname.domainname(用户拥有的域名),其它全部以 enter 跳过,最后确认,此时会在%TOMCAT_HOME%下生成server.keystore 文件。
      注:参数 -validity 指证书的有效期(天),缺省有效期很短,只有90天。
   2. 将证书导入的JDK的证书信任库中:
      这步对于Tomcat的SSL配置不是必须。
      导入过程分2步,第一步是导出证书,第二步是导入到证书信任库,命令如下:
      keytool -export -trustcacerts -alias tomcat -file  server.cer -keystore  server.keystore -storepass changeit
      keytool -import -trustcacerts -alias tomcat -file server.cer -keystore  %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
      如果有提示,输入Y就可以了。
      其他有用keytool命令(列出信任证书库中所有已有证书,删除库中某个证书):
      keytool -list -v -keystore D:/sdks/jdk1.5.0_11/jre/lib/security/cacerts
      keytool -delete -trustcacerts -alias tomcat  -keystore  %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
   3.  配置TOMCAT :
      修改%TOMCAT_HOME%\conf\server.xml,以文字编辑器打开,查找这一行:
      xml 代码
      <!-- Define a SSL HTTP/1.1 Connector on port 8443 -->  

      将之后的那段的注释去掉,并加上 keystorePass及keystoreFile属性。
          <Connector protocol="org.apache.coyote.http11.Http11NioProtocol" 
                 port="8443" minSpareThreads="5" maxSpareThreads="75" 
                 enableLookups="true" disableUploadTimeout="true"   
                 acceptCount="100"  maxThreads="200" 
                 scheme="https" secure="true" SSLEnabled="true" 
                 clientAuth="false" sslProtocol="TLS" 
                 keystoreFile="D:/workbench/apache-tomcat-6.0.14/server.keystore"   
                 keystorePass="changeit"/>
   4. 访问 https://localhost:8443/ 验证配置。

没有评论: