第36个标记 » 2007 » September

喜马拉雅的天空

存档: September, 2007

在Debian上部署Rails Apache+fcgi(或FastCgi)

Rails+Apache2+fcgid安装

安装Ruby



tar xzvf ruby-1.8.6.tar.gz
cd ruby-1.8.6
./configure
make
make install

    
检查一下ruby是否安装,输入:



ruby -v

安装zlib



tar xvzf  zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure
make
make install

安装rubygem  



tar xzvf rubygems-0.9.4.tgz
cd rubygems-0.9.4
ruby setup.rb

为了看是否安装上,输入:



gem -v

Rails



gem install rails -y

 有的时候可能因为网速问题装不上,请耐心多试记下.

测试



rails testRails
cd testRails
ruby script/server

 

 

 

 

会有如下显示:

=> Booting WEBrick…
=> Rails application started on http://0.0.0.0:3000=> Ctrl-C to shutdown server; call with

   –help for options
[2007-08-15 08:02:04] INFO  WEBrick 1.3.1
[2007-08-15 08:02:04] INFO  ruby 1.8.6 (2007-03-13) [i686-linux]
[2007-08-15 08:02:04] INFO  WEBrick::HTTPServer#start: pid=16306 port=3000

 

ImageMagick



tar xzvf ImageMagick-6.3.5-6.tar.gz
cd ImageMagick-6.3.5
./configure
make
make install

看是否安装成功,输入:



usr/local/bin/convert logo: logo.gif

 

 

安装RMagick

tar xvzf RMagick-1.15.10.tar.gz
cd RMagick-1.15.10
./configure
make
make install

安装fcgi

由于rubyfcgi支持库需要在编译的时候联接FCGI的系统库,因此我们需要先安装FCGI库,下载FCGI源代码发行包:

http://www.fastcgi.com/dist/

tar xzvf fcgi-2.4.0.tar.gz

cd fcgi-2.4.0

./configure –prefix=/usr/local/fcgi

make && make install

 

 

 

 

 

安装fcgid

apt-get install libapache2-mod-fcgid
/etc/init.d/apache2 force-reload

 安装fcgi for ruby

gem install fcgi

配置apache

可以如下

   NameVirtualHost *
<IfModule mod_fcgid.c>
       AddHandler fcgid-script .fcgi
       SocketPath /var/lib/apache2/fcgid/sock
       DefaultInitEnv  RAILS_ENV production
       IdleTimeout 600
       ProcessLifeTime 3600
       MaxProcessCount 8
       DefaultMinClassProcessCount 3
       DefaultMaxClassProcessCount 3
       IPCConnectTimeout 8
       IPCCommTimeout 48
   </IfModule>

<VirtualHost *>
    ServerAdmin webmaster@localhost
    #ServerName localhost
    DocumentRoot /path/to/app/public/
    ErrorLog /xxx/log/httpd-error_log
    CustomLog /xxx/log/httpd-access_log common
    
   <Directory
/path/to/app/public/>
      Options ExecCGI FollowSymLinks
      AllowOverride all
      Order allow,deny
      Allow from all
   </Directory>
</VirtualHost>

配置应用程序

编辑.htaccess文件

注释 AddHandler cgi-script .cgi以及AddHandler fastcgi-script .fcgi,增加AddHandler fcgid-script .fcgi.

RewriteRule ^(.*)$ dispatch.cgi [QSA,L]改为RewriteRule ^(.*)$ dispatch.fcgi [QSA,L].

可以如下:

# General Apache options

AddHandler fcgid-script .fcgi

Options +FollowSymLinks +ExecCGI

RewriteEngine On

RewriteRule ^$ index.html [QSA]

RewriteRule ^([^.]+)$ $1.html [QSA]

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

ErrorDocument 500 “<h2>Application error</h2>Rails application failed to start properly”

编辑dispatch.fcgi

加入

require ‘fcgi_handler’

require ‘rubygems’

require_gem ‘fcgi’

需要注意的是,我们一般都是在windows平台开发,然后部署到linux上去,如果您属于这种情况,请注意文件的第一行编译器

的设置.windows上可能是:

#! C:\ruby\bin\ruby

需要改成

#! /usr/local/bin/ruby

问题解答

Q:如果C编译器没有安装,应该如何安装呢?  
A:debian上使用如下命令:

apt-get install build-essential

 
Q:如果出现以下错误:

<— lib
/usr/local/lib/ruby/site_ruby/1.8/rubygems/remote_fetcher.rb:4:in `require’: no such file to load — zlib (LoadError)
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems/remote_fetcher.rb:4
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:8:in `require’
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:8
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems.rb:504:in `require’
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems.rb:504
        from /home/confach/pkgs/rubygems-0.9.4/./post-install.rb:81:in `require’
        from /home/confach/pkgs/rubygems-0.9.4/./post-install.rb:81:in `install_sources’
        from /home/confach/pkgs/rubygems-0.9.4/./post-install.rb:116:in `run_hook’
        from setup.rb:1526:in `exec_task_traverse’
        from setup.rb:1342:in `exec_install’
        from setup.rb:1000:in `exec_install’
        from setup.rb:814:in `invoke’
        from setup.rb:773:in `invoke’
        from setup.rb:1578

 我该怎么办?

A:说明zlib无法加载.解决方案:

cd ruby-1.8.6/ext/zlib/
ruby extconf.rb –with-zlib-include=/usr/include –with-zlib-lib=/usr/lib
make
make install

Q:如果利用查看fcgi for ruby是否已经装上?
A:请调用gem list,看是否fcgi在其中

Q:如果我利用gem install fcgi 安装不上怎么办?
A:很简单,下载其源代码然后进行安装:
   

然后就可以安装rubyfcgi支持库了,下载ruby-fcgi-0.8.7.tar.gz

 

http://rubyforge.org/projects/fcgi/

tar xzvf ruby-fcgi-0.8.7.tar.gz

cd ruby-fcgi-0.8.7

ruby install.rb config — –with-fcgi-include=/usr/local/include –with-fcgi-lib=/usr/local/lib

ruby install.rb setup

ruby install.rb install


 
需要注意的是,还是安装上fastcgi.

Q:如我我遇到如下错误怎么办?

mod_fcgid: can’t apply process slot for “xxx/xxx/public/dispatch.fcgi”

A:这个比较简单,修改一下Apache的日志目录权限,例如chmod 755 /var/log/apache2

Q:如果遇见如下错误怎么办?

Premature end of script headers: dispatch.fcgi

A:请先检查一下该文件的配置以及.htaccess.如果问题依旧,请修改一下dispatch.fcgi的权限,至少是755更多详情,

参考我的另一文章:

“Premature end of script headers: dispatch.fcgi”终极解决方案

.

Q:如果提示RewriteEngine拼写错误,或者没有启用该功能怎么处理?
A:非常简单,那是因为apacherewrite模块没有加载.请先检查rewrite模块是否已经安装.然后执行下面的命令:

cd /etc/apache3/mods-available
     nano -e rewrite.load

输入

LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

Ctrl+X保存

cd ..
ln -s mods-available/rewrite.load mods-enabled

然后重启apache

/etc/init.d/apache2 restart

Q: 如何选择fastcgifcgid?
A:很简单,如果是apache1.x,选用fastcgi,如果是apache2.x,请选用fcgid

Q:对系统有什么要求?
A:建议采用2.6版本的内核

  
Q:怎么使用ImageMagick无法显示图片?

A:请先调用

/usr/local/bin/convert logo: logo.gif


 

 

如果没法生成或者生成的gif文件无效,请重新安装ImageMagick.在安装之前请安装jpeg,freetype,png,tiff等库.

  • apt-get install libjpeg62-dev或apt-get install libjpeg62  –>jpeg

  • apt-get install  libfreetype6  –> freetype

对于最新的版本,可能要安装ghostscript。

apt-get install  gs

Q:如果访问网站显示的是dispatch.fcgi的源内容,怎么办?

A:一般来说,有2个理由导致:

  1.    没有安装fcgi module。因为没有安装,访问时没法解析。关于安装的问题,参见上面安装fcgi这一节。
  2. 或者是apache不同版本造成的。

Confach发表于 September 26, 2007 3:26 pm | 留言(2) |一技之长 

SOHO中国

18个月前,我到北京建外SOHO.白色的几幢写字楼吸引了我,因为和周边的大楼相比较,这几幢楼实在太显眼,甚至看起来有些不相称.当时就想,谁敢在北京盖这白色的大楼.后来才知道这是小潘创建的.OK,先贴张图:

看见没有,灯光最亮的就是建外SOHO.

当我踏入写字楼,感觉不错.大厅里也是乳白色的.第一感觉自己就想是透明的,非常轻,甚至有点像进入仙境的感觉.踏入电梯,比较宽敞,而且较稳.进入写字楼房间,什么都好,唯一不爽的就是每层的高度不够,感觉有点压抑.不管怎么说,感觉相当好.

午餐在其商业铺搞定的,可能是刚建成不久,看起来也没有多少商户.当然吃饭的地方还是有的.餐厅里人不是特别多,价格还可以,不是特别贵.但是最终给我的印象是环境和人气还需改善.想必现在应该好很多了吧.

这次SOHO中国给我的印象是:胆大,具有创意.

回到上海之后,才发现SOHO中国在海南有酒店,在北京有多处SOHU,例如除了建外SOHU之外,还有光华路SOHO,朝外SOHO,SOHO现代城等.

于是我开始关注起来.小潘和王石,冯仑都有着不少的关系吧.

最近这几天,SOHO中国要在香港上市了,发行约15亿股,90%给投资机构,其他给个人投资者,股价约为8.3港元.这是相当不错的融资方案.120多亿,能干很多事情的.这几天小潘在全球路演.希望他一切都顺利.

遗憾的是,如果在大陆投资的话,看起来比较遥远.毕竟还不能到香港去买其股票.但是我个人对SOHO中国还是很看好的.尽管不如万科,万通那么有名,但是其设计,创意等丝毫不差.

最后贴几张图:

SOHU现代城

 

光华路SOHO

朝外SOHO,据说这次上市资金可能用于此

SOHO尚都

长城脚下的公社,(这也能建?)

博鳌博鳌凯宾斯基饭店

最后,有个人不得不提,那就是小潘的爱人张欣.

关于更多详情,参考http://www.sohochina.com

注:本文绝不是给SOHO做广告,再说了,小潘也没有给我广告费呀.

 

 

Confach发表于 September 21, 2007 5:41 pm | 留言(1) |三言两语 

mongrel启动问题的解决方案

如果使用Mongrel来部署Rails,就不可避免的使用

  1. mongrel_rails start -C mongrel.config  

这里mongrel.config是mongrel的配置文件,可以为:

  1. —  
  2.  :config_script:  
  3.  :environment: development  
  4.  :pid_file: log/mongrel.pid  
  5.  :num_processors: 1024  
  6.  :docroot: public  
  7.  :timeout: 0  
  8.  :host: 0.0.0.0  
  9.  :mime_map:  
  10.  :port: 3000  
  11.  :daemon: false  
  12.  :cwd: /home/linux/projects/mongrel/testapp  
  13.  :includes:  
  14.  - mongrel  
  15.  :debug: false  
  16.  :log_file: log/mongrel.log  

然后到app的根目录下运行上述的命令,恭喜您,你启动成功了.
但是有个问题,如果我不在app的根目录下运行呢?系统会给出我们信息:

  1. !!! Path to log file not valid: log/mongrel.log  
  2. mongrel::start reported an error. Use mongrel_rails mongrel::start -h to get help.  

第一眼看见这个错误,觉得非常简单,Mongrels的创始人给出的答案是将相对路径改为绝对路径.
也许上述的方法能解决问题,但是我相信仍然有一种情况:即使改为绝对路径,还是出现同样的错误.
如果发生上述的错误应该怎么办?
不幸的是,上述的问题我已经碰见过,很长时间不得要领.文档看破皮了,还是不能运行.不得已,打开mongrels的源代码看看.最后发现需要指定工作目录,因为工作目录是在log之前验证的.
摘录一段代码:

ruby 代码
  1. module Mongrel  
  2.   class Start < GemPlugin::Plugin "/commands"  
  3.     include Mongrel::Command::Base  
  4.   
  5.     def configure  
  6.       options [  
  7.         ["-e""–environment ENV""Rails environment to run as", :@environment, ENV[’RAILS_ENV’] || "development"],  
  8.         ["-d""–daemonize""Run daemonized in the background", :@daemonfalse],  
  9.         [’-p’, ’–port PORT’, "Which port to bind to", :@port, 3000],  
  10.         [’-a’, ’–address ADDR’, "Address to bind to", :@address"0.0.0.0"],  
  11.         [’-l’, ’–log FILE’, "Where to write log messages", :@log_file"log/mongrel.log"],  
  12.         [’-P’, ’–pid FILE’, "Where to write the PID", :@pid_file"log/mongrel.pid"],  
  13.         [’-n’, ’–num-procs INT’, "Number of processors active before clients denied", :@num_procs, 1024],  
  14.         [’-t’, ’–timeout TIME’, "Timeout all requests after 100th seconds time", :@timeout, 0],  
  15.         [’-m’, ’–mime PATH’, "A YAML file that lists additional MIME types", :@mime_mapnil],  
  16.         [’-c’, ’–chdir PATH’, "Change to dir before starting (will be expanded)", :@cwdDir.pwd],  
  17.         [’-r’, ’–root PATH’, "Set the document root (default ’public’)", :@docroot"public"],  
  18.         [’-B’, ’–debug’, "Enable debugging mode", :@debugfalse],  
  19.         [’-C’, ’–config PATH’, "Use a config file", :@config_filenil],  
  20.         [’-S’, ’–script PATH’, "Load the given file as an extra config script", :@config_scriptnil],  
  21.         [’-G’, ’–generate PATH’, "Generate a config file for use with -C", :@generatenil],  
  22.         [, ’–user USER’, "User to run as", :@usernil],  
  23.         [, ’–group GROUP’, "Group to run as", :@groupnil],  
  24.         [, ’–prefix PATH’, "URL prefix for Rails app", :@prefixnil]  
  25.       ]  
  26.     end  
  27.   
  28.     def validate  
  29.       @cwd = File.expand_path(@cwd)  
  30.       valid_dir? @cwd"Invalid path to change to during daemon mode: #@cwd"  
  31.   
  32.       # Change there to start, then we’ll have to come back after daemonize  
  33.       Dir.chdir(@cwd)  
  34.   
  35.       valid?(@prefix[0].chr == "/" && @prefix[-1].chr != "/""Prefix must begin with / and not end in /"if @prefix  
  36.       valid_dir? File.dirname(@log_file), "Path to log file not valid: #@log_file"  
  37.       valid_dir? File.dirname(@pid_file), "Path to pid file not valid: #@pid_file"  
  38.       valid_dir? @docroot"Path to docroot not valid: #@docroot"  
  39.       valid_exists? @mime_map"MIME mapping file does not exist: #@mime_map" if @mime_map  
  40.       valid_exists? @config_file"Config file not there: #@config_file" if @config_file  
  41.       valid_dir? File.dirname(@generate), "Problem accessing directory to #@generate" if @generate  
  42.       valid_user? @user if @user  
  43.       valid_group? @group if @group  
  44.   
  45.       return @valid  
  46.     end  
  47.   
  48.     def run  
  49.       # Config file settings will override command line settings  
  50.       settings = { :host => @address,  :port => @port:cwd => @cwd,  
  51.         :log_file => @log_file:pid_file => @pid_file:environment => @environment,  
  52.         :docroot => @docroot:mime_map => @mime_map:daemon => @daemon,  
  53.         :debug => @debug:includes => ["mongrel"], :config_script => @config_script,  
  54.         :num_processors => @num_procs:timeout => @timeout,  
  55.         :user => @user:group => @group:prefix => @prefix:config_file => @config_file  
  56.       }  
  57.   
  58.      #……  
  59.   
  60.       if @config_file  
  61.         settings.merge! YAML.load_file(@config_file)  
  62.         STDERR.puts "** Loading settings from #{@config_file} (they override command line)." unless settings[:daemon]  
  63.       end  
  64.   
  65.       config = Mongrel::Rails::RailsConfigurator.new(settings) do  
  66.         if defaults[:daemon]  
  67.           if File.exist? defaults[:pid_file]  
  68.             log "!!! PID file #{defaults[:pid_file]} already exists.  Mongrel could be running already.  Check your #{defaults[:log_file]} for errors."  
  69.             log "!!! Exiting with error.  You must stop mongrel and clear the .pid before I’ll attempt a start."  
  70.             exit 1  
  71.           end  
  72.   
  73.           daemonize  
  74.           log "Daemonized, any open files are closed.  Look at #{defaults[:pid_file]} and #{defaults[:log_file]} for info."  
  75.           log "Settings loaded from #{@config_file} (they override command line)." if @config_file  
  76.         end  

看看上面的代码就非常清楚了.
那么如何解决,可以这样:

  1. mongrel_rails  start -c youapp/path/to -C mongrel.config  

这样就OK了.

扩展应用:可以配置为服务自动启动.

Confach发表于 September 17, 2007 4:19 pm | 留言 |一技之长 

上一页