Java堂  


Resin中对日志输出的配置

Filed under: JavaPlateform,Web&Server — Jet @ 2:17 下午
Tags:
原文出处: Resin中对日志输出的配置
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

Resin中对日志的设置主要有如下参数:log、logger、access-log、stdout-log和stderr-log。前两个放在<resin>标签,也就是主标签下面,其中log主要用于配置JDK logging API,logger用于指定需要log的包及level,跟log4j中的用法相似,只不过resin中level有个特殊的选项就是off,用于关闭日志输出;而后面三个*-log放在<host>或<host-default>下面,access用于HTTP输出,stdout用于标准输出(System.out),stderr用于错误输出(System.err,对应log4j中的log.error)。

三个*-log中间的属性是相同的,所以我们集中来说明一下:

  • path: 用于设定日志文件的路径,非常有意思的是它支持所谓的El Variables and Functions,也就是resin中的变量,比如${host.name}就是虚拟站点的id名称,所以如果将它放在<host-default>下面的话,将path设置为 logs/${host.name}/access.log的话可以将不同站点的日志存放在不同的目录下面。
  • archive-format: 这个参数可以设置日志归档的格式,如设置为access-%Y%m%d.log可以在归档的时候自动按日期进行归档命名。另外还有一个特性需要说明的是,resin竟然支持自动压缩log文件,而且设置的方法非常简单,只要后缀名是gz就可以了,如access-%Y%m%d.log.gz,这样归档的时候会自动压缩,而且支持windows和linux系统。
  • format: 用于设置每条日志输出的格式,这个非常简单,而且通常使用系统内置的格式就可以了。
  • rollover-size: 用来设置归档日志文件的最小尺寸,单位可以设置成kb、mb等等,默认为1mb。
  • rollover-period: 用来设置归档日志文件的周期,单位可以是1D(一天)、1W(一周)、1M(一个月)等。
  • 最后给出一个范例供大家参考:

    1. <!--
    2.    - Resin 3.1 configuration file.
    3.   -->
    4. <resin xmlns="http://caucho.com/ns/resin"
    5.        xmlns:resin="http://caucho.com/ns/resin/core">
    6.   <!--
    7.      - Logging configuration for the JDK logging API.
    8.     -->
    9.   <log name="" level="off" path="stdout:"
    10.        timestamp="[%H:%M:%S.%s] {%{thread}} "/>
    11.  
    12.   <!--
    13.      - 'info' for production
    14.      - 'fine' or 'finer' for development and troubleshooting
    15.     -->
    16.   <logger name="com.caucho" level="info"/>
    17.  
    18.   <logger name="com.caucho.java" level="config"/>
    19.   <logger name="com.caucho.loader" level="config"/>
    20.  
    21.     <host-default>
    22.       <!--
    23.          - With another web server, like Apache, this can be commented out
    24.          - because the web server will log this information.
    25.         -->
    26.       <access-log path="logs/${host.name}/access.log" 
    27.             archive-format="access-%Y%m%d.log.gz"
    28.             format='%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"'
    29.             rollover-size="10mb"
    30.             rollover-period="1D"/>
    31.       <!--
    32.          - stdout log and stderr log
    33.         -->
    34.       <stdout-log path="logs/${host.name}/stdout.log" 
    35.             archive-format="stdout-%Y%m%d.log.gz"
    36.             timestamp="[%Y.%m.%d %H:%M:%S.%s]" 
    37.             rollover-size="10mb"
    38.             rollover-period="1D"/>
    39.       <stderr-log path="logs/${host.name}/stderr.log" 
    40.             archive-format="stderr-%Y%m%d.log.gz"
    41.             timestamp="[%Y.%m.%d %H:%M:%S.%s]" 
    42.             rollover-size="10mb"
    43.             rollover-period="1D"/>
    44.     </host-default>
    45. </resin>

    最后还有一个事情需要说明一下,如果在windows系统下将resin注册成服务程序之后就会在log目录下产生jvm-defautl.log文件,而且这个文件会一直累加,所以会变的文件非常大而影响resin的性能。原来在Apache和Resin产生大容量日志的解决办法这篇文件中提到的使用httpd -jvm-log NUL的方法在3.1中无法使用,而且查找了大量的文档也没有找到合适的方法,后来索性将log目录中的写入权限去掉了,重启resin也没有任何影响,算是解决了这个问题。

    参考资料:

    http://caucho.com/resin-3.1/doc/config-log.xtp

    http://caucho.com/resin-3.1/doc/el-var.xtp#host

    Apache和Resin组合时间歇性出现503错误的解决方法

    Filed under: JavaPlateform,Web&Server — Jet @ 5:12 下午
    Tags: ,
    原文出处: Apache和Resin组合时间歇性出现503错误的解决方法
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    使用Apache和Resin进行组合时,如果Resin关闭或中断的时会出现如下的HTTP 503错误:

    Service Temporarily Unavailable
    The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.

    造成这个错误的原因是因为Resin无法启动,可以单独访问resin(如8080端口)查看具体的错误。

    我这里要说的是,在Resin和Apache都非常非常正常的情况下,间歇性的出现上述错误,也就是说不是一直有,而是偶尔出现这个错误,刷新下页面就好了。这个问题非常郁闷,后来在resin的bug报告中(见参考资料)竟然发现了解决的办法:

    The important configuration are load-balance-socket-timeout, socket-timeout, load-balance-idle-time and keepalive-timeout. The two load-balance-* configure mod_caucho. socket-timeout and keepalive-timeout configure the Resin side.

    load-balance-socket-timeout needs to be large enough to handle any server-side processing delays before the first data.

    socket-timeout and keepalive-timeout need to be larger than load-balance-idle-time because they need to keep the connection open for a keepalive request.

    For a diagram, see

    http://caucho.com/resin/admin/load-balancing.xtp

    也就是说,Resin在同Apache进行组合通讯的时候主要依靠四个参数:load-balance-socket-timeout, socket-timeout, load-balance-idle-time 和 keepalive-timeout,其中两个load-balance-*参数用来设置mod_caucho(就是与Apache组合的so文件),socket-timeout和keepalive-timeout用来设置Resin。至于参数数值的大小顺序依此是:load-balance-socket-timeout > socket-timeout 和 keepalive-timeout > load-balance-idle-time。上述四个参数的官方说明地址为:http://caucho.com/resin-3.1/doc/server-tags.xtp

    那为什么会间歇性出现503错误呢?这个是因为resin默认的socket-timeout为65s,时间太短了,有些比较大的请求在这个时间之内还没有进行完。综合上面所说,参考的配置如下:

    1. <resin ...>
    2.     <cluster id="app-tier">
    3.         <server-default>
    4.             <socket-timeout>180s</socket-timeout>
    5.             <keepalive-max>3000</keepalive-max>
    6.             <keepalive-timeout>180s</keepalive-timeout>
    7.             <load-balance-idle-time>120s</load-balance-idle-time>
    8.         </server-default>
    9.     </cluster>
    10. </resin>

    从此,这个世界清净了。

    参考资料:
    Apache 2.2.x + Resin 3.1.x: frequent 503 status error messages (Service Temporarily Unavailable)
    0002862: Apache + Resin and 503 HTTP Error
    resin apache问题

    Apache和Resin组合时UrlRewriteFilter失效的解决方法

    Filed under: Tools,Web&Server — Jet @ 5:36 下午
    Tags: ,
    原文出处: Apache和Resin组合时UrlRewriteFilter失效的解决方法
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    目前在Spring3.0的官方example中都使用UrlRewriteFilter来做伪静态,单独运行在Resin等JavaEE Web容器中的时候一切都OK,但是一旦与Apache一起组合的时候总是会出现404或403错误,当然UrlRewriteFilter所设定的规则也无效。

    造成这种现象的原因是因为在默认情况下,静态的资源均由Apache进行处理,而jsp或者由web.xml所映射的servlet均交给resin进行处理。如果web项目没有使用UrlRewriteFilter则一切OK,但是使用了UrlRewriteFilter之后,由servlet所映射的地址并不是/*即所有资源了,而是类似/app/*这样的设置。也就是说,用户所请求的资源首先由Apache判断一下,然后再由选择的交给Resin,最后才执行UrlRewriteFilter的规则。

    知道了原因,解决的方法也就出来了,只要告诉Apache将所有的资源都交由Resin来处理就可以了,可以使用Resin的servlet-mapping方法进行配置,配置如下:

    1. <servlet-mapping url-pattern='/*' servlet-name='plugin_match'/>

    其中plugin_match是Resin内置的servlet,按照resin官方的解释就是Resin告诉Apache将所有的符合url-pattern规则要求的请求都发送给它进行处理。

    因为servlet-mapping是resin特有的,所以建议将此也放在resin-web.xml中,然后放在项目中的WEB-INF目录下:

    1. <web-app xmlns="http://caucho.com/ns/resin"
    2.          xmlns:resin="http://caucho.com/ns/resin/core">
    3.     <servlet-mapping url-pattern='/*' servlet-name='plugin_match'/>
    4. </web-app>

    参考资料:
    Apache的UrlRewrite和Resin的配置问题
    Resin官方对servlet-mapping的说明

    在Eclipse WTP中加入Resin server adapter

    Filed under: JavaPlateform — Jet @ 6:01 上午
    原文出处: 在Eclipse WTP中加入Resin server adapter
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    目前Eclipse的WTP用来开发JavaEE的功能越来越强大了,再配合上Maven和Ant,完全可以将MyEclipse丢到垃圾桶了。但是在使用WTP进行Server配置的时候发现竟然不支持Resin,后来Google了一下,找到两个解决的方法:
    1. Amateras 这个是一个日本人写的Eclipse插件,可以绑定Resin到WTP中,不过他支持的Eclipse和Resin的版本都比较低,而且好久都没有更新了,不推荐使用。

    2. The Resin Eclipse plugin 这个是在Resin的官方WIKI上发现的一个Eclipse插件,比较稳定也比较活跃,是Resin官方推荐使用的插件,Eclipse Update地址是:http://caucho.com/eclipse,安装之后就会在Server Adapter里面出现Resin Server了。

    参考资料:
    IDE-CauchoWiki
    WTP扩展(1):增加Resin Server Runtime Environments

    Apache+Resin下如何写伪静态和301跳转

    Filed under: SearchEngine,Web&Server — Jet @ 7:19 下午
    Tags: , ,
    原文出处: Apache+Resin下如何写伪静态和301跳转
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    目前网上大多数资料都是介绍如何在Apache中设置伪静态的,在Resin中很少提及,经过实践实现了这一点,现在做如下总结。

    1. Apache下如何写伪静态和301重定向
    直接上代码(以本站域名为例):

    1. <IfModule mod_rewrite.c>
    2.     RewriteEngine On
    3.     # 叹号表示非,L表示最终结果,不再循环;NC是不区分大小写。
    4.     RewriteCond %{http_host} !^www.javatang.com [NC]
    5.     RewriteRule ^/(.*)$ http://www.javatang.com/$1 [R=301,NC,L]
    6.     RewriteRule ^(.*)/index(.*)$ $1/index.html [R=301,NC]
    7.   </IfModule>

    2. Resin下如何写伪静态和301重定向
    Resin下的重定向也是由伪静态来写的,不过具体一些的话他同页面伪静态是分别由两个tag来完成的,页面伪静态由forward完成,301永久重定向由moved-permanently完成。

    下面是具体的代码:

    1. <rewrite-dispatch>
    2.         <forward regexp="^(.*)/archives/([^/]+)/([^/]+).html$" target="$1/archives.jsp?q=$3&amp;a=$2" />
    3.         <!-- HTTP 301 moved -->
    4.         <moved-permanently regexp="^(.*)/index(.*)$" target="$1/index.html"/>
    5.     </rewrite-dispatch>

    这里需要特别注意的一点就是地址中的QueryString中&连接符需要使用&来代替,否则为出现错误。

    因为JavaEE默认的web.xml文件不支持上述属性,所以可以在你的站点WEB-INF目录下创建一个resin-web.xml文件,这个文件会被Resin看作为站点配置文件,然后在文件中写下如下内容:

    1. <web-app xmlns="http://caucho.com/ns/resin"
    2.          xmlns:resin="http://caucho.com/ns/resin/core">
    3.     <rewrite-dispatch>
    4.         <forward regexp="^(.*)/archives/([^/]+)/([^/]+).html$" target="$1/archives.jsp?q=$3&amp;a=$2" />
    5.         <!-- HTTP 301 moved -->
    6.         <moved-permanently regexp="^(.*)/index(.*)$" target="$1/index.html"/>
    7.     </rewrite-dispatch>
    8. </web-app>

    3. Apache+Resin组合的时候设置伪静态需要注意的地方

    二者组合中Resin主要完成Servlet所映射的地址为文件类型,而Apache完成其余部分,因此关于页面伪静态部分需要在Resin和Apache中同时设置才有效,否则有时候会出现404错误。但对于301永久重定向来说,如果是涉及域名部分的只需要在Apache中设置即可,如果二者都设置的时候会出现域名解析错误;如果涉及到页面部分的话需要在二者中都设置。

    关于Resin如何同Apache组合请看这篇文章 Resin 3.0.x 经验总结

    关于Resin+Apache下如何设置泛域名请看这篇文章 Apache+Resin泛域名的设置

    参考资料:
    Resin url rewrite tags
    Apache网站301永久重定向设置

    Apache+Resin泛域名的设置

    Filed under: Web&Server — Jet @ 3:25 下午
    Tags: ,
    原文出处: Apache+Resin泛域名的设置
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    在Apache中如果设置范域名的话使用 ServerAlias ,比如

    1. <VirtualHost *:80>
    2.   ServerName javatang.com
    3.   ServerAlias *.javatang.com
    4.   ...
    5. </VirtualHost>

    如果使用Apache+Resin架构的话,需要在Resin中设置同样的泛域名与Apache进行对应。在Resin中设置泛域名使用 host-alias-regexp 标签,对应于上面Apache在Resin中设置如下:

    1. <host id="javatang.com" root-directory=".">
    2.    <host-alias-regexp>^([^/]*).javatang.com</host-alias-regexp>
    3.    ...
    4. </host>

    参考资料:
    host-alias-regexp
    apache、resin泛域名、多域名设置

    Apache和Resin产生大容量日志的解决办法

    Filed under: JavaPlateform,Web&Server — Jet @ 8:15 上午
    Tags: ,
    原文出处: Apache和Resin产生大容量日志的解决办法
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    昨天服务器上网站无故无法访问,重启Apache之后过一段时间又无法访问。后来无意间看到Apache的日志文件(access.log)竟然有7G多,赶紧删除之再重启Apache就OK了。但是总是这样也不是办法,如果时间一长忘记清空日志文件的话又会造成Apache死掉,另外之前Resin也产生过这样的问题。后来综合Google后的信息采用了如下的解决方法:

    1. Apache日志
    减少日志大小有两种方法,一种是修改日志记录级别,可以将默认的warn级别提升为error级别;

    1. LogLevel error

    另外一种方法就是将日志文件按照每天创建一个文件的方式产生,这样就不会将所有的信息写入到一个文件。在Linux下可以将 httpd.conf 中 CustomLog logs/access.log common 修改为:

    1. CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/%Y_%m_%d.access.log 86400 480" common

    Windows下没有rotatelogs这个工具,但是可以下载一个cronolog的软件,进入官方下载页面下载Win 32 version (ZIP file) 版本,将压缩包中的cronolog.exe解压缩到apache安装目录的bin目录下面,然后可以将CustomLog logs/access.log common 修改为:

    1. CustomLog "|bin/cronolog.exe logs/access%Y%m%d.log" combined

    这样可以达到同样的效果。需要说明的是再重启Apache之后原来的cronolog.exe进程不会自动关闭,这个应该是软件的bug。官方最新的更新日期是2002-01-24,而且最新的1.6.2 版本没有windows版本,所以要耐心等待了。

    2. Resin日志
    前段时间提到过因为Resin日志巨大的问题而导致出错,过了这几天又发现jvm.log文件达到1G的容量了,照这样下去如果忘记清空日志的话又会导致程序出错。无意间在一篇文章中看到这样一句话:

    Resin启动时通过bin目录下的wrapper.pl文件进行控制,我们可以修改这个文件来加一些参数……

    后来经过测试这样的启动方式是在Linux系统下,Windows下面修改这个文件是没有作用的。记得以前我在 Resin 3.x 经验总结文章中提到在Windows下设置jvm内存的时候可以使用下面的命令:

    1. httpd.exe -Xmn100M -Xms500M -Xmx500M

    是不是上面提到的wrapper.pl文件中的httpd参数都可以这样设置呢?后来在Resin官方的新闻组里面找到了这个配置参数:

    You can use -jvm-log logfile as an option to httpd.exe

    这样的话就可以设置Resin不产生jvm.log日志文件,因为里面的信息在web程序中通过log4j获得了。

    1. httpd -jvm-log NUL

    按照以下步骤重新按照Resin的NT服务:

    1. #1 停止Resin NT服务和Apache
    2. httpd -remove
    3. #2 安装Resin NT服务
    4. httpd -jvm-log NUL -install
    5. #3 重新启动Resin和Apache

    参考资料:
    解决Apache日志文件ACCESS.LOG日益膨胀的一个办法
    jvm.log workarounds
    resin的优化

    Resin 频繁宕掉的原因

    Filed under: JavaPlateform,Web&Server — Jet @ 2:03 上午
    Tags:
    原文出处: Resin 频繁宕掉的原因
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    最近一段时间Resin频繁的宕掉,大概运行一天左右网站就无法访问了。但是已经使用了有半年多了一直都很好,后来查看Resin的log目录的时候,在里面赫然发现有个jvm.log文件有1.6G。于是赶紧停止Resin然后删除之!!

    一般来说,如果一个软件使用很长时间突然出现问题,首先看日志文件!算是一个经验吧,呵呵

    Resin 3.0.x 经验总结

    Filed under: JavaPlateform,Web&Server — Jet @ 11:01 上午
    Tags:
    原文出处: Resin 3.0.x 经验总结
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    这两天正好项目刚刚完成,所以就好好的研究了下Resin。我用的Resin版本是3.0.19,中间遇到一些常见的问题,但是网上大多数的资料都是1.x或2.x的,在3.x中是不能使用的,所以查到解决的办法不是件容易的事情,现在整理出来与大家分享:

    1. 怎样关闭目录浏览方式?
    查了些资料,大多数都是说可以 将directory-servlet设置为 “none” 来禁止目录浏览,但是这种方式只是针对于Resin2.x,在3.x中已经不使用directory-servlet了。后来看了下官方的文档资料,原来关闭目录浏览的方法很简单,只需要将resin.conf中

    1. <servlet servlet-name="directory" 
    2.               servlet-class="com.caucho.servlets.DirectoryServlet"/>

    修改为

    1. <servlet servlet-name="directory" 
    2.               servlet-class="com.caucho.servlets.DirectoryServlet"> 
    3.           <init enable="false"/> 
    4.       </servlet>

    或者直接注释掉这一段代码就可以了。

    2. 设置Servlet为默认首页
    在web.xml中这样设置

    <servlet-mapping>
    <servlet-name>MainPageServlet</servlet-name>
    <url-pattern>/index</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
    <welcome-file>index</welcome-file>
    </welcome-file-list>

    如果这样的话在Tomcat中可以实现的,但是在Resin中会提示404。后来查了下资料,发现在Resin中默认的首页文件必须真实存在才可以的(”Point is that welcome file MUST exist on the server.”),所以除了上述的设置之外还需要在网站跟目录下面创建一个同名的空文件就可以了。

    3. 安装Resin为WinNT服务
    使用以下命令安装Resin为NT服务:

    1. httpd.exe -install

    卸载服务使用下面的命令:

    1. httpd.exe -remove

    这里需要说明的是:如果Apache和Resin组合的话,删除Resin的NT服务之前首先需要停止Apache,否则无法删除。

    4. 出现OutOfMemoryException的解决方法
    出现OOM异常大多数是因为分配给Resin的内存过小造成的,这个时候可以使用以下命令增大Resin的内存:

    1. unix> bin/httpd.sh -Xmn100M -Xms500M -Xmx500M
    2. win> httpd.exe -Xmn100M -Xms500M -Xmx500M
    3. install win service> httpd.exe -Xmn100M -Xms500M -Xmx500M -install

    这样就可以设置Resin使用的内存了

    5. Resin和Apache组合
    我感觉Resin和Apache组合是最简单的,设置比Tomcat简单方便的多。总结一下可以使用如下步骤:
    1) 分别安装Apache和Resin
    2) 在Apache中的httpd.conf中添加模块,代码如下:

    1. LoadModule caucho_module "yourResinHome/win32/apache-2.0/mod_caucho.dll"

    3) 如果是同一IP的多个站点,可以将
    ResinConfigServer localhost 6802
    放到VirtualHost代码中,下面是一个例子:

    1. <virtualhost *:80>
    2. ServerName www.3721.com
    3. DocumentRoot "C:\website\www"
    4.  
    5. ResinConfigServer localhost 6802
    6. </virtualhost>

    当然如果想让虚拟站点正确运行的话,还需要在Resin的resin.conf文件中添加站点,具体可以参考Resin手册;如果不是同IP的虚拟站点,只要将 ResinConfigServer localhost 6802 放到任意一个地方就可以了

    最后分别重启一下Resin和Apache就可以了,是不是很简单?

    参考资料:
    Resin 3.0 官方文档

    /RESIN/ welcome-files & servlet
    http://groups.google.com/group/fido7.ru.java/browse_thread/thread/986b22abad39551c/8cd4cbffabd64fe1?lnk=st&q=resin+servlet+welcome-file&rnum=2#8cd4cbffabd64fe1