2008年5月26日星期一

Apache,GlasshFish与Comet HTTP streaming配置

  使用Apache Httpd作为GlassFish的Load Balancer有两种方式:mod_jk与mod_proxy方式,由于mod_jk不支持Comet,所以如果应用程序使用了Comet,就只能使用mod_proxy方式了。此外Httpd应使用2.2.8以上版本,之前的版本mod_proxy不能对HTTP response chunk做立即转发,必须达到8k的chunk数据才会转发,这样在使用Http streaming的Comet应用中严重降低了实时性,2.2.8解决了这一问题。
  1.   GlassFish配置。
    进入$GLASSFISH_HOME/domains/domain1/config,编辑domain.xml,注意如果是集群或使用其他Glassfish的instance,目录会有所不同。
    找到名称为http-listener-1的<http-listener>配置组,添加下面三项:
              <property name="cometSupport" value="true"/>
              <property name="authPassthroughEnabled" value="true"/>
              <property name="proxyHandler" value="com.sun.enterprise.web.ProxyHandlerImpl"/>
    第一行是启用Comet支持,后面两行是Apache SSL转发需要的。
    此外找到<jvm-options>-client</jvm-options>,改为-server。
  2. 配置mod_proxy HTTP转发
    打开httpd.conf文件,在末尾添加:
    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
    LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    LoadModule proxy_connect_module modules/mod_proxy_connect.so

    NameVirtualHost *:80

    <VirtualHost *:80>
        ServerName www.cometserver.com
        ErrorLog logs/cometserver-error_log
        CustomLog logs/cometserver-access_log common

        ProxyRequests Off
        ProxyPass /comet/ http://localhost:8080/comet/ max=1500
        ProxyPassReverse /comet/ http://localhost:8080/comet/
    </VirtualHost>
    这里将mod_proxy配置加入了一个虚拟主机里面,只在 www.cometserver.com虚拟主机中生效。ProxyPass转发所有客户端http请求,ProxyPassReverse转发所有服务器端redirect请求。
  3. 调整Apache Httpd最大连接数
    在httpd.conf中加入或修改如下配置:
    <IfModule prefork.c>
    StartServers       8
    MinSpareServers    5
    MaxSpareServers   20
    ServerLimit      1500
    MaxClients       1500
    MaxRequestsPerChild  4000
    </IfModule>
    以上配置设置最大连接数为1500
  4. 配置mod_proxy HTTPS转发
    打开ssl.conf或自定义的mod_ssl配置文件,在</VirtualHost>之前添加:
    SSLProxyEngine on
    ProxyRequests Off
    ProxyPass /comet/ http://localhost:8080/comet/ max=1500
    ProxyPassReverse /comet/ http://localhost:8080/comet/
    配置基本上相同,只是多了SSLProxyEngine on开启SSLProxy。
  5. web.xml配置
    在web.xml中配置CometServlet:
        <servlet>
            <servlet-name>QuotationServlet</servlet-name>
            <servlet-class>com.xued.fxtrader.comet.QuotationServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>QuotationServlet</servlet-name>
            <url-pattern>/quote</url-pattern>
        </servlet-mapping>
  6. Comet Servlet中response Header
            response.addHeader("Expires", "0");
            response.addHeader("Pragma", "no-cache");
            response.addHeader("Cache-Control", "no-cache");
            response.addHeader("Transfer-Encoding", "Chunked");
  启动Glasshfish和Apache httpd。
  经以上配置,即可实现通过访问80端口透明代理访问Comet Http streaming服务,响应无阻塞延迟。

没有评论: