欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Resin的几个常用配置

程序员文章站 2022-03-01 17:05:08
...

                         Resin的几个常用配置

 

转载:http://blog.csdn.net/johnson1492/article/details/7913827

本文着重介绍resin的几个常用配置

注:

1. 本文并非resin.conf的使用说明,只是从实用角度出发,按需分析常用的配置。更多的内容到官网学习吧;

2. 基于resin3.x的探讨。

(友情提示:刚下载的resin中,resin.conf里的配置都是包含有注释的——废话!)

<dependency-check-interval>

Dependency checking

在说这个参数之前,不得不先了解一下resin的“Dependency checking”机制。resin会定时检测<web-app>和<host>下配置的资源是否改动,如果改动,会根据相应的策略重新启动web-apps和虚拟主机。那么,具体会检测那些资源呢?下面是一个清单:

  • WEB-INF/classes下的class文件
  • WEB-INF/lib下的jar文件
  • <class-loader>中指定的class或jar
  • WEB-INF/resin-web.xml
  • WEB-INF/web.xml
  • resin.conf
  • <resin:import>引入的配置文件
  • 通过<archive-path>或<web-app-deploy>或<host-deploy>配置的.war文件;
  • 通过<dependency>加入的文件

是否很眼熟?没错!想当年在本地调试web的时候,改一个java文件,总会骂骂咧咧的停掉resin然后重启,甚是麻烦,会抱怨为啥class这么矫情,不能像改个jsp那样立竿见影的看到效果。resin说哥你想法是好的,但就算我有那个热加载的意愿,它jvm也不干那,你去找sun(oracle就不提了)理论去吧。

那只好忍了吧,但是要等多久才会自动加载一次呢?<dependency-check-interval>终于出场了。该标签定义了resin多久检测一次上面的那些资源是否变更。这个值是需要加单位的,具体的值定义可以参考Period定义。默认值为2s。

对于取值,resin.conf有这样的一段注释:

For production sites, change dependency-check-interval to something – like 600s, so it only checks for updates every 10 minutes.

就是说这种检测会非常耗时,如果搞resin优化的话,那么就把它设置的长一些吧(比如在生产环境里就设置的长一些)或者干脆设置为-1禁止自动检测变更,即禁止所谓的热部署。

Dependency checking与RHS

这个参数明了了,实践一下吧!于是搞一个测试项目出来,简单配置一下,跑起来之后,象征性的改一下resin.conf,我们将2s改为1s,看终端的滚动日志,咦,为什么没有输出日志?正在纳闷之时,日志来了,说检测到了resin.conf的dependency-check-interval改变了,重启了所有的host。等等,我们之前的检测时间是2s,为什么改动文件后感觉过了很久才重启了resin?

经过多番测试,结论是:“Dependency checking”与resin重启的机制完全是两回事。dependency-check-interval只是告诉resin多久检测一次上下文环境的变化,如果发生变化,先记录下来,负责监控resin的进程会定期检测这个记录,如果发现有新的变更记录,则重启resin。至于重启的机制,属于Resin Health System的范畴,本文暂不讨论。但可以通过这句话简单的验证一下我们的推论:

Because your site’s reliability is important, Resin monitors its internal sensor net every 60 seconds, recording your server’s memory, cpu, network, database and cluster status.

重启机制

如果是全局的配置(例如resin.conf)变更,则会重启整个resin(包括所有的虚拟主机),如果只是某个webapp做了变更(如class、jsp、web.xml等),则只对webapp重启。

需要说明一点的是,在<jsp>中亦可配置该标签(属性),默认情况下,该属性会继承全局的dependency-check-interval值,但如果设置该值为-1,会发生什么事呢?我想你不会那么做的……

想要class的变更像jsp那样迅捷该怎么办到呢?myeclipse可以办到。eclipse for javaEE的话,还需要一些插件的支持,本文暂不做讨论,参考本文最下边关于热部署的推荐文章。

<server>

一个server对应于一个jvm实例,为配置在其中的各个虚拟主机提供服务,接收请求并处理。在<server>中可以配置HTTP,集群端口,存活时间,超时时间,线程池以及负载均衡。一个集群(cluster)可以包含多个server,但是id必须不同。server的属性包含有address(ip)和port,如果resin中只有配置这一个单独的server,则可以省略address和port,不过这么搞的话该server就无法作为集群的一部分工作,并且无法用命令行来管理。

常用属性有address和port。即在定义server的时候同时配置address和port。address的默认值是127.0.0.1。

<server-default>

假如由于同一个集群中的多个server配置大同小异,就可以先搞一个通用的server,其他的server会继承通用的server配置,各自的配置又会覆盖继承的配置。<server-default>就是充当了这个通用的配置,正如其名,就将其中的配置看作是所有server的默认配置即可。像HTTP端口,超时,存活时间,JVM以及线程这些配置可以通过配置<server-default>实现共享。

下面的一个配置中,<server-default>定义了JVM的一些参数以及HTTP的通用配置:

<resin xmlns="http://caucho.com/ns/resin">
<cluster id="">
<server-default>
<jvm-arg>-Xmx2048m</jvm-arg>
<accept-thread-min>32</accept-thread-max>
<accept-thread-min>64</accept-thread-max>
<http port="80"/>
</server-default>
<server id="a" address="192.168.1.10" port="6800"/>
<server id="b" address="192.168.1.11" port="6800"/>
...

也许你会异想天开的问,既然<server-default>是默认的<server>配置,那不显示配置<server>可以吗?不可以!自己试一下就行了,去掉里面所有显示定义<server>,重启resin你就会看到它的*:server-id ” has no matching <server> definition. 并且此时resin会陷入脑残式的无限次重启之中,它也许认为这是个偶然性事件,重启resin以尝试恢复。

<resin:import>

从外部的文件读取配置,这个外部文件必须符合一定的规范,否则resin解析不了的。标准就直接参考${RESIN_HOME}/conf/app-default.xml即可。配置全局的默认访问页面,可以修改app-default.xml中的<welcome-file-list>。

<http>

http的典型用法是配置在server-default中。因为经常会有这样一个场景:同一个cluster中的所有server监听同一个端口。比如在lsit1-2中,两个server都默认监听80端口。<http>亦可配置在每个单独的server中。

<host>

一个server可以服务于多个虚拟主机,每个虚拟主机都可以有自己的servlets以及文档。虚拟主机必须被明确的定义出来,就是说你不能只用<host-default>(类比<server-default>)。对于resin来说,创建一个虚拟主机就像创建一个目录,然后再为其设置一个DNS一样容易。一个虚拟主机可以包含一个或者多个web-app。简单的web-app可放置在一个名为“webapps”的*目录下,就像Apache服务器上的/htdocs。复杂一点的站点,可以先部署多个webapps,然后将这些web-app放置在这些webapps中。

举例来说,假设有个server同时管理者两个域名:www.gryffindor.com和www.slytherin.com,这两个域名所对应的web-app部署在不同的目录下/var/resin/gryffindor和/var/resin/slytherin,他们共享同一个IP。当用户访问http://www.gryffindor.com/的时候,首先浏览器会发送HTTP请求到共享ip,resin接到请求后,从HTTP请求头中取出Host,根据Host值再将请求转发给相应的虚拟主机。

host重要的属性:

 

  • id: resin使用此id来区分不同的请求。若留空则表示该host为默认host,当其他的host无法被匹配的时候便会将请求转发到此host。
  • root-directory: 指定一个虚拟主机的文件系统的路径,默认的“.”就代表${RESIN_HOME}。参考下面list1-2的例子,可以更深入的理解root-directory的含义。
  • regexp:用正则表达式匹配域名。
    <server>
    <host id="gryffindor.caucho.com" root-directory="/home/www/gryffindor">
    <web-app id="/" root-directory="webapps/ROOT" />
    </host>
    <host id="slytherin.caucho.com" root-directory="/home/www/slytherin">
    <web-app id="/" root-directory="webapps/ROOT">
    </host>
    </server>


     

    <web-app>

    主要的属性是id和root-directory,同host的id类似,web-app的id也是用于匹配url的。root-directory指定项目存放路径,可以使用绝对路径,相对路径则是相对host的root-diirectory而言的。

    注意:若使用myeclipse/eclipse创建项目,会有一个项目名(projectName),而此处的root-directory并非项目路径,而是一个特殊的目录,该目录的子目录以及文件必须符合Servlet规范,通常就是eclipse默认创建的WebContent,这个名字可以随便改。btw,这个规范的层级结构主要有三个元素:

    /WEB-INF/web.xml

    /WEB-INF/classes/

    /WEB-INF/lib/

    必须包含有上面三个东西。配置文件(*.properties, *.xml等等)需要放在classes下。

    举例说明Eclipse中新增一个项目,然后部署resin的方法,假设现在有份配置如下:

     

    <host id="" root-directory=".">
    <web-app id="/" root-directory="webapps/ROOT"/>
    <web-app id="/resin-admin" root-directory="${resin.home}/php/admin">
    <prologue>
    <resin:set var="resin_admin_external" value="false"/>
    <resin:set var="resin_admin_insecure" value="true"/>
    </prologue>
    </web-app>
    </host>

     

上一篇: Nginx常用的配置

下一篇: Swift 基础