Java堂  


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

Filed under: Tools,Web&Server — Jet @ 5:36 下午
Tags: ,
原文出处: http://www.javatang.com/archives/2010/08/27/3629451.html
作者: 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 上午
原文出处: http://www.javatang.com/archives/2009/12/30/0134324.html
作者: 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: , ,
原文出处: http://www.javatang.com/archives/2008/10/18/1942276.html
作者: 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: ,
原文出处: http://www.javatang.com/archives/2008/03/18/2532264.html
作者: 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: ,
原文出处: http://www.javatang.com/archives/2007/06/20/1513177.html
作者: 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:
原文出处: http://www.javatang.com/archives/2007/05/04/0353161.html
作者: 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:
原文出处: http://www.javatang.com/archives/2006/08/21/010658.html
作者: 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