1. 安装jdk7与resin4
jdk7安装方式与6相同,解压并配置环境变量即可。
resin4与resin3略有区别,解压之后需要编译安装。
./configure --prefix=/opt/hermes/resin-4.0.40 --with-java-home=/opt/hermes/jdk1.7.0_67/ --enable-64bit
make
makeinstall
编译安装可避免出现以下错误:
Unable to find native library 'resin_os' for com.caucho.loader.ClassEntry. Resin expects to find this library in:
环境变量配置如下:
2. 简单配置resin
resin.xml配置如下,裁剪了冗余的原配置:
<!--
- Resin 4.0 configuration file.
-->
<resin xmlns="http://caucho.com/ns/resin"
xmlns:resin="urn:java:com.caucho.resin">
<!-- property-based Resin configuration -->
<resin:properties path="${__DIR__}/resin.properties" optional="true"/>
<resin:properties path="cloud:/resin.properties"
optional="true" recover="true"/>
<resin:if test="${properties_import_url}">
<resin:properties path="${properties_import_url}"
optional="true" recover="true"/>
</resin:if>
<log-handler name="" level="all" path="log/wapmail_handler.log" timestamp="[%y-%m-%d %H:%M:%S.%s]" rollover-period="1D"/>
<stdout-log path="log/stdout.log" rollover-period="1D" timestamp="[%H:%M:%S.%s] "/>
<!-- resin4的原始日志没有区分stdout和stderr 需要我们自己补充配置-->
<!-- rollover-period="1D" 表示1天汇总一个日志文件 也可配置为1H-->
<stderr-log path="log/stderr.log" rollover-period="1D" timestamp="[%H:%M:%S.%s] "/>
<logger name="" level="${log_level?:'info'}"/>
<logger name="com.caucho.java" level="config"/>
<logger name="com.caucho.loader" level="config"/>
<resin:import path="${__DIR__}/cluster-default.xml"/>
<cluster-system-key>${cluster_system_key}</cluster-system-key>
<dependency-check-interval>${dependency_check_interval?:'2s'}</dependency-check-interval>
<home-cluster>${home_cluster}</home-cluster>
<home-server>${home_server}</home-server>
<elastic-server>${elastic_server}</elastic-server>
<elastic-dns>${elastic_dns}</elastic-dns>
<pre name="code" class="html"><!-- 服务配置 -->
<cluster id="app">
<!-- JVM参数 -->
<server-default>
<!-- 服务器模式 -->
<jvm-arg>-server</jvm-arg>
<!-- JMX监控配置 -->
<jvm-arg>-Djava.rmi.server.hostname=10.64.78.78</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.port=50000</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.ssl=false</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.authenticate=true</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.password.file=${resin.root}/conf/jmxremote.password</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.access.file=${resin.root}/conf/jmxremote.access</jvm-arg>
<!-- JXM监控配置end -->
<!-- 性能参数 -->
<jvm-arg>-XX:+UnlockExperimentalVMOptions</jvm-arg>
<jvm-arg>-XX:+UseG1GC</jvm-arg>
<jvm-arg>-XX:MaxGCPauseMillis=50</jvm-arg>
<jvm-arg>-XX:GCPauseIntervalMillis=200</jvm-arg>
<jvm-arg>-XX:SurvivorRatio=6</jvm-arg>
<jvm-arg>-Xmx2048m</jvm-arg>
<jvm-arg>-Xms2048m</jvm-arg>
<jvm-arg>-Xss1m</jvm-arg>
<jvm-arg>-XX:MaxPermSize=512m</jvm-arg>
<jvm-arg>-Xloggc:${resin.root}/log/jdk_gc.log</jvm-arg>
<!-- 性能参数 end -->
</server-default>
<!--此cluster监控端口号位6800 -->
<server-multi id-prefix="app-" address-list="${app_servers}" port="6800"/>
<!-- 配置服务 -->
<host id="wapmail3.XXX.cn" root-directory=".">
<!-- access log 配置 -->
<access-log path-format='log/access.log.%Y%m%d%H'>
<rollover-period>1h</rollover-period>
</access-log>
<web-app id="/" root-directory="webapps/ROOT">
<!-- / 根目录下放着全局404页面 -->
<error-page error-code="404" location="/404.html"/>
<form-parameter-max>${form_parameter_max?:100}</form-parameter-max>
</web-app>
<web-app id="/wap2" root-directory="webapps/wap2"> <!-- 应用 -->
<form-parameter-max>${form_parameter_max?:100}</form-parameter-max>
<!--form-parameter-max 用来限制每次post submit的参数个数,避免hash collision dos -->
</web-app>
</host>
</cluster>
</resin>
修改 resin.properties :
web_admin_enable : false #生产机不需要web管理界面
session_store : false (每个服务器是一个集群,不需要考虑session 持久化)
resin_doc : false #生产机不需要resin doc
dev_mode:false #生产机开发者模式
在resin.properties添加:
form_parameter_max:100 #hash dos protection
修改cluster-default.xml
注释:
<!--
<port-default>
<port-thread-max>${port_thread_max}</port-thread-max>
<accept-thread-min>${accept_thread_min}</accept-thread-min>
<accept-thread-max>${accept_thread_max}</accept-thread-max>
<tcp-cork>${tcp_cork}</tcp-cork>
</port-default>
-->
port_thread_max: 每个端口最多可以有的活跃线程数,避免系统负载压力过大。这些参数目前不需要。以上参考:http://www.linuxidc.com/Linux/2012-04/58192.htm
3.配置多个独立端口的应用
resin4支持配置多个独立端口的应用。在resin.xml中一个cluster就代表一个端口应用,每个应用占用一个HTTP端口以及一个Server监控端口,可以独立启动停止。
假设有两个应用,我们事先分配好端口分别是:
Web1:8081(http),6801(监控)
Web2:8082(http),6802(监控)
下面是详细的配置:
- <resin xmlns=http://caucho.com/ns/resin
- xmlns:resin=http://caucho.com/ns/resin/core>
- <log name="" level="info" path="stdout:"/>
- <cluster id="web1">
- <server-default>
- <jvm-arg>-Xmx1024m</jvm-arg>
- <jvm-arg>-Xss1m</jvm-arg>
- <jvm-arg>-server</jvm-arg>
- </server-default>
- <resin:import path="${resin.home}/conf/app-default.xml"/>
- <server id="web1" port="6801">
- <http id="" port="8081"/>
- </server>
- <host id="" root-directory=".">
- <web-app id="/" root-directory="D:/WORKDIR/web1" redeploy-mode="manual"/>
- </host>
- </cluster>
- <cluster id="web2">
- <server-default>
- <jvm-arg>-Xmx1024m</jvm-arg>
- <jvm-arg>-Xss1m</jvm-arg>
- <jvm-arg>-server</jvm-arg>
- </server-default>
- <resin:import path="${resin.home}/conf/app-default.xml"/>
- <server id="web2" port="6802">
- <http id="" port="8082"/>
- </server>
- <host id="" root-directory=".">
- <web-app id="/" root-directory="D:/WORKDIR/web2/webapp" redeploy-mode="manual"/>
- </host>
- </cluster>
- </resin>
上面的配置中,我们为每个应用分配一个唯一的 server id,分别是 web1 和 web2
要启动这两个应用,命令是
./resin.sh start -server web1
./resin.sh start -server web2
停止以及重启应用的方式也是一样。
4. 配置jmx远程监控
jmxremote.access和jmxremote.password文件可以在JDK的jre\lib\management目录下找到。copy到{resin_home}/conf/下。
jmxremote.access包含了登录用户的权限控制信息,jmxremote.password包含了用户名和登录密码信息,配置非常简单。
jmxremote.password文件需要进行文件系统的访问权限设置,设置为只有owner可读,否则会抛出错误信息:
错误: 必须限制口令文件读取访问: XXX
解决办法是修改jmx权限文件的访问权限:chmod 644 jmxremote.access jmxremote.password
完成一系列的配置之后,可以在jconsole或visualVM中远程监控服务的运行。在环境刚搭建时,启用监控可了解应用在新环境的运行状况。