Aug 12 2011

ROR redmine + mysql + fcgi + apache

Category: 技术ssmax @ 16:00:42

rubyonrails ROR
这种架构了已经听了非常久了,但是一次都没有试过,这次看中上面一个issue track类的系统redmine,想试试,所以就有了这一次历程,由于各种版本问题,安装还是比较需要经验的,呵呵。

第一步,去看看redmine的文档,发现对ruby和相关组件的版本要求相当多。。。具体如下:

http://www.redmine.org/projects/redmine/wiki/RedmineInstall

The required Ruby and Ruby on Rails versions for a given Redmine version is:

Redmine version Supported Ruby versions Required Rails version Required Rack version
current trunk ruby 1.8.6, 1.8.7 Rails 2.3.11 Rack 1.1.1
trunk from r2887 to r4903 ruby 1.8.6, 1.8.7 Rails 2.3.5 Rack 1.0.1
trunk from r2493 to r2886 ruby 1.8.6, 1.8.7 Rails 2.2.2
trunk before r2493 ruby 1.8.6, 1.8.7 Rails 2.1.2
1.2.x ruby 1.8.6, 1.8.7 Rails 2.3.11 Rack 1.1.1
1.1.x ruby 1.8.6, 1.8.7 Rails 2.3.5 Rack 1.0.1
1.0.x ruby 1.8.6, 1.8.7 Rails 2.3.5 Rack 1.0.1
0.9.x ruby 1.8.6, 1.8.7 Rails 2.3.5 Rack 1.0.1
0.8.x ruby 1.8.6, 1.8.7 Rails 2.1.2

根据redmine最新版1.2.x,确定对应的ruby和相关组件的版本

ruby 1.8.7 / rails 2.3.11 / rack 1.1.1

第二步,去找ruby了,当前最新版本是 ruby 1.9.2 ,好像没找到链接是下载旧版本的(这相当郁闷,后面还有这样的情况)

http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p290.tar.gz

下载地址反推一下,就找到ftp的下载路径,里面就有所有版本的源代码可以下载了

http://ftp.ruby-lang.org/pub/ruby/

找到1.8.7的最新版,找p数字最大的,p for patch

http://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p352.tar.gz

下载,解压,configure ,make,make install

编译ruby之前记得看看自己的openssl-dev 在不在,如果不在的话要装好,要不就没有编译ssl部分的功能了,这样会影响后面的安装。

如果你不安装在标准目录下面,记得自己添加PATH

安装完成后看看版本号?


>ruby -v
 ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-linux]

第三步,安装其他组件,在找文档的过程中,发现ruby的组件有个比较方便的管理器,类似rpm形式的rubygems

找到它的网站

http://rubygems.org/

最新版本1.8.7,这里又是一个大大的陷阱,如果前面看安装文档不注意的话,就按装了gems的最新版了,发现是和rails不兼容的,真是瀑布汗。。。

具体如下:

RubyGems 1.3.7 or higher is required with following limitations :

  • Rails 2.3.5 will fail with RubyGems 1.5.0 or later, stick to previous versions of RubyGems !
  • Rails 2.3.11 will fail with RubyGems 1.7.0 or later, stick to previous versions of RubyGems !

意思就是2.3.11的rails只支持rubygems 1.7.0 以下的,又是一轮寻找旧版的历程,首页也没有直接指进去的

要去到一个叫rubyforge的地方,类似sourceforge吧,找到rubygems项目,找各版本的源代码,如下

http://rubyforge.org/frs/?group_id=126

在其中找到1.6的最新版,1.6.2

http://rubyforge.org/frs/download.php/74445/rubygems-1.6.2.tgz

下载,解压,执行


>ruby setup.rb

会自动判断ruby版本,安装到对应的路径下面

第四步,安装了rubygems以后,就可以用gems命令来管理ruby的组件了

按要求安装rails版本

>gem install rails -v=2.3.11

这个时候会自动帮你安装好所需要的包,和rpm类似了

装好以后会有以下的包

> gem list --local

 actionmailer (2.3.11)
 actionpack (2.3.11)
 activerecord (2.3.11)
 activeresource (2.3.11)
 activesupport (2.3.11)
 rack (1.1.2)
 rails (2.3.11)
 rake (0.9.2)

自动就装好了rack 和 rake,只是希望 rack 1.1.2 不要 太高了,和要求的1.1.1不要有冲突就好,唉。。。

装到这里,还缺少mysql 和 fcgi 的 ruby组件,还有一个叫i18n的组件,这些都是后面出错里面提醒了,都写在这一步安装即可

>gem install i18n -v=0.4.2
>gem install fcgi
>gem install mysql

报错的话自己装好 fastcgi 的dev包和mysql的dev包,其中mysql的随便用yum或者apt-get搞定即可,但是fastcgi的开发包在centos下面貌似没有,yum找不到,apt-get 是有的,那就自己编译咯

最新的fastccgi包,http://www.fastcgi.com/dist/fcgi.tar.gz

下载编译安装,一样的流程,如果不是安装在标准路径的话,gem安装的时候要指定如下:

>gem install fcgi -- --with-fcgi-dir=/home/fastcgi

全部成功之后,看看ruby组件有哪些:

>gem list --local

*** LOCAL GEMS ***

actionmailer (2.3.11)
 actionpack (2.3.11)
 activerecord (2.3.11)
 activeresource (2.3.11)
 activesupport (2.3.11)
 fcgi (0.8.8)
 i18n (0.4.2)
 mysql (2.8.1)
 rack (1.1.2)
 rails (2.3.11)
 rake (0.9.2)

第五步,就是安装redmine了

下载最新版

http://rubyforge.org/frs/download.php/75097/redmine-1.2.1.tar.gz

解压之后就是一个完整的项目结构了。

ok,先访问自己的数据库,建立一个database供其使用

按照安装文件一步步来,先进入你解压出来的目录

>cp config/database.yml.example config/database.yml

编辑 database.yml 中的production配置,设置好你的mysql主机/用户密码和database

production:
adapter: mysql
database: redmine
host: localhost
username: redmine
password: my_password

执行

>rake generate_session_store

创建session目录,会有一些warning,别管它。

>RAILS_ENV=production rake db:migrate

创建数据库,RAILS_ENV的环境变量就指定了要用哪一份配置文件

>RAILS_ENV=production rake redmine:load_default_data

插入初始数据

>ruby script/server webrick -e production

开启webrick服务器,默认端口3000,这样就可以通过http://your_ip:3000/访问你的redmine了

初始的用户名密码是 admin/admin

到这里,测试的话已经够用了,那如果要整合apache呢,看看 pubic/htaccess.fcgi.example

这里就有apache的基本配置了,全部是基于rewrite的,看看你是要cgi还是fcgi实现,就对应

dispatch.fcgi.example

dispatch.cgi.example

两个脚本,这些都是生成好了放在pubic的了,按需要就改名即可,这里解释一下htaccess里面的设置


#判断加载的模块,看看要什么样的处理流程。

<IfModule mod_fastcgi.c>
AddHandler fastcgi-script .fcgi
</IfModule>
<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi
</IfModule>
<IfModule mod_cgi.c>
AddHandler cgi-script .cgi
</IfModule>

#目录加上跟随链接和可执行cgi
Options +FollowSymLinks +ExecCGI

#打开rewrite

RewriteEngine On

#直接访问根的,跳转到index.html,访问其他没有扩展名的,如xxx,也跳转到对应的xxx.html
#如果请求的文件不存在,就跳转到对应的cgi/fcgi处理,存在的话,就直接访问静态文件。

RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
<IfModule mod_fastcgi.c>
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
</IfModule>
<IfModule mod_fcgid.c>
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
</IfModule>
<IfModule mod_cgi.c>
RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
</IfModule>
# 500 服务器错误时候的显示文本。
ErrorDocument 500 "<h2>Application error</h2>Rails application failed to start properly"

如果有apache配置经验的人看到这里基本就都懂得如何配置了,其实原理就是把所有动态的请求都转发到cig/fcgi处理,QSA的意思就是带上所有参数,非常简单明了。

整个安装过程有点长,关键在于各个版本号的兼容性处理上面,很让人头疼,如果没有linux编译经验的人,要完成这个功能的话可能会比较抓狂,呵呵。