上一主题: JBOSS、JBOSS64:JBoss 应用服务器

下一主题: Web 服务器组件

ROR: Ruby-on-Rails 应用服务器

Ruby-on-Rails 应用服务器

概览

目录

系统

类别

应用服务器

用户卷

yes

最小 内存

160 MB

操作系统

Linux

约束

no

功能概述

ROR 是基于 Ruby 和 Ruby-on-Rails Web 框架的 Web 服务器组件。 Ruby-on-Rails 的主要文档位于 http://wiki.rubyonrails.org。 使用 Ruby-on-rails,您可以通过使约定优先于配置来编写漂亮的代码。 Ruby-on-rails 可以充当单机 Web 服务器或应用服务器。

ROR 提供静态 Web 内容,并从用户可配置的内容卷自动部署 Web 应用。 文档路径是可配置的,这样同一个卷可在多个 Web 服务器和/或其他组件之间共享,从而处理不同的内容。

ROR 可以在两种不同模式下操作:Apache/mod_passenger 或 Apache/mongrel_cluster。 两个 Rails 后端各有其优点,因此,Phusion Passenger 为 Rails 应用和热重新部署功能提供了极高的性能,但是 Mongrel 具有有利于自身的久经考验的生产稳定性。

与 WEBx 服务器一样,ROR 有三个通用输出终端,用于从内容卷上的脚本访问外部服务。 db 终端用于访问各种数据库;fs 终端用于访问共享文件存储(使用 NFS);aux 终端是为了将电子邮件发送到 SMTP 服务器而创建的。

应使用 log 终端将 ROR 连接到 ROR 可以存储日志文件的共享文件系统。

服务器的配置是使用各种属性定义的。 这些属性旨在以易于配置的方式涵盖最多的用法变体,大多数情况下只有几个属性需要设置为非默认值。

名称

最新版本

操作系统

Ruby 版本

Ruby-on-Rails 版本

Phusion Passenger

Mongrel/Mongrel_Cluster

ROR

1.1.4-1

CentOS 5.5

Ruby 1.8.6

2.3.4

2.2.11

1.1.5/1.0.5

边界

资源

资源

最小值

最大值

默认值

CPU

0.1

16

0.3

内存

160 MB

32G

512 MB

带宽

1 Mbps

2 Gbps

250 Mbps

注意:应基于 ROR 的预期负载和已部署应用的内存要求来配置内存量。

终端

名称

方向

协议

说明

in

in

HTTP

为 Web 客户端发出的 HTTP 请求提供服务。 支持 HTTP/1.1 和 HTTP/1.0。

db

out

Any

访问数据库服务器。 用法由驻留在内容卷上的任何脚本(如果有)定义。 如果未使用该终端,则可将其保持未连接状态。

fs

out

NFS

访问用于共享文件存储的网络文件系统,在 NFS 上提供读/写文件访问权限。 用法由驻留在内容卷上的任何脚本(如果有)定义。 内容卷上的软件将已挂接的远程文件系统“视为”组件文件系统空间中的 /mnt/fs。 如果未使用该终端,则可将其保持未连接状态。 连接的服务器必须具有一个通过 NFS 导出的、名为 /mnt/data 的读/写共享。

log

out

CIFS

访问用于存储访问和错误日志的基于 CIFS 的网络文件系统。 如果未使用该终端,则可将其保持未连接状态。 连接的服务器必须允许匿名登录并具有一个导出的、名为 share 的读/写共享。

aux

out

Any

访问 SMTP 服务器以发送传出的电子邮件。
如果未使用该终端,则可将其保持未连接状态。

net

out

Any

用于子网访问的网关输出。
如果未使用该终端,则可将其保持未连接状态。

mon

out

CCE

向 MON 组件发送性能和资源使用情况统计信息。
如果未使用该终端,则可将其保持未连接状态。

默认接口已启用。 它用于诊断和故障排除(通过 SSH)。 此组件的未来版本可能会禁用 SSH 访问。

用户卷

说明

目录

用于存储 Rails 应用和应用数据的只读卷或读/写卷。 仅在 content_on_fs 属性设置为 off 时才使用此卷。

属性

属性名

类型

说明

hostname

字符串

网站的主机名。 默认值:localhost

admin_email

字符串

服务器管理员的电子邮件地址。 ROR 使用此名称在自动生成的页面中显示它。 默认值:root@localhost

app_base

字符串

文档的根目录。 Rails 应用根目录的典型结构应当在该文件夹中创建(app/、config/、db/、doc/、lib/、log/、public/、script/ 等)。 如果 app_base 设置为空字符串,则使用内容卷的根目录。 此目录必须在内容卷上预先存在。 默认值:(空)

content_on_fs

字符串

指定内容是相对于 fs 终端上的文件系统还是位于内容卷上。 默认值:off(在内容卷上)

ror_backend

字符串

启用或禁用 Apache/Mongrel_Cluster 或 Apache/Passenger 模式。 如果 ror_backend 设置为 Mongel_Cluster,则 Mongel_Cluster 后端将代替 Phusion Passenger 来处理 ROR 应用。 默认值:passenger

ror_mode

字符串

ROR 操作模式。 影响日志记录、数据库选择和其他环境选项。 值为:production、development。 默认值:production

ror_port

整数

ROR Web 服务器侦听传入的 HTTP 请求的端口。 默认值:80

时区

字符串

指定在组件中使用的时区。 如果此属性为空,则时区未经修改且保持原样。 此处提供可支持时区的列表。 默认值:(空)

高级 ROR 属性

这些是通常不需要配置的附加属性。 它们可用于在非标准环境中调整 ROR。

属性名

类型

说明

ror_instances_per_app

整数

对于单个应用可以同时处于活动状态的最大应用实例数。 值为 0 意味着对单个应用可使用的实例数没有限制,也就是说,只实施 ror_rails_max_pool_size 的全局限制(仅限“Phusion Passenger”模式;在“Mongrel”模式下 0 等于 2)。 默认值:0

ror_rails_use_global_queue

字符串

启用或禁用全局排队。 如果禁用全局排队,则 Phusion Passenger 将使用公平的负载均衡。 默认值:off

ror_rails_high_performance

字符串

默认情况下,Phusion Passenger 与 mod_rewrite 及其他大多数 Apache 模块兼容。 但是,使其兼容需要做很多工作。 如果将 ror_rails_high_performance 设置为 on,则 Phusion Passenger 会运行得快一点,但又会减小与其他 Apache 模块的兼容性。 默认值:off

ror_rails_max_pool_size

整数

可同时处于活动状态的最大 Ruby on Rails 或 Rack 应用实例数。 更大的数目将会导致更高的内存使用情况,但改进的功能可处理并发 HTTP 客户端。 仅在 Passenger 模式下有效。 默认值:6

ror_rails_max_requests

整数

应用实例将处理的最大请求数。 在处理那么多请求之后,将关闭应用实例并且 Phusion Passenger 会将其重新启动。 值为 0 意味着没有最大值:应用实例会因达到其空闲超时而被关闭。 如果您的应用正在泄漏内存,则此选项很有用。 在一定数量的请求之后通过将其关闭,可确保操作系统释放其所有内存。 仅在 Passenger 模式下有效。 默认值:0

ror_mongrel_start_port

整数

mongrel_cluster 使用的端口范围内的起始端口号。 默认值:3000

高级 Apache 属性

这些是通常不需要配置的附加属性。 它们可用于在非标准情况下调整 ROR。

属性名

类型

说明

max_connections

整数

允许的最大并发连接数。 在达到此数目时,仍会接受新连接,但是其处理会延迟,直到另一个连接关闭。 max_connections 值不能设置为大于 256。
默认值:128

persistent_connections

字符串

控制 ROR 是否允许客户端在同一连接中请求多个文档。 允许的值为 on 和 off。 仅当不正确支持 HTTP/1.1 又不使用 HTTP/1.0 的客户端出现问题时,才可能需要禁用永久连接。 默认值:on

idle_timeout_sec

整数

没有请求或响应通过时使客户端连接保持打开状态所用的超时(秒)。 仅当 persistent_connections 为 on 时,才使用此属性。 将此超时设置得较短可帮助快速丢弃长时间不活动的连接。 默认值:15

data_timeout_sec

整数

数据传输已开始但未完成时接收或发送更多数据所用的超时(秒)。 具有此超时允许 ROR 丢弃被忘记的连接,同时在传输期间仍允许延迟。 默认值:300

info_level

字符串

控制 ROR 向 Web 客户端(在 HTTP 响应和自动生成的页面中)透露的有关自身的信息量。 允许的值为 full(最多信息)、os、minor、major、prod(最少信息)。 作为安全措施,建议您透露最少信息。 默认值为 prod

日志记录属性

属性名

类型

说明

logs_enabled

字符串

完全启用或禁用日志记录。 默认值:off

logs_base_dir

字符串

存储 ROR 日志的目录。 如果 logs_enabled 设置为 off,则此属性不起作用。 默认值:/

error_log_filename

字符串

错误日志的文件名,相对于 log 终端上可以访问的文件系统。 该名称可能包括目录名称。 有关示例,请参阅 access_log_filename。 如果此属性设置为空值,或 logs_enabled 设置为 off,则将错误日志写入 ROR 实例本身的根文件系统上的文件中。 如果 logs_enabled 设置为 off,则此属性不起作用。 默认值:(空)

error_log_level

字符串

要写入错误日志的消息的重要级别。 允许的值为 debug、info、notice、warn、error、crit、alert 和 emerg。 debug 写入的消息最多,emerg 只写入紧急消息。 默认值:warn

access_log_filename

字符串

访问日志的文件名,相对于 log 终端上可以访问的文件系统。 例如:access_log。 该名称可能包括目录名称,例如:/srv1_logs/access_log 或 /logs/srv1_access_log。 如果为空,则表明未创建访问日志。 如果这些目录不存在,则会被创建。 如果 logs_enabled 设置为 off,则此属性不起作用。 默认值:(空)

注意:

如果需要安装额外 gem,请将其放入 app_base/gems 文件夹。 所有这些额外 gem 都将安装到 RAM 磁盘并作为 /mnt/gems 挂接。 此外,在 config/enviroment.rb 中设置 ENV['GEM_HOME'] = '/mnt/gems' 属性,以使 Rails 应用可查看此存储库。 磁盘的大小将自动进行计算。 为组件分配内存时,请记住这一点。

外部数据库

ROR 当前支持 MySQL、PostgreSQL 和 Microsoft SQL Server 中的任何一个作为 Rails 应用的外部数据存储。 它只能在 Rails 应用配置文件 (database.yml) 中正确定义适配器和数据库用户凭据。

使用 rails-sqlserver 适配器项目可支持 Microsoft SQL Server (http://rails-sqlserver.lighthouseapp.com/projects/20277-sql-server-05-adapter/tickets)。

rails-sqlserver 适配器配置示例 (application/config/database.yml):

production:
  adapter: sqlserver
  mode: odbc

dsn: Driver=FreeTDS;Server=db;Database=YOUR_DATABASE_NAME;Uid=USER_LOGIN;Pwd=USER_PASSWORD

自定义计数器

ROR 组件通过 mon 终端报告以下自定义计数器。 这些计数器属于 ROR 计数器组:

计数器名称

说明

Total hits

总命中数

Total bytes

总字节数

Active requests

活动请求数

Idle servers

空闲服务器数

Rails memory

Rails 使用的总内存(仅限 Passenger 模式)

Rails applications

当前处于活动状态的应用实例数(仅限 Passenger 模式)

Active applications

当前正在处理请求的应用实例数(仅限 Passenger 模式)

Idle applications

当前未在处理请求(即处于空闲状态)的应用实例数 *(仅限 Passenger 模式)

Rails sessions

显示当前所有应用实例的队列中有多少 HTTP 客户端等待进行处理(仅限 Passenger 模式)

Rails requests

指示所有实例到目前为止已处理的请求数(仅限 Passenger 模式)

注意:空闲应用实例不久将关闭,因为这些实例可通过 data_timeout_sec 进行指定(除非将此值设置为 0,在这种情况下决不会在空闲时间关闭应用实例)。 非活动的值等于计数-活动的。

可能的启动错误

在组件启动失败的情况下,系统日志可能记录以下错误消息:

错误消息

说明

错误: 启用了日志但未连接日志终端。

未连接 log 终端,但 logs_enabled 或 enable_access_log 设置为 yes。

错误: 属性 content_on_fs 设置为“off”,但缺少本地内容卷。

content_on_fs 设置为 off,指定必须在本地挂接数据卷,但是 ROR 无法挂接内容卷。 最有可能的原因是,内容卷未格式化,或未在 ROR 属性中定义。

错误: 无法挂接 nfs 共享。

ROR 无法挂接 NFS 共享。 可能的原因是,未连接 fs 或在 NAS 之前启动了 ROR(或者任意组件连接到 fs 终端)

显示板消息

消息

说明

数据存储容量不到可用磁盘空间的 5%

通过 fs 终端访问的数据卷容量不到可用磁盘空间的 5%。 建议增加卷的大小。

数据存储容量不到可用磁盘空间的 1%

通过 fs 终端访问的数据卷容量不到可用磁盘空间的 1%。 需要立即引起注意;可能发生数据丢失。

内容卷容量不到可用磁盘空间的 5%

组件上的内容卷容量不到可用磁盘空间的 5%。 建议增加卷的大小。

内容卷容量不到可用磁盘空间的 1%

组件上的内容卷容量不到可用磁盘空间的 1%。 需要立即引起注意;可能发生数据丢失。

性能

启用日志记录时 (logs_enabled = on),ROR 性能可能会受到影响。 下表包含使用 Apache Benchmark 实用工具(Apache Web 服务器版本 2.0 和 2.2 随附)禁用日志时执行的基准结果(指定以 rps(每秒请求数)为单位)。 Apache 网站上提供了有关 ab 的更多信息。 基准使用了下列设置:"bw=500M mem=2G cpu=2"。

并发

rps

1 个并发客户端

1700-2100 rps

10 个并发客户端

7100-7500 rps

100 个并发客户端

7700-8100 rps

典型用法

下图显示了 ROR 组件的典型用法。 ROR 将处理内容卷中的应用。

ROR 用法示例 2

正在使用的组件:

属性名

说明

hostname

www.mysite.org

站点的主机名。

app_base

MyApp

 

content_on_fs

off

ROR 将用户卷内容用于所有内容。

时区

EST

EST 时区。

ror_port

80

HTTP 协议的标准端口。

客户端请求到达 client 网关。 网关会将请求转发到 AppServer ROR 服务器,后者处理请求。

具有数据库、日志和监控的双层应用

下图显示了网络存储上具有数据库、日志、监控和内容的 ROR 组件的典型用法。

ROR 用法示例 2

正在使用的组件:

示例属性配置:

属性名

说明

hostname

www.mysite.org

站点的主机名

app_base

MyApp

 

content_on_fs

on

ROR 通过 fs 终端为所有内容使用远程存储

时区

EST

EST 时区

ror_port

80

HTTP 协议的标准端口

max_connections

200

最多 200 个并发用户

logs_enabled

yes

启用错误日志

logs_base_dir

MyApp_Log_Dir

 

error_log_level

信息

 

error_log_filename

error_log

错误日志名称

access_log_filename

access_log

访问日志名称

客户端请求到达 client 网关。 网关会将请求转发到 AppServer 服务器,后者处理请求。 内容和日志位于存储组件。 计数器被报告给 mon 组件。

注意:RoR 应用可以使用多种数据库类型。 ROR 允许将任何数据库组件连接到其 db 终端。

可扩展的支持 RoR 的网站

下图显示了具有负载均衡的 ROR 组件的典型用法。

ROR 用法示例 3

正在使用的组件:

AppServer1 和 AppServer2 的示例属性配置:

属性名

说明

content_on_fs

off

ROR 将用户卷内容用于所有内容

时区

EST

EST 时区

其他设置具有其默认值。

客户端请求到达 client 网关。 网关会将请求转发到 lb 负载均衡器,后者将请求定向到服务器 AppServer1 和 AppServer2 中的一个。

说明
组件内所用的开源软件和第三方软件

除了已安装的其基类 LUX5 之外,ROR 还使用以下开源软件包和第三方软件包。

RPM

软件

版本

已修改

许可

apr

1.2.7-11

Apache 软件许可证 2.0

apr-util

1.2.7-7.el5

Apache 软件许可证 2.0

e2fsprogs

1.39-20.el5

GPLv2

e2fsprogs-libs

1.39-20

GPLv2

freetds

0.64-11.el5.centos

GPLv2

glibc

2.5-34

LGPL

glibc-common

2.5-34

LGPL

httpd

2.2.3-22.el5.centos

Apache 软件许可证 2.0

keyutils-libs

1.2-1

LGPL

krb5-libs

1.6.1-31.el5_3.3

MIT,可免费分发

libgcc

4.1.2-44.el5

GPLv2

libgomp

4.3.2-7.el5

GPLv2

libselinux

1.33.4-5.1.el5

公共领域(未取得版权的)

libselinux-python

1.33.4-5.1.el5

公共领域(未取得版权的)

libstdc++

4.1.2-44.el5

GPLv2

mailcap

2.1.23-1.fc6

公共领域(未取得版权的)

mysql

5.0.45-7.el5

GPLv2

nfs-utils

1.0.9-40

GPLv2

OpenLDAP

2.3.43-3.el5

OpenLDAP

OpenSSL

0.9.8e-7.el5

BSD-like

perl-DBI

1.52-2.el5

GPL

pkgconfig

0.21-2.el5

GPLv2

postgresql

8.1.11-1.el5_1.1

BSD

postgresql-libs

8.1.11-1.el5_1.1

BSD

ruby

1.8.6.383-4

Ruby 许可证/GPL-请参阅“复制”

ruby-devel

1.8.6.383-4

Ruby 许可证/GPL-请参阅“复制”

ruby-irb

1.8.6.383-4

Ruby 许可证/GPL-请参阅“复制”

ruby-libs

1.8.6.383-4

Ruby 许可证/GPL-请参阅“复制”

ruby-rdoc

1.8.6.383-4

Ruby 许可证/GPL-请参阅“复制”

unixODBC

2.2.11-7.1

LGPL

从源进行安装

软件

版本

已修改

许可

2000-2005-adapter

2.2.22

MIT

mysql-ruby

2.8.2

Ruby 许可证

rubygems

1.3.6

Ruby 许可证

GEM

软件

版本

已修改

许可

actionmailer

2.3.4

MIT

actionpack

2.3.4

MIT

activerecord

2.3.4

MIT

activeresource

2.3.4

MIT

activesupport

2.3.4

MIT

capistrano

2.5.9

MIT/X 联合会许可证

cgi_multipart_eof_fix

2.5.0

Ruby 许可证

后台进程

1.0.10

Ruby 许可证

dbd-odbc

0.2.5

BSD

dbi

0.4.3

BSD

已弃用

2.0.1

BSD

fastthread

1.0.7

Ruby 许可证

ferret

0.11.6

MIT/X 联合会许可证

gem_plugin

0.2.3

Ruby 许可证

highline

1.5.2

Ruby 许可证/GPL

mongrel

1.1.5

Ruby 许可证

mongrel_cluster

1.0.5

Ruby 许可证

rake

0.8.4

Ruby 许可证

net-scp

1.0.2

Ruby 许可证/GPL

net-sftp

2.0.3

BSD/Ruby License

net-ssh

2.0.15

BSD/Ruby License

net-ssh-gateway

1.0.1

BSD/Ruby License

net-ssh-multi

1.0.1

BSD/Ruby License

passenger

2.2.11

GPLv2

pg

0.8.0

Ruby 许可证

rails

2.3.4

Ruby 许可证

rake

0.8.7

MIT/X 联合会许可证

sqlite3-ruby

1.2.5

BSD