[TOC]

0x00 快速入门

描述:Resin是CAUCHO公司(http://www.caucho.com/)的产品,是一个非常流行的应用服务器支持servlets 和jsp的引擎,速度非常快。
官网介绍:“Resin的动态扩展和集群消除了停机时间,无需重大代码更改”,从单个服务器扩展到数百万用户,没有外部依赖关系

Resin特性:

  • 支持HTTP/1.1的WEB服务器
  • 支持显示动态内容和静态内容(能力强解析速度快)
  • 扩展性好能和其他WEB服务器一起工作(比如Apache server和IIS等);
  • Resin支持Servlets 2.3标准和JSP 1.2标准(用Resin来进行JSP编程是很容易)
  • Resin支持负载平衡(Load balancing),可以增加WEB站点的可靠性,方法是增加服务器的数量。比如一台SERVER的错误率是1%的话,那么支持负载平衡的两个Resin服务器就可以使错误率降到0.01%。
  • 跨平台性:可以在 Windows / Linux 上面安装使用

Resin的两个版本区别:

  • Resin 4.0 免费 : 普通版本独立作为web服务器性能就要差一些,可以使用 apache+resin 借助apache的缓存功能提高性能;
  • Resin Pro 4.0 收费 : 强大的cache功能支持缓存和负载均衡;

官网下载: https://caucho.com/products/resin/download


0x01 Resin安装

通用环境依赖说明:

Resin: 4.0.62
jDK: >= 6+ (这里选择JDK8)

Windows安装环境

#Step1.安装JDK8并添加到环境变量
运行jdk-8u181-windows64.exe进行安装即可(默认路径)
>setx /M JAVA_HOME "C:\Program Files\Java\jdk1.8.0_181"
成功: 指定的值已得到保存。
>setx /M PATH "%PATH%;%JAVA_HOME%\bin;%JAVA_HOME%\jre;"
成功: 指定的值已得到保存。
#重新打开一个cmd.exe执行验证
C:\Users\Administrator\Desktop>java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)


#Step2.解压Resin包到项目目录中,并将其根路径加入到环境变量之中;
C:\Users\Administrator>setx /M RESIN_HOME "C:\resin-4.0.62"
成功: 指定的值已得到保存。

#step3.运行Resin包的安装程序 (注意需要.NET3.5支持) 根据需求选择 setup.exe 安装程序
运行resin.exe或者在命令中执行 run java -jar lib/resin.jar start。
#在下面的框框中可以重启或者停止(直接点击start/stop)

WeiyiGeek.启动Resin

Step4.访问 http://localhost:8080/ 页面说明安装成功
WeiyiGeek.验证安装成功

Step5.点击/resin-admin 创建认证文件访问 http://localhost:8080/resin-admin/

#提交后的返回的信息
1.To add the admin user, copy and paste the following into c:\resin-4.0.62\conf/resin.properties: (将以下配置加入resin.propertie中)
admin_user : admin
admin_password : {SSHA}6c3j7qekfBfEWQL9uD6wiasV9oCz3BGG
#当然您也可以采用Use "resinctl generate-password" and copy/paste here to set the admin生成

2.默认是只允许localhost访问,当您设置下面的参数后将所有机器都能访问后台页面(注意防火墙的影响) add to c:\resin-4.0.62\conf/resin.properties:
admin_external : true
admin_secure : true
Or modify directly c:\resin-4.0.62\conf\resin.xml:
<resin:set var="resin_admin_external" value="true"/>

WeiyiGeek.

Step6.设置好之后便可以进行登录(采用外网机器登录)
WeiyiGeek.

Step7.简单的介绍一哈war部署

#方式1把war文件放进resin目录中的webapps下,然后resin自动解压,这样虽然可以但是可能会遇到很多问题,就比如运行的时候找不到js文件了,报404,又或者找不到配置的文件或者action。

#方式2:在resin目录中的conf中的resin.conf,这个文件是resin自带的,打开这个文件,拉到底下找到<web-app>这个标签,然后把原本的<web-app id="/" root-directory="">注释掉,添加下面一句
<web-app id="/" document-directory="D:\test\**" archive-path="D:\test\**.war"/>

#方式3:通过resin-admin后台进行部署(注意需要开启ssl)
Actions can only be performed on a local server and over a secure connection (SSL)." Try https://192.168.17.129:8443/resin-admin/index.php?q=deploy&s=0

访问网站:https://192.168.17.129:8443/Demo-1.1.0/
Hello World!WeiyiGeek

WeiyiGeek.

注意事项:

  • 启动的时候检查默认的8080端口是否被占用;

0x02 Resin配置文件

resin-4.0.x 配置文件结构:

配置属性 :  --conf/resin.properties
配置文件 : --conf/resin.xml
openSSL密钥 : --conf/keys/

许可信息文件 : --conf/licenses/
部署服务器路径 : --webapps/
resin日志文件 : --logs/

配置文件conf/resin.properties说明:

# resin.properties - 配置变量值
# See resin.xml, cluster-default.xml, and health.xml for full configuration.
# Any variable defined by ${...} can be set as a property in this file.
#
# Individual server overrides can be specified by prepending the server.id.
# 日志记录等级
# log_level : info
# app-0.log_level : finest
#
# 与Resin XML配置类似,修改此文件将触发重启。
# General log level (modify resin.xml for more granular log level adjustments)
# log_level : finer

# 启用详细的浏览器错误报告(业务上线时候不建议)
dev_mode : true

# resin多久检查一次更新的文件。
# dependency_check_interval : 5m

# Enable /resin-doc Resin documentation
resin_doc : true
resin_doc_host :

# List Triad server ip-addresses:hmux-port for each tier, space separated
#应用服务设置
# App tier Triad servers must be listed to enable web-tier to
# app-tier load-balancing

# web-tier Triad servers: web-0 web-1 web-2
# web_servers : 127.0.0.1:6810

# app-tier Triad servers: app-0 app-1 app-2
app_servers : 127.0.0.1:6800

# 允许弹性节点加入集群(支持云模式)
# elastic_cloud_enable : true

# 弹性节点应该连接的集群——每个节点都将连接一个三元组服务器
# Use a separate resin.properties file for each cluster
home_cluster : app

# 用于弹性服务器在home_cluster中加入集群
# elastic_server : true

# 为每个服务器创建一个不同的webapps/目录,用于垂直扩展
# elastic_webapp : true

# 用于具有动态IP地址的云服务器,其中服务器启动后为服务器分配DNS名称。resin会重试开始。
# elastic_dns : true

#指定配置文件中的——server
# home_server : app-0

# Set HTTP and HTTPS bind address
# http_address : *

# Set HTTP and HTTPS ports.
# http - default for all clusters and servers
# app.http - default for all servers in cluster 'app'
# app-0.http - for server 'app-0' only
# http : 8080

app.http : 8080
# app.https : 8443

web.http : 8080
# web.https : 8443

# 为了安全起见,Resin可以在绑定到端口80后切换到非root用户
setuid_user :
setuid_group :

# Arg直接传递到JVM
# jvm_args : -Xmx2048m -XX:MaxPermSize=256m
# jvm_mode : -server

# 这个类路径比默认类路径具有优先级,就像您希望使用Hibernate的JPA这样的第三方库时一样
# jvm_classpath :

# 本地url供看门狗检查,以确保服务器已启动,空间分隔
# http_ping_urls : http://127.0.0.1/test.jsp

# 为端口控制活动线程的数量
port_thread_max : 256
accept_thread_max : 32
accept_thread_min : 4
# keepalive_max : 512

# Enable JNI TCP speed optimizations
tcp_cork : true
sendfile : true
keepalive_select_enable : true

# OpenSSL证书配置密钥通常存储在resin配置目录中。
# openssl_file : keys/test.crt
# openssl_key : keys/test.key
# openssl_chain_file : keys/test.ca
# openssl_password : changeme
# openssl_protocol : -sslv2 -sslv3
# openssl_cipher_suite :

# JSSE证书配置密钥通常存储在resin配置目录中。
# jsse_keystore_type : jks
# jsse_keystore_file : /etc/resin/keys/server.keystore
# jsse_keystore_password : changeme

# In absence of a signed certificate, Resin will fallback to using a
# self-signed development certificate if HTTPS is enabled

# 启用代理缓存——用于缓存内存中的静态内容
proxy_cache_enable : true

# Sets the proxy cache memory size
# proxy_cache_size : 256m

# 启用集群持久会话(用于故障转移)
session_store : false

# disable the quercus *.php mapping when using Apache for PHP
# quercus_disable : true

# 使用数字后缀命名的web应用程序,例如foo-10.0。战争和可以浏览
# # / foo。当web应用程序的新版本被部署时,Resin会继续
# 将活动会话请求路由到以前的web应用程序版本
# #新会话将转到新版本,因此用户不会意识到
# #应用程序升级。
# webapp_multiversion_routing : true

# Set the email address to receive weekly and restart PDF reports
# email : [email protected]
pdf_summary : true

# 启用远程管理(对于远程CLI和EC2 ext: triad discovery)
# remote_admin_enable : true

# Enable /resin-admin web administration console
web_admin_enable : true
web_admin_host :

#允许访问/树脂管理从非本地网络ip地址
# web_admin_external : true
# 要求HTTPS访问/树脂管理
# web_admin_ssl : true

# 启用Resin REST Admin
# rest_admin_enable : true

# REST管理需要SSL
# rest_admin_ssl : true

# 健康检查禁用
# health_disable : true
# health_log_level : off

# 访问/树脂管理和远程CLI是密码限制。
# Use "resinctl generate-password" and copy/paste here to set the admin
# admin_user : admin
# admin_password : {SSHA}xxxxxxxx

# 允许读取EC2用户数据作为树脂属性
# properties_import_url : http://169.254.169.254/latest/user-data

常规配置配置文件 conf/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:if test="${properties_import_url}">
<resin:properties path="${properties_import_url}" optional="true" recover="true"/>
</resin:if>

<!-- JDK日志API的日志配置 -->
<log-handler name="" level="all" path="stdout:"
timestamp="[%y-%m-%d %H:%M:%S.%s]"
format=" {${thread}} ${log.message}"/>

<!--
- Alternative pseudo-TTCC log format
- <log-handler name="" level="all" path="stdout:"
- timestamp="%y-%m-%d %H:%M:%S.%s"
- format=" [${thread}] ${log.level} ${log.shortName} - ${log.message}"/>
-->

<!--
- level='info' for production
- 'fine' or 'finer' for development and troubleshooting
- 日志信息级别:info生产环境 fine和finer适合开发环境和调试环境
-->
<logger name="" level="${log_level?:'info'}"/>
<logger name="com.caucho.java" level="config"/>
<logger name="com.caucho.loader" level="config"/>

<!--
- Default configuration applied to all clusters, including
- HTTP, HTTPS, and /resin-admin configuration.
-->
<resin:import path="${__DIR__}/cluster-default.xml"/>

<!--
- health configuration
-->
<resin:import path="${__DIR__}/health.xml"/>


<!--
- Remote management requires at least one enabled admin user.
-->
<resin:AdminAuthenticator>
<user name="${admin_user}" password="${admin_password}"/>

<resin:import path="${__DIR__}/admin-users.xml" optional="true"/>
</resin:AdminAuthenticator>

<!---对于集群系统,请在cluster_system_key中创建密码-->
<cluster-system-key>${cluster_system_key}</cluster-system-key>

<!--
- 环境依赖检查时间生产系统设置长点,600s 10分钟(不用修改文件后手动重启)
- 检测会非常耗时搞resin优化的话,那么就把它设置的长一些,生产环境中干脆设置为-1禁止自动检测变更;
-->
<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>

<!--- JSSE default properties-->
<system-property
jdk.tls.ephemeralDHKeySize="2048"
jdk.tls.rejectClientInitiatedRenegotiation="true"
sun.security.ssl.allowUnsafeRenegotiation="false"
sun.security.ssl.allowLegacyHelloMessages="false"/>

<!--- 配置主应用程序集群。负载均衡配置也将有一个web集群。-->
<cluster id="app">
<!-- define the servers in the cluster -->
<server-multi id-prefix="app-" address-list="${app_servers}" port="6800"/>

<host-default>
<!-- 为.war扩展创建webapps目录 -->
<web-app-deploy path="webapps"
expand-preserve-fileset="WEB-INF/work/**"
multiversion-routing="${webapp_multiversion_routing}"
path-suffix="${elastic_webapp?resin.id:''}"/>
</host-default>
<!--
Sets the default character encoding to utf-8 <character-encoding>utf-8</character-encoding> (默认字符集为 utf-8 )
-->
<!-- 在hosts/foo.example.com/webapps中自动部署虚拟主机 -->
<host-deploy path="hosts">
<host-default>
<resin:import path="host.xml" optional="true"/>
</host-default>
</host-deploy>

<!-- 默认主机,匹配任何主机名 -->
<host id="" root-directory=".">
<!--- web应用程序可以在resin.xml中重写/扩展 可以解压war-->
<web-app id="/" root-directory="webapps/ROOT"/>
</host>

<resin:if test="${resin_doc}">
<host id="${resin_doc_host}" root-directory="${resin_doc_host}">
<web-app id="/resin-doc" root-directory="${resin.root}/doc/resin-doc"/>
</host>
</resin:if>
</cluster>

<cluster id="web">
<!-- 定义集群中的服务器 -->
<server-multi id-prefix="web-" address-list="${web_servers}" port="6810"/>
<host id="" root-directory="web">
<web-app id="">
<resin:LoadBalance regexp="" cluster="app"/>
</web-app>
</host>
</cluster>

</resin>


0x03 Resin应用

描述:Resion主要应用就是部署和发布我们的JSP应用;

Resin发布应用
Resin发布应用其实和Tomcat几乎一模一样有两种方式:

  • Resin目录发布
  • War发布

0x04 Security

描述:对于Resin服务进行安全配置加固;

Resin 4.x版本

#1.外部主机不能访问配置登录(实际生产环境中建议不要让外网访问后台)
vim /conf/resin.properties
#admin_external : true
#admin_secure : true
#或者
vim /conf/resin.xml
<!-- <resin:set var="resin_admin_external" value="true"/> -->


#2.应为不同的用户分配不同的resin帐户,不允许不同用户间共享resint帐户(删除无关的用户)
#应要求 resin 管理帐户口令长度至少 8 位,且为数字、字母和特殊符号
#口令格式如:It#[email protected]!、Test$6y&y0u等
cat /resin/resin-pro-4.0.48/conf/admin-users.xml


#3.禁用管理控制台/停止/限定resin-doc和resin-admin
#禁止非本地用户访问
resin_doc:true
resin_doc_host:127.0.0.1
#禁用管理控制台
web_admin_enable : false
web_admin_host : false
#删除默认页面
%resin%/webapps/ROOT/index.jsp
%resin%/doc/resin-doc
%resin%/doc/resin-admin


#4.Resin应用执行权限(低权限用户运行)
/usr/sbin/groupadd resin
/usr/sbin/useradd -g resin resin -s /sbin/nologin
#%resin%/conf/resin.properties 修改 resin 配置文件中的配置项,确保 setuid_user 和 setuid_group 的值不为 root 修改如下字段:
setuid_user : resin
setuid_group :resin
#注: resin 为 非 root 权限用户,Windows下面执行采用resin用户即可
runas /user:resin "cmd.exe cmd/k F:\resin11\httpd.exe "-Xms512M" "-Xmx1024M" "


#5.更改Resin默认端口 resin.properties ;
app.http  : 8080 
web.http  : 8080
# 适用于 HTTPS 站点的参数
# app.https : 8443
# web.https : 8443
# openssl_file : keys/test.crt
# openssl_key : keys/test.key
# openssl_password : changeme


#6.隐藏版本信息
Resin的版本信息被写死在了代码之中,无法通过配置文件来进行控制,修改方法如下:

第一步:找到下列文件,将所有文件解压缩到一个目录中(例如:xxx)。
%RESIN_HOME%/lib/resin.jar
%RESIN_HOME%/lib/pro.jar(适用于Pro版本)

第二步:找到下列文件:
xxx/com/caucho/Version.class
xxx/com/caucho/ProVersion.class(适用于Pro版本)

用JD-GUI反编译版本上述文件,得到Version.java或ProVersion.java(适用于Pro版本)
注意:如果导出文件内容为空,可直接从JD-GUI中复制出代码创建这个文件

第三步:根据需要修改Version.java/ProVersion.java文件中的VERSION、FULL_VERSION和VERSION_DATA参数的值(建议直接删除小版本号),修改完成后用下面的命令重新编译为class文件
javac Version.java
javac ProVersion.java(适用于Pro版本)

第四步:然后重新打包
将编译得到的class文件复制到原位置覆盖就文件,然后使用下面的命令重新打包:

jar cfm resin.jar xxx/META-INF/MANIFEST.MF -C xxx/ .
jar cfm pro.jar xxx/META-INF/MANIFEST.MF -C xxx/ . (适用于Pro版本)

第五步:停止Resin,用新生成的jar文件覆盖原文件(建议在覆盖前先备份原文件)后重启Resin。


#7.管理目录安全应通过限制 ip 对管理目录的访问
进入目录 %resin% / doc / resin-doc / WEB-INF
使用命令“ vi resin-web.xml ”修改如下字段:
<resin:if test="${! resin_admin_external}">
<resin:IfNetwork>
<value>127.0.0.1</value>
<value>192.168.0.0/16</value>
<value>[::1]</value>
</resin:IfNetwork>
</resin:if>


#8.应开启日志记录
cat %resin% /conf/resin.xml 配置文件确保 level 值不为 Off
<log-handler name="" level="all" path="stdout:" timestamp="[%y-%m-%d %H:%M:%S.%s]"
format=" {${thread}} ${log.message}"/>

#9.应关闭开发模式
vi %resin%/conf/resin.properties将resin.properties配置文件中的
dev_mode: true #注释掉


Resin 3.x 版本

#1.隐藏Resin响应头中的Server头
#resin.conf增加<server-header>节点
<cluster id="app-tier">
<!-- sets the content root for the cluster, relative to server.root -->
<root-directory>.</root-directory>
<server-header>Foo/1.0</server-header>
<server-default>


#2.Resin可以配置3种error-page:
#404错误也就是文件找不到错误页;Exception违例页;不能连接java引擎页
<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>


#3.生产环境日志设置
<!-- -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"/>


0xHelp