首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

ubuntu10.10 上部署 apache2 + fastcgi + rack/sinatra/rails3

2012-12-19 
ubuntu10.10 下部署 apache2 + fastcgi + rack/sinatra/rails3nginx + passenger用了蛮久的,突然对fastcgi

ubuntu10.10 下部署 apache2 + fastcgi + rack/sinatra/rails3
nginx + passenger用了蛮久的,突然对fastcgi感兴趣,因为有robbin这篇blog在Linux平台上安装和配置Ruby on Rails详解
http://robbin.iteye.com/blog/43228
以及rails部署性能比较的文章。

但是rails3在官网上已经没有关于fastcgi的配置建议了,同时rails3也没有dispatch.fcgi这样类似的东东了。
注定我按照robbin的blog是不会安装成功的了。

但是rack告诉我可以使用fastcgi,
那么sinatra,rails3使用rack肯定也可以使用fastcgi,本着由浅入深的原则开始了我的探索之旅。
而我查到的几篇文章都跟apache相关,那就先从apache开始,然后再尝试lighttpd

安装apache2

sudo aptitude install apache2



apache2的配置文件在/etc/apache2下,一个主文件apache2.conf其他一堆小文件

日志在/var/log/apache2,用下面命令查错很有用
tail -f /var/log/apache2/error.log


查看配置是否有问题可用
apachectl configtest


安装fastcgi模块
sudo aptitude install libapache2-mod-fastcgi libfcgi-dev


一 rack的使用
安装fcgi 和rack gem
gem install fcgi rack


查看/etc/apache2/sites-available/default看到cgi-bin目录是在/usr/lib/cgi-bin/
<VirtualHost *:80>ServerAdmin webmaster@localhostDocumentRoot /var/www<Directory />Options FollowSymLinksAllowOverride None</Directory><Directory /var/www/>Options Indexes FollowSymLinks MultiViewsAllowOverride NoneOrder allow,denyallow from all</Directory>ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<Directory "/usr/lib/cgi-bin">AllowOverride NoneOptions +ExecCGI -MultiViews +SymLinksIfOwnerMatchOrder allow,denyAllow from all</Directory>ErrorLog ${APACHE_LOG_DIR}/error.log# Possible values include: debug, info, notice, warn, error, crit,# alert, emerg.LogLevel warnCustomLog ${APACHE_LOG_DIR}/access.log combined    Alias /doc/ "/usr/share/doc/"    <Directory "/usr/share/doc/">        Options Indexes MultiViews FollowSymLinks        AllowOverride None        Order deny,allow        Deny from all        Allow from 127.0.0.0/255.0.0.0 ::1/128    </Directory></VirtualHost>

所以将下面代码保存为hello-world.fcgi放入/usr/lib/cgi-bin/目录下

#!/home/zc/.rvm/rubies/ree-1.8.7-2011.03/bin/ruby#!/usr/bin/env rubyrequire 'rubygems'require 'rack'app = Proc.new do |env|  Rack::Response.new.finish do |res|    res.write "Hello, Rack!"  endendRack::Handler::FastCGI.run app


sudo apachectl start启动apache2
访问http://localhost/cgi-bin/hello-world.fcgi
可以看到Hello,Rack!说明成功。
ps aux|grep apache2

可见4个apache2进程
root     22351  0.0  0.1  73780  2856 ?        Ss   20:10   0:00 /usr/sbin/apache2 -k startwww-data 22352  0.0  0.0  73512  1972 ?        S    20:10   0:00 /usr/sbin/apache2 -k startwww-data 22354  0.0  0.1 297392  3124 ?        Sl   20:10   0:00 /usr/sbin/apache2 -k startwww-data 22355  0.0  0.1 297208  2412 ?        Sl   20:10   0:00 /usr/sbin/apache2 -k start


ps aux|grep cgi

可见一个fastcgi进程管理和一个ruby进程
www-data 22353  0.0  0.1  73512  2108 ?        S    20:10   0:00 /usr/sbin/fcgi-pm -k startwww-data 22418  0.4  0.6  57272 13724 ?        S    20:10   0:00 /home/zc/.rvm/rubies/ree-1.8.7-2011.03/bin/ruby /usr/lib/cgi-bin/hello-world.fcgi


注意#!/usr/bin/env ruby
会引导到/usr/bin/ruby,那个系统ruby我什么都没装,而我使用的rvm,这个问题我还没找到解决办法
暂时使用#!/home/zc/.rvm/rubies/ree-1.8.7-2011.03/bin/ruby

二 sinatra的使用
gem install sinatra


新增配置/etc/apache2/sites-available/sinatra_fcgi
<VirtualHost *:80>  DocumentRoot /home/zc/Sites/sinatra-fcgi  <Directory /home/zc/Sites/sinatra-fcgi>    Options ExecCGI FollowSymLinks    AllowOverride all    Order allow,deny    Allow from all  </Directory></VirtualHost>

将AllowOverride None 修改为AllowOverride all,允许.htaccess文件
链接配置到允许目录,并重启服务
cd /etc/apache2/sites-enabledsudo ln -s ../sites-available/sinatra 001-sinatra



/home/zc/Sites/sinatra-fcgi目录下新增.htaccess文件
RewriteEngine OnRewriteBase / DirectoryIndex dispatch.fcgi RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ dispatch.fcgi/$1 [L]


允许rewrite模块,不然会报Invalid command 'RewriteEngine'错误
cd /etc/apache2/mods-enabledsudo ln -s ../mods-available/rewrite.load rewrite.load


/home/zc/Sites/sinatra-fcgi目录下新增dispatch.fcgi文件
#!/home/zc/.rvm/rubies/ree-1.8.7-2011.03/bin/ruby#!/usr/bin/env rubyrequire 'rubygems'#require 'rack'require 'sinatra'require 'start'Rack::Handler::FastCGI.run Sinatra::Application


在/home/zc/Sites/sinatra-fcgi目录下新增start.rb文件
require 'rubygems'require 'sinatra'get '/' do      '你好世界Hello, World!'end


不过这样还是不行,会被吃字,
访问http://localhost 结果显示 "你好世界H",怎么搞都不行,后来
弃用mod-fastcgi改用mod-fcgid就好了,真是晕

三 rails3的使用
参照实例https://github.com/dre3k/rails3_fcgi
先使用rails server使实例跑起来,由于这个例子没带database.yml我从新建例子中复制一个过来
rake db:migrate
rake db:migrate RAILS_ENV=production
能跑起来后,新增配置/etc/apache2/sites-available/rails3_fcgi
<VirtualHost *:80>  DefaultInitEnv RAILS_ENV production  DocumentRoot /home/zc/Sites/rails3_fcgi/public  <Directory /home/zc/Sites/rails3_fcgi/public>    Options ExecCGI FollowSymLinks    AllowOverride all    Order allow,deny    Allow from all  </Directory></VirtualHost>

将配置链接到/etc/apache2/sites-enabled
sudo ln -s /etc/apache2/sites-available/rails3_fcgi /etc/apache2/sites-enabled/001-rails3_fcgi 

并将/etc/apache2/sites-enabled下,其他链接删除

mod-fastcgi不认DefaultInitEnv命令,会报下面错误
apache2 Invalid command 'DefaultInitEnv'
替代模块
sudo aptitude install libapache2-mod-fcgid

/etc/apache2/mods-available/fcgid.conf
<IfModule mod_fcgid.c>  AddHandlerfcgid-script .fcgi  FcgidConnectTimeout 20</IfModule>

开启fcgi模块,关闭fastcgi模块
sudo ln -s /etc/apache2/mods-available/fcgid.conf /etc/apache2/mods-enabled/fcgid.confsudo ln -s /etc/apache2/mods-available/fcgid.load /etc/apache2/mods-enabled/fcgid.load


原始的rails3_fcgi.fcgi有问题
1.由于使用rvm不得不将#!/usr/bin/ruby改为
#!/home/zc/.rvm/rubies/ree-1.8.7-2011.03/bin/ruby
2.require rail3环境要适当修改
修改后文件如下
#!/home/zc/.rvm/rubies/ree-1.8.7-2011.03/bin/ruby#!/usr/bin/ruby#require '../config/environment'require ::File.expand_path('../../config/environment',  __FILE__)class Rack::PathInfoRewriter  def initialize(app)    @app = app  end  def call(env)    env.delete('SCRIPT_NAME')    parts = env['REQUEST_URI'].split('?')    env['PATH_INFO'] = parts[0]    env['QUERY_STRING'] = parts[1].to_s    @app.call(env)  endendRack::Handler::FastCGI.run  Rack::PathInfoRewriter.new(Rails3Fcgi::Application)

改完后就顺利的跑起来了

public/.htaccess文件正常,无需更改,不过将来放到其他项目中估计要做相应的更改
SetEnv RAILS_RELATIVE_URL_ROOT /rails3_fcgiRewriteEngine OnRewriteRule ^(stylesheets/.*)$ - [L]RewriteRule ^(javascripts/.*)$ - [L]RewriteRule ^(images/.*)$ - [L]RewriteRule ^$ index.html [QSA]RewriteRule ^([^.]+)$ $1.html [QSA]RewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ rails3_fcgi.fcgi [E=X-HTTP_AUTHORIZATION:%{HTTP:Authorization},QSA,L]


最后,log/production.log的权限要改一下,不然apache2无法记日志
chmod 666 log/production.log


总结: mod-fastcgi有问题,而且很严重。
mod-fcgid 很好很强大,而且还是国人写的,赞一个。

热点排行