最近要做一个运维系统,以前全部使用PHP编写的,感觉还是太复杂了,所以研究下Ruby on Rails ,看看是否像传说中的那么方便。结果安装过程并不是很顺利,出现了很多问题,记录留作参考。

操作系统环境
OS : CentOS 5.5
开发的软件包基本都已经安装
第一步:准备依赖条件
1)安装Ruby环境
#wget "ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p174.tar.gz"
#tar -zxf ruby-1.8.7-p174.tar.gz
#cd  ruby-1.8.7-p174
#./configure --prefix=/usr
#make
#make install

如果系统默认安装了ruby,会自动默认覆盖
系统自带的Ruby 版本为1.8.5,太低了,不满足最新的RubyGems的要求。
确认是否正确安装了此版本
#ruby -v
显示 : ruby 1.8.7 (2009-06-12 patchlevel 174) 则正确了

2)安装RubyGems
#wget "http://rubyforge.org/frs/download.php/75309/rubygems-1.8.10.tgz"
#tar -zxf rubygems-1.8.10.tgz
#cd rubygems-1.8.10
#ruby setup.rb

稍等一会,系统会自动安装完毕。
测试是否正确
#gem -v 
显示:1.8.10 则安装无误

3)安装Sqlite3
原以为安装会比较顺利的,结果在实际操作过程中,出现了各种错误,在一个一个解决的过程中也摸清楚了一些相互的依赖关系。
默认rails程序是使用Sqlite3数据库,而且需要 native支持,默认安装的有的时候是不行。
所以为了顺利起见,最好重新安装一下。
#wget "http://www.sqlite.org/sqlite-autoconf-3070800.tar.gz"
#tar -zxf sqlite-autoconf-3070800.tar.gz
#cd sqlite-autoconf-3070800
#./configure --prefix=/usr
#make
#make install

确认已经正确更新,会覆盖系统默认的sqllite
#ls -al /usr/bin/sqlite3

安装相应的Gem包
#gem install sqlite3-ruby

第二步:安装Rails
1)安装 Rails
根据系统配置的不同,时间稍有不同,而且会出现失败的可能。执行中断的时候没有关系,重新执行一次就OK了。
时间不会很短,需要一个一个下载相关包,然后一个一个安装。
#gem install rails
默认的安装版本为 3.1.1,也可以通过参数制定为其他的版本
第一次会出现很多进度信息
最后会出现如下
Successfully installed rails-3.1.1
1 gem installed
Installing ri documentation for rails-3.1.1...
Installing RDoc documentation for rails-3.1.1...

表示安装成功了
测试一下
#rails -v
显示:Rails 3.1.1 则说明成功

第三步:开始测试了
1)新建立一个应用
#cd /home/work
#rails  new fenip
会提示进度安装情况,创建目录,安装需要的Gem软件包。

这个时候如果前面没有提前配置好 Sqlite3环境的话,会出现如下报错:
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

        /usr/local/bin/ruby extconf.rb
checking for sqlite3.h... yes
checking for sqlite3_libversion_number() in -lsqlite3... yes
checking for rb_proc_arity()... no
checking for sqlite3_initialize()... no
checking for sqlite3_backup_init()... no
checking for sqlite3_column_database_name()... no
checking for sqlite3_enable_load_extension()... no
checking for sqlite3_load_extension()... no
creating Makefile

make
gcc -I. -I. -I/usr/local/lib/ruby/1.8/i686-linux -I. -D_FILE_OFFSET_BITS=64  -fPIC -g -O2   -c database.c
database.c: In function 鈥榠nitialize鈥?
database.c:47: error: 鈥楽QLITE_OPEN_READWRITE鈥?undeclared (first use in this function)
database.c:47: error: (Each undeclared identifier is reported only once
database.c:47: error: for each function it appears in.)
database.c:47: error: 鈥楽QLITE_OPEN_CREATE鈥?undeclared (first use in this function)
database.c:72: error: 鈥楽QLITE_OPEN_READONLY鈥?undeclared (first use in this function)
database.c: In function 鈥榮et_sqlite3_func_result鈥?
database.c:278: error: 鈥榮qlite3_int64鈥?undeclared (first use in this function)
make: *** [database.o] Error 1

Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/sqlite3-1.3.4 for inspection.
Results logged to /usr/local/lib/ruby/gems/1.8/gems/sqlite3-1.3.4/ext/sqlite3/gem_make.out
An error occured while installing sqlite3 (1.3.4), and Bundler cannot continue.
Make sure that `gem install sqlite3 -v '1.3.4'` succeeds before bundling.

完成第一步里面的第3项目,就可以正常通过。

执行 rails new FirstApp 成功后,会有如下提示:
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
则表明正确安装了。

进入生成的目录里面
#cd FirstApp
几点说明:
a) 当前目录下面有一个 Gemfile 文件,这个文件后续会使用得到
b) app/ 目录,是以后主要操作的目录
c) config/ 目录,里面包含 database.yml ,里面记录的 sqlite3的数据信息。后续修改为Mysql的时候,需要修改此文件。
d) db/ 目录,是测试应用的时候,sqlite3 数据库存放的目录
e) script/ 目录,里面只有一个文件,是启用应用Server的 rails程序
f) public/ 目录,是存放公共的页面和文件的目录,包括404,500等页面
其他的还有几个目录,可以暂时先不用关心。

2)测试应用
启动刚刚生成的应用。
#./script/rails server
一般情况不会成功的,会出现如下的报错:
/usr/local/lib/ruby/gems/1.8/gems/execjs-1.2.9/lib/execjs/runtimes.rb:47:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
        from /usr/local/lib/ruby/gems/1.8/gems/execjs-1.2.9/lib/execjs.rb:5
        from /usr/local/lib/ruby/gems/1.8/gems/coffee-script-2.2.0/lib/coffee_script.rb:1:in `require'
        from /usr/local/lib/ruby/gems/1.8/gems/coffee-script-2.2.0/lib/coffee_script.rb:1
        from /usr/local/lib/ruby/gems/1.8/gems/coffee-script-2.2.0/lib/coffee-script.rb:1:in `require'
        from /usr/local/lib/ruby/gems/1.8/gems/coffee-script-2.2.0/lib/coffee-script.rb:1
        from /usr/local/lib/ruby/gems/1.8/gems/coffee-rails-3.1.1/lib/coffee-rails.rb:1:in `require'
        from /usr/local/lib/ruby/gems/1.8/gems/coffee-rails-3.1.1/lib/coffee-rails.rb:1
        from /usr/local/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler/runtime.rb:68:in `require'
        from /usr/local/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler/runtime.rb:68:in `require'
        from /usr/local/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler/runtime.rb:66:in `each'
        from /usr/local/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler/runtime.rb:66:in `require'
        from /usr/local/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler/runtime.rb:55:in `each'
        from /usr/local/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler/runtime.rb:55:in `require'
        from /usr/local/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler.rb:122:in `require'
        from /home/work/fenip/config/application.rb:7
        from /usr/local/lib/ruby/gems/1.8/gems/railties-3.1.1/lib/rails/commands.rb:52:in `require'
        from /usr/local/lib/ruby/gems/1.8/gems/railties-3.1.1/lib/rails/commands.rb:52
        from /usr/local/lib/ruby/gems/1.8/gems/railties-3.1.1/lib/rails/commands.rb:49:in `tap'
        from /usr/local/lib/ruby/gems/1.8/gems/railties-3.1.1/lib/rails/commands.rb:49
        from ./script/rails:6:in `require'
        from ./script/rails:6

仔细分析,是execjs 需要一个运行的库支持。
里面列举了在几种环境下面的,可以使用的运行环境库。
这里我们选择:therubyracer - Google V8 embedded within Ruby
 
官方网站:https://github.com/cowboyd/therubyracer
#gem install therubyracer
执行如上命令,安装。成功后,显示如下:
Fetching: libv8-3.3.10.2-x86-linux.gem (100%)
Fetching: therubyracer-0.9.8.gem (100%)
Building native extensions.  This could take a while...
Successfully installed libv8-3.3.10.2-x86-linux
Successfully installed therubyracer-0.9.8
2 gems installed
Installing ri documentation for libv8-3.3.10.2-x86-linux...
Installing ri documentation for therubyracer-0.9.8...
Installing RDoc documentation for libv8-3.3.10.2-x86-linux...
Installing RDoc documentation for therubyracer-0.9.8...

这个时候,编辑前面提及的 Gemfile
在最后,增加一行如下:
require 'v8'
然后执行如下命令:
#bundle install
有的系统会出现如下的错误:
/usr/local/lib/ruby/gems/1.8/gems/therubyracer-0.9.8/ext/v8/v8.so: /usr/local/lib/ruby/gems/1.8/gems/therubyracer-0.9.8/ext/v8/v8.so: cannot restore segment prot after reloc: Permission denied - /usr/local/lib/ruby/gems/1.8/gems/therubyracer-0.9.8/ext/v8/v8.so (LoadError)
 
这个是和系统的 SELinux 有关系的。
修复的方法:
#vi /etc/sysconfig/selinux
修改为 :SELINUX=disabled
保存。
#chcon -t texrel_shlib_t /usr/local/lib/ruby/gems/1.8/gems/therubyracer-0.9.8/ext/v8/v8.so
执行上面的命令,重新修改权限。
 
再次执行
#bundle install
显示:Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
则表明成功了。
 
再次启动Server
#./script/rails  server
 
=> Booting WEBrick
=> Rails 3.1.1 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2011-10-12 11:31:22] INFO  WEBrick 1.3.1
[2011-10-12 11:31:22] INFO  ruby 1.8.7 (2009-06-12) [i686-linux]
[2011-10-12 11:31:22] INFO  WEBrick::HTTPServer#start: pid=6946 port=3000
 
成功监听了 3000端口。
 
通过浏览器测试,http://*.*.*.*:3000 ,会出现默认的页面。
 
总结:
起初看rails的安装文档,发现是很简单的,几条命令就OK了。但在实际的操作过程中,由于环境的不同,软件包的不同,会出现各种各样的错误。逐一分析排查后,总结此文,以备有需要的时候参考。