Resin介绍及其使用配置一
Resin是一个提供高性能的,支持 Java/PHP 的应用服务器。目前有两个版本:一个是GPL下的开源版本,提供给一些爱好者、开发人员和低流量网站使用;一种是收费的专业版本,增加了一些更加适用于生产环境的特性。
Resin的一些特性:
可靠性:Resin包含了很多可靠的特性,包括服务器自动重启、检测并重启死锁的服务器、管理JVM内存以防止内存泄露等。
集群:Resin可以将多个服务器作为一个服务器来对客户进行响应,从而增强服务器的扩展能力。
持久和分布的sessions:持久的session能够在服务器重启的时候保持现有的Http会话,分布式的session可以在多个服务器之间共享Http会话的状态。
增强的本地代码:同时为Windows和Linux系统提供了本地的代码增强支持。能够改善Socket链接、持久链接和文件读写方面的性能。
OpenSSL:提供原生的OpenSSL库支持,比JSSE提供的方案要好很多。
HTTP代理缓存:能够通过内存和磁盘缓存系统提高服务器的性能表现,将动态页面的速度提高到接近静态页面。
Gzip过滤器:通过gzip来减少带宽。
Resin服务器的安装(Windows - 独立版)
1、安装JDK1.5或更高
2、确保JDK的安装以及正确设置了环境变量JAVA_HOME
3、解压Resin文件
4、执行 java –jar resin-3.1.8/lib/resin.jar
5、或者运行 http.exe
6、在浏览器地址栏中输入 http://localhost:8080 即可进行访问
我们也可以将Resin设置为系统服务。
虚拟机的配置:
Resin的配置文件位于 ./conf/ 下,默认的配置文件为 resin.conf。
配置简单的虚拟机,我们只要加入
<host host-name="test.heep.com" root-directory="D:\workspaces\java\testsys">
<access-log path="logs/test.access.log"
format='%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"'
rollover-period="1W"/> <web-app id="/" root-directory="WebRoot/">
</web-app>
</host>
</cluster>
另外在host文件中加入对应的记录,这样,我们就可以访问 http://test.heep.com 了
1.
2. <!-- Resin 3.1 配置文件. -->
3. <resin xmlns="http://caucho.com/ns/resin" xmlns:resin="http://caucho.com/ns/resin/core">
4. <!-- 加载resin/lib下的所有.jar文件-->
5. <class-loader>
6. <tree-loader path="${resin.home}/lib"/>
7. <tree-loader path="${resin.root}/lib"/>
8. </class-loader>
9. <!-- 管理配置 -->
10. <management path="${resin.root}/admin">
11. </management>
12. <!-- JDK日志接口的配置. -->
13. <log name="" path="stdout:" timestamp="[%H:%M:%S.%s] "/>
14. <!-- 日志信息的级别:'info' 生产环境 'fine' 开发环境 'finer' 调试环境 -->
15. <logger name="com.caucho" level="info"/>
16. <logger name="com.caucho.java" level="config"/>
17. <logger name="com.caucho.loader" level="config"/>
18. <!-- 环境上下文的检测时间,对于生产站点, 这个要设置长一点,例如600秒,10分钟 -->
19. <dependency-check-interval>2s</dependency-check-interval>
20. <!-- 发送邮件通知的SMTP服务器 -->
21. <system-property mail.smtp.host="127.0.0.1"/>
22. <system-property mail.smtp.port="25"/>
23. <!-- 你可以把编译器改成 "javac", "eclipse" 或者 "internal". -->
24. <javac compiler="internal" args="-source 1.5"/>
25.
26. <!-- Security providers. -->
27. <security-provider>
28. com.sun.net.ssl.internal.ssl.Provider
29. </security-provider>
30.
31. <!-- 去掉注释,如果你使用resin提供的xml应用 -->
32.
33. <system-property javax.xml.parsers.DocumentBuilderFactory
34. "com.caucho.xml.parsers.XmlDocumentBuilderFactory"/>
35. <system-property javax.xml.parsers.SAXParserFactory
36. "com.caucho.xml.parsers.XmlSAXParserFactory"/>
37.
38. <cluster id="app-tier">
39. <!-- 设置集群上下文的根, 相对于server.root -->
40. <root-directory>.</root-directory>
41. <server-default>
42. <!-- HTTP服务的端口-->
43. <http address="*" port="8080"/>
44. <!-- SSL端口配置: -->
45.
46. <http address="*" port="8443">
47. <openssl>
48. <certificate-file>keys/gryffindor.crt</certificate-file>
49. <certificate-key-file>keys/gryffindor.key</certificate-key-file>
50. <password>test123</password>
51. </openssl>
52. </http>
53.
54. <!-- JVM参数设置 -->
55. <jvm-arg>-Xmx256m</jvm-arg>
56. <jvm-arg>-Xss1m</jvm-arg>
57. <jvm-arg>-Xdebug</jvm-arg>
58. <jvm-arg>-Dcom.sun.management.jmxremote</jvm-arg>
59. <!-- Uncomment to enable admin heap dumps 去掉这个如果你想管理内存堆的倾倒 -->
60. <jvm-arg>-agentlib:resin</jvm-arg>
61.
62. <watchdog-arg>-Dcom.sun.management.jmxremote</watchdog-arg>
63. <!-- 强制resin强制重起时的最小空闲内存 -->
64. <memory-free-min>1M</memory-free-min>
65. <!-- 最大线程数量. -->
66. <thread-max>256</thread-max>
67. <!-- 套接字等待时间 -->
68. <socket-timeout>65s</socket-timeout>
69. <!-- 配置 keepalive -->
70. <keepalive-max>128</keepalive-max>
71. <keepalive-timeout>15s</keepalive-timeout>
72. <!-- 如果使用的是UNIX,这里是启动的帐号和用户组. -->
73. <user-name>resin</user-name>
74. <group-name>resin</group-name>
75.
76. </server-default>
77. <!-- 定义群集服务器 -->
78. <server id="" address="127.0.0.1" port="6800"/>
79. <!-- Configures the persistent store for single-server or clustered 配置独立服务器或者群集的持久化存储,专业版的功能 -->
80. <resin:if test="${resin.isProfessional()}">
81. <persistent-store type="cluster">
82. <init path="session"/>
83. </persistent-store>
84. </resin:if>
85. <!-- 为了安全, 你可以为SSL会话(SSL sessions)定义一个不同的cookie. -->
86. <ssl-session-cookie>SSL_JSESSIONID</ssl-session-cookie>
87.
88. <!-- 缓存启用 (专业版的功能) -->
89. <resin:if test="${isResinProfessional}">
90. <cache path="cache" memory-size="64M">
91. <!-- Vary header rewriting for IE -->
92. <rewrite-vary-as-private/>
93. </cache>
94. </resin:if>
95. <!-- 启用周期性的服务器状态检查和死锁检查,所有的服务器可以添加 <url> 来检查。 -->
96. <resin:if test="${isResinProfessional}">
97. <ping>
98. <!-- <url>http://localhost:8080/test-ping.jsp</url> -->
99. </ping>
100. </resin:if>
101. <!-- 包含web应用的默认行为 -->
102. <resin:import path="${resin.home}/conf/app-default.xml"/>
103. <!-- 每一个web应用的默认参数 -->
104. <web-app-default>
105. <!-- 扩展库的公共jar文件,扩展是安全的即使没有类装载器知道的jars,装载的类将为每个应用分别装载,也就是这些类都是不同的 -->
106. <class-loader>
107. <tree-loader path="${server.root}/ext-webapp"/>
108. </class-loader>
109. <!-- 设置缓存页、静态也的延时值 -->
110. <cache-mapping url-pattern="/" expires="5s"/>
111. <cache-mapping url-pattern="*.gif" expires="60s"/>
112. <cache-mapping url-pattern="*.jpg" expires="60s"/>
113. <cache-mapping url-pattern="*.png" expires="60s"/>
114. <!-- 启用EL表达式 -->
115. <allow-servlet-el/>
116. <!-- 安全原因, 默认禁用了会话的URLs -->
117. <session-config>
118. <enable-url-rewriting>false</enable-url-rewriting>
119. </session-config>
120. <!-- 安全原因, 在cookies中设置HttpOnly标志 -->
121. <cookie-http-only/>
122.
123. <!--一些JSP包有不正确的 .tld文件。可以把validate-taglib-schema设置成false,可能继续正常工作 Some JSP packages have incorrect .tld files. It's possible to set validate-taglib-schema to false to work around these packages. -->
124. <jsp>
125. <validate-taglib-schema>true</validate-taglib-schema>
126. <fast-jstl>true</fast-jstl>
127. <fast-jsf>true</fast-jsf>
128. </jsp>
129. </web-app-default>
130. <!-- 简单的数据池配置 -->
131. The JDBC name is java:comp/env/jdbc/test
132. <database>
133. <jndi-name>jdbc/mysql</jndi-name>
134. <driver type="org.gjt.mm.mysql.Driver">
135. <url>jdbc:mysql://localhost:3306/test</url>
136. <user></user>
137. <password></password>
138. </driver>
139. <prepared-statement-cache-size>8</prepared-statement-cache-size>
140. <max-connections>20</max-connections>
141. <max-idle-time>30s</max-idle-time>
142. </database>
143.
144. <!-- 定义所有虚拟主机的默认配置 -->
145. <host-default>
146. <!-- 如果和别的web服务器整合,这个可以被去掉,因为web服务器也可以记录这些信息。 -->
147. <access-log path="logs/access.log" format='%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"' rollover-period="1W"/>
148. <!-- war 文件的布置目录 -->
149. <web-app-deploy path="webapps"/>
150. <!-- ear文件的布置目录 -->
151. <ear-deploy path="deploy">
152. <ear-default>
153. <ejb-server>
154. <config-directory>WEB-INF</config-directory>
155. <data-source>jdbc/test</data-source>
156. </ejb-server>
157. </ear-default>
158. </ear-deploy>
159. <!-- rar文件的布置目录 -->
160. <resource-deploy path="deploy"/>
161. </host-default>
162. <!-- 虚拟主机的布置目录 -->
163. <host-deploy path="hosts">
164. <host-default>
165. <resin:import path="host.xml" optional="true"/>
166. </host-default>
167. </host-deploy>
168. <!-- 默认的虚拟主机配置 -->
169. <host id="" root-directory=".">
170. <!-- 配置默认的应用 webapp's ROOT -->
171. <web-app id="/" root-directory="webapps/ROOT"/>
172. <web-app id="/resin-admin" root-directory="${resin.home}/php/admin">
173. <!-- 管理应用程序 /resin-admin password is the md5 hash of the password。md5码的密码。 localhost is true to limit access to the localhost。localhost设置成true,这样只有localhost才能访问 -->
174. <prologue>
175. <resin:set var="resin_admin_user" value=""/>
176. <resin:set var="resin_admin_password" value=""/>
177. <resin:set var="resin_admin_external" value="false"/>
178. </prologue>
179. </web-app>
180. </host>
181. </cluster>
182. <!-- Configuration for the web-tier/load-balancer -->
183. <resin:if test="${resin.isProfessional()}">
184. <cluster id="web-tier">
185. <server-default>
186. <!-- The http port -->
187. <http address="*" port="9080"/>
188. </server-default>
189. <server id="web-a" address="127.0.0.1" port="6700"/>
190. <cache path="cache" memory-size="64M"/>
191. <host id="">
192. <web-app id="/">
193. <rewrite-dispatch>
194. <load-balance regexp="" cluster="app-tier"/>
195. </rewrite-dispatch>
196. </web-app>
197. </host>
198. </cluster>
199. </resin:if>
200. </resin>
resin配置介绍二
Resin是一个Servlet容器.使用Resin开发Java Web项目时,需要建立自己的WebApp。
Resin中的应用可以有2种方式发布:
是在Resin的目录下发布;
是打包成War发布
一、resin.conf配置文件说明[Resin3.1下的]
1.<http host='localhost' port='80'/>
host参数指定的是服务器,port指定的是http端口,默认是localhost和8080。
2. <web-app>标签
该标签表示一个web应用,标签中,id属性表示该应用的Web路径。
如<web-app id='/test'>,表示该应用在Web上访问的时候应该用http://hostname/test/来访问。
app-dir属性表示该应用的实际路径。如
<app-dir>d:resindoctest</app-dir>表示该应用在d:resin doctest目录下面。默认值为根下面的和id同名的目录。
3.Resin可以配置3种error-page:
404错误也就是文件找不到错误页;
Exception违例页;
不能连接java引擎页。
他们分别可以这样子设置:
404文件找不到页
<web-app id='/app1'>
<error-page error-code='404' location='/file_not_found.jsp'/>
</web-app>
Exception 违例页
<web-app id='/foo'>
<error-page exception-type='java.lang.NullPointerException' location='/nullpointer.jsp'/>
</web-app>
不能连接到srun Servlet引擎错误页
该页设置和应用无关,属于服务器的设置。
<http-server>
<error-page exception-type='connection' location='/missing_file.html'/>
</http-server>
参见下面的语句:
<classpath id='WEB-INF/classes' source='WEB-INF/src' compile='true'/>
id参数的值表示classpath中编译后的class的存放路径;
source参数的值表示classpath中java源代码的存放路径;
compile中的值可能是true或者false,表示是否由Resin的srun自动编译java源代码。
Classpath的设置一般和javaBean或者Servlet的使用有关。
id的值表示javaBean的编译好的包存放的根,
source的值表示javaBean的java源代码存放的根。
Servlet相同。
6. Servlet的设置
<servlet-mapping url-pattern='*.xtp' servlet-name='xtp'/>
<servlet-mapping url-pattern='*.jsp' servlet-name='jsp'/>
<servlet-mapping url-pattern='/servlet/*' servlet-name='invoker'/>
一般就是指定那些需要通过srun的解析。比如在这里,把*.jsp改成*.jss,其他不变,那么只要在访问时遇到*.jss的文件就和原来遇到*.jsp一样处理。通过这个可以指定解析的引擎,
如以下的配置:
<servlet-mapping url-pattern='*.xtp' servlet-name='com.caucho.jsp.XtpServlet'/>
在Servlet中,也可以指定servlet。如
<servlet servlet-name='hello' servlet-class='test.HelloWorld'/>
<servlet-mapping url-pattern='/hello.html' servlet-name='hello'/>
在servlet-mapping中有个重要的参数case-sensitive 如果在windows上,最好配置成false,忽略大小写,从而和windows的约定一致。
7. Session的配置
<session-config>
<session-max>4096</session-max>
<session-timeout>30</session-timeout>
<enable-cookies>true</enable-cookies>
<enable-url-rewriting>true</enable-url-rewriting>
<file-store>WEB-INF/sessions</file-store>
</session-config>
session-max :最大 session数量
session-timeout :session过期时间,以分钟为单位。
是否允许cookie :指session是否采用cookies。如果采用cookies,浏览器必须支持session才能使用,发布时建议改成false。enable- url-rewriting和enable-cookies一般配合使用。如果enable-cookies是false,
enable-url-rewriting应该设成true比较合适。
file-store :该配置指示服务器是否把session作为文件存放在服务器上。如果把该项注释掉,则在你的web-app目录下的WEB-Inf/sessions目录不保存序列化后的session对象。Session还有jdbc-store配置,对应着把session通过jdbc永久保存在数据库中。其实也就是会话变量的序列化后的保存和重新载入的物理实现。
resin3.1.6配置文件resin.conf如下:
<resin xmlns="http://caucho.com/ns/resin" xmlns:resin="http://caucho.com/ns/resin/core">
<!-- 加载resin/lib下的所有.jar文件-->
<class-loader>
<tree-loader path="${resin.home}/lib"/>
<tree-loader path="${resin.root}/lib"/>
</class-loader>
<!-- - 管理配置 -->
<management path="${resin.root}/admin"></management>
<!-- -JDK日志接口的配置. 日志信息的级别:'info' 生产环境 'fine' 开发环境 'finer' 调试环境 -->
<log name="" level="fine" path="stdout:" timestamp="[%H:%M:%S.%s] "/>
<logger name="com.caucho" level="info"/>
<logger name="com.caucho.java" level="config"/>
<logger name="com.caucho.loader" level="config"/> <!-- - 环境上下文的检测时间,对于生产站点, 这个要设置长一点,例如600秒,10分钟 -->
<dependency-check-interval>2s</dependency-check-interval> <!-- - 发送邮件通知的SMTP服务器 -->
<system-property mail.smtp.host="127.0.0.1"/>
<system-property mail.smtp.port="25"/> <!-- - 你可以把编译器改成 "javac", "eclipse" 或者 "internal". -->
<javac compiler="internal" args="-source 1.5"/> <!-- Security providers.
- <security-provider>
- com.sun.net.ssl.internal.ssl.Provider
- </security-provider>
--> <!-- 去掉注释,如果你使用resin提供的xml应用
- <system-property javax.xml.parsers.DocumentBuilderFactory
- ="com.caucho.xml.parsers.XmlDocumentBuilderFactory"/>
- <system-property javax.xml.parsers.SAXParserFactory
- ="com.caucho.xml.parsers.XmlSAXParserFactory"/>
--> <cluster id="app-tier">
<!-- 设置集群上下文的根, 相对于server.root -->
<root-directory>.</root-directory>
<server-default>
<!-- HTTP服务的端口-->
<http address="*" port="8080"/>
<!--
- SSL端口配置:
-
- <http address="*" port="8443">
- <openssl>
- <certificate-file>keys/gryffindor.crt</certificate-file>
- <certificate-key-file>keys/gryffindor.key</certificate-key-file>
- <password>test123</password>
- </openssl>
- </http>
--> <!-- - JVM参数设置 -->
<jvm-arg>-Xmx256m</jvm-arg>
<jvm-arg>-Xss1m</jvm-arg>
<jvm-arg>-Xdebug</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote</jvm-arg>
<!-- Uncomment to enable admin heap dumps 去掉这个如果你想管理内存堆的倾倒
- <jvm-arg>-agentlib:resin</jvm-arg>
-->
<watchdog-arg>-Dcom.sun.management.jmxremote</watchdog-arg>
<memory-free-min>1M</memory-free-min><!-- 强制resin重起时的最小空闲内存 -->
<thread-max>256</thread-max><!-- 最大线程数量. -->
<socket-timeout>65s</socket-timeout><!-- 套接字等待时间 -->
<keepalive-max>128</keepalive-max><!-- 配置 keepalive -->
<keepalive-timeout>15s</keepalive-timeout>
</server-default> <!-- 定义群集服务器 -->
<server id="" address="127.0.0.1" port="6800"/>
<!-- Configures the persistent store for single-server or clustered 配置独立服务器或者群集的持久化存储,专业版的功能 -->
<resin:if test="${resin.isProfessional()}">
<persistent-store type="cluster">
<init path="session"/>
</persistent-store>
</resin:if> <!-- 为了安全, 你可以为SSL会话(SSL sessions)定义一个不同的cookie.
- <ssl-session-cookie>SSL_JSESSIONID</ssl-session-cookie>
--> <!-- 缓存启用 (专业版的功能) -->
<resin:if test="${isResinProfessional}">
<cache path="cache" memory-size="64M">
<!-- Vary header rewriting for IE -->
<rewrite-vary-as-private/>
</cache>
</resin:if> <!-- 启用周期性的服务器状态检查和死锁检查,所有的服务器可以添加 <url> 来检查。 -->
<resin:if test="${isResinProfessional}">
<ping>
<!-- <url>http://localhost:8080/test-ping.jsp</url> -->
</ping>
</resin:if> <!-- 包含web应用的默认行为 -->
<resin:import path="${resin.home}/conf/app-default.xml"/>
<!-- 每一个web应用的默认参数 -->
<<SPAN class=hilite1>web-app-default</SPAN>>
<!-- 扩展库的公共jar文件,扩展是安全的即使没有类装载器知道的jars,装载的类将为每个应用分别装载,也就是这些类都是不同的--> <class-loader>
<tree-loader path="${server.root}/ext-webapp"/>
</class-loader> <!-- 设置缓存页、静态也的延时值 -->
<cache-mapping url-pattern="/" expires="5s"/>
<cache-mapping url-pattern="*.gif" expires="60s"/>
<cache-mapping url-pattern="*.jpg" expires="60s"/>
<cache-mapping url-pattern="*.png" expires="60s"/>
<!-- 启用EL表达式 -->
<allow-servlet-el/> <!-- 安全原因, 默认禁用了会话的URLs -->
<session-config>
<enable-url-rewriting>false</enable-url-rewriting>
</session-config> <!-- 安全原因, 在cookies中设置HttpOnly标志
- <cookie-http-only/>
--> <!--一些JSP包有不正确的 .tld文件。可以把validate-taglib-schema设置成false,可能继续正常工作
- Some JSP packages have incorrect .tld files. It's possible to set validate-taglib-schema to false to work around these
packages.
--> <jsp>
<validate-taglib-schema>true</validate-taglib-schema>
<fast-jstl>true</fast-jstl>
<fast-jsf>true</fast-jsf>
</jsp>
</<SPAN class=hilite1>web-app-default</SPAN>> <!-- 简单的数据池配置[The JDBC name is java:comp/env/jdbc/mysql]-->
<database>
<jndi-name>jdbc/mysql</jndi-name>
<driver type="org.gjt.mm.mysql.Driver">
<url>jdbc:mysql://localhost:3306/test</url>
<user></user>
<password></password>
</driver>
<prepared-statement-cache-size>8</prepared-statement-cache-size>
<max-connections>20</max-connections>
<max-idle-time>30s</max-idle-time>
</database>
<!-- 定义所有虚拟主机的默认配置 -->
<host-default>
<!-- 如果和别的web服务器整合,这个可以被去掉,因为web服务器也可以记录这些信息。 -->
<access-log path="logs/access.log" format='%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"' rollover-period="1W"/> <!-- war 文件的布置目录 -->
<web-app-deploy path="webapps"/> <!-- ear文件的布置目录 -->
<ear-deploy path="deploy">
<ear-default>
<ejb-server>
<config-directory>WEB-INF</config-directory>
<data-source>jdbc/test</data-source>
</ejb-server>
</ear-default>
</ear-deploy> <!-- rar文件的布置目录 -->
<resource-deploy path="deploy"/>
</host-default>
<!-- 虚拟主机的布置目录 -->
<host-deploy path="hosts">
<host-default>
<resin:import path="host.xml" optional="true"/>
</host-default>
</host-deploy> <!-- 默认的虚拟主机配置 -->
<host id="" root-directory=".">
<!-- 配置默认的应用 webapp's ROOT -->
<web-app id="/" root-directory="webapps/ROOT"/>
<!-- 你的虚拟目录 -->
<web-app id="/justoneweb" root-directory="D:workjustonewebjavaweb"/>
<web-app id="/resin-admin" root-directory="${resin.home}/php/admin">
<!-- - 管理应用程序 /resin-admin
- password is the md5 hash of the password。md5码的密码。
- localhost is true to limit access to the localhost。localhost设置成true,这样只有localhost才能访问
-->
<prologue>
<resin:set var="resin_admin_user" value=""/>
<resin:set var="resin_admin_password" value=""/>
<resin:set var="resin_admin_external" value="false"/>
</prologue>
</web-app>
</host>
<host id="woke.tool.com" >
<web-app id="/" root-directory="E:resin-3.1.6deployWokeTool1.0" />
</host>
</cluster>
<!-- - Configuration for the web-tier/load-balancer -->
<resin:if test="${resin.isProfessional()}">
<cluster id="web-tier">
<server-default>
<!-- The http port -->
<http address="*" port="9080"/>
</server-default>
<server id="web-a" address="127.0.0.1" port="6700"/>
<cache path="cache" memory-size="64M"/>
<host id="">
<web-app id="/">
<rewrite-dispatch>
<load-balance regexp="" cluster="app-tier"/>
</rewrite-dispatch>
</web-app>
</host>
</cluster>
</resin:if>
</resin>
二、Resin 的 watchdog(看门狗)介绍
为了稳定和安全,Resin使用一个独立的watchdog进程来启动和监视Resin服务器。
watchdog连续你检测Resin服务器的状态,如果其没有反应或者迟钝,将会重启Resin服务器进程。
大多数情况下,watchdog从resin.xml中读取配置信息,而不需要其它的附加配置。
某些ISP服务商可能使用特别的配置,为了安全他们会配置watchdog来隔离JVM(Java虚拟主机)。
概述
因为watchdog作为一个服务运行,大多数情况下你根本不需要注意它。
标准的配置下,一个机器上的watchdog可以监视这个机器上所有JVM,因此大部分情况下你不需要修改watchdog的配置。
需要你管理watchdog的任务就是,如果机器发生了问题,停止watchdog,并检查 watchdog日志中Resin服务器的重启事件。
watchdog自动重启崩溃和退出的Resin服务。因此如果你想停止Resin,你需要告诉watchdog来停止Resin实例,或者完全停止watchdog。
使用resin.jar中的主程序(main)来控制watchdog,有用来启动、停止、重启Resin实例的命令,同样还有报告watchdog状态的命令。
大多数用户不需要特别的配置watchdog,但是ISP和大的站点可能创建特殊的watchdog.xml(包含<watchdog- manager>标签)来控制watchdog。
<watchdog-manager>允许ISP控制watchdog,为他们用户的 Resin实例指定附加的命令行参数,包括为他们的用户创建安全的chroot环境的能力。
典型地,watchdog以root帐号运行,然而用户实例使用他们各自的用户id。
命令行
resin.jar中的主类ResinBoot的命令行用来控制watchdog。主要的操作包括:start、stop、restart、shutdown和status。
start
"start"命令使用给定的server id启动一个新的Resin实例。ResinBoot首先会尝试在当前机器上的watchdog,在需要时会启动一个新的watchdog。
在resin.xml中定义的server id必须是惟一的。
例如: watchdog启动
resin-3.2.x> java -jar lib/resin.jar -conf conf/test.conf -server a start
Resin/3.2.x started -server 'a' for watchdog at 127.0.0.1:6700
stop
"stop"命令使用给定的server id停止Resin实例。如果停止的实例是watchdog管理的最后一个Resin实例,watchdog也会自动退出。
如果没有指定 -server 参数,watchdog使用默认的 -server "" 。
例子: watchdog停止
resin-3.2.x> java -jar lib/resin.jar stop
Resin/3.2.x started -server '' for watchdog at 127.0.0.1:6600
status
"status"命令统计被watchdog服务管理的Resin实例的状态。
例子: watchdog状态
resin-3.2.x> java -jar lib/resin.jar status
Resin/3.2.x status for watchdog at 127.0.0.1:6600
server '' : active
password: missing
user: ferg
root: /home/test/resin/
conf: /etc/resin/resin.xml
单一Resin实例
这个例子显示了一个单一服务器站点,其监听标准的HTTP端口80,并以resin这个用户身份运行。在这个例子中watchdog是以root用户身份运行的,
因此其能够绑定到特殊的端口80上,但是Resin实例是以resin身份运行的。
因为使用了默认的配置,watchdog监听6600端口来获取命令。
例子: /etc/resin/resin.xml
<resin xmlns="http://caucho.com/ns/resin">
<cluster id=""> <server id="app-a" address="127.0.0.1">
<user-name>resin</user-name>
<group-name>resin</group-name> <http port="80" />
</server> <resin:import path="${resin.home}/conf/app-default.xml" />
<host id="">
<web-app id="" path="/var/www/htdocs" />
</host> </cluster>
</resin>
在一个机器上使用共享的watchdog实现负载平衡
当在一个机器上运行多个Resin实例的时候,一个watchdog-manager就能管理所有的Resin实例。
指定server id用来决定那个Resin实例是start或者stop。
在这个例子中,有一个web-tier服务器做为负载平衡器,两个app-tier服务器处理后台数据,它们都在一个机器上。
为了维护和升级方便,一个站点可能需要多个app-rier服务器。当一个停机的时候,第二个服务器可以继续服务。
这个例子使用默认的watchdog配置,其读取的是标准的resin.xml文件。
watchdog进程和ResinBoot都读取resin.xml 配置文件,因此不需要特别的watchdog配置。
watchdog能够自动发现运行在这个机器上的多个Resin实例并管理它们。
例子: /etc/resin/resin.xml
<resin xmlns="http://caucho.com/ns/resin">
<cluster id="app-tier">
<server-default>
<user-name>resin</user-name>
<group-name>resin</group-name>
</server-default> <server id="app-a" address="192.168.1.10" port="6810" />
<server id="app-b" address="192.168.1.10" port="6811" /> <host id="">
<web-app id="" path="/var/www/htdocs" />
</host> </cluster>
<cluster id="web-tier">
<server-default>
<user-name>resin</user-name>
<group-name>resin</group-name>
</server-default> <server id="web-a" address="192.168.1.10" port="6800">
<http port="80" />
</server> <host id="">
<web-app id="">
<rewrite-redirect>
<load-balance regexp="" cluster="app-tier" />
</rewrite-redirect>
</web-app>
</host> </cluster>
</resin>
同一机器使用不同的watchdog来实现负载平衡
在某些情况下,最好让每个Resin实例有其自己的watchdog,例如当多个用户在使用相同的机器。每个<server>块配置一个<watchdog-port>。
因为watchdog将读取resin.xml使用<server>块匹配命令行参数中的 -server id,每个watchdog将启动期自己的端口。
例子: /etc/resin/resin.xml
<resin xmlns="http://caucho.com/ns/resin">
<cluster id="app-tier">
<server-default>
<user-name>resin</user-name>
<group-name>resin</group-name>
</server-default> <server id="app-a" address="192.168.1.10" port="6810">
<watchdog-port>6700</watchdog-port> <http port="8080" />
</server> <server id="app-b" address="192.168.1.10" port="6811">
<watchdog-port>6701</watchdog-port> <http port="8081" />
</server> <host id="">
<web-app id="" path="/var/www/htdocs" />
</host> </cluster>
</resin>
在上面的例子中,启动Resin, 使用 -server app-a参数将启动一个在端口6700上的watchdog,使用 -server app-b参数将启动一个在端口6701上的watchdog。
例子: starting app-b with watchdog-port=6701
resin-3.2.x> java -jar lib/resin.jar -server app-b start
ISP watchdog管理
在ISP的环境中,你可能需要为watchdog使用一个隔离的配置文件,它为不同的用户启动Resin实例。在这个情况下,你要确保watchdog.xml不能被这些普通用户读取,要创建一个管理用户来读取这个文件。
●启动和重启用户的Resin JVM
●设置JVM参数和Java可执行性
●设置Resin实例的root-directory
●setuid user-name 和 group-name
●设置resin.xml配置
●打开受保护的端口,例如80
●可选的chroot设置
watchdog将使用给定的帐号作为setuid来启动Resin实例。它也能打开任何需要的保护端口,例如80。
例子: /etc/resin/watchdog.xml
<resin xmlns="http://caucho.com/ns/resin">
<management>
<user name="harry" password="MD5HASH==" />
</management> <watchdog-manager>
<watchdog-default>
<jvm-arg>-Xmx256m</jvm-arg>
</watchdog-default> <watchdog id="user_1">
<user-name>user_1</user-name>
<group-name>group_1</group-name> <resin-xml>/home/user_1/conf/resin.xml</resin-conf>
<resin-root>/home/user_1/www</resin-root> <open-port address="192.168.1.10" port="80" />
</watchdog> ...
<watchdog id="user_n">
<user-name>user_n</user-name>
<group-name>group_n</group-name> <resin-conf>/home/user_n/conf/resin.xml</resin-conf>
<resin-root>/home/user_n/www</resin-root> <open-port address="192.168.1.240" port="80" />
</watchdog> </watchdog-manager>
</resin>