`
damezc
  • 浏览: 44595 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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@localhost

	DocumentRoot /var/www
	<Directory />
		Options FollowSymLinks
		AllowOverride None
	</Directory>
	<Directory /var/www/>
		Options Indexes FollowSymLinks MultiViews
		AllowOverride None
		Order allow,deny
		allow from all
	</Directory>

	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
	<Directory "/usr/lib/cgi-bin">
		AllowOverride None
		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
		Order allow,deny
		Allow from all
	</Directory>

	ErrorLog ${APACHE_LOG_DIR}/error.log

	# Possible values include: debug, info, notice, warn, error, crit,
	# alert, emerg.
	LogLevel warn

	CustomLog ${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 ruby
require 'rubygems'
require 'rack'
app = Proc.new do |env|
  Rack::Response.new.finish do |res|
    res.write "Hello, Rack!"
  end
end
Rack::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 start
www-data 22352  0.0  0.0  73512  1972 ?        S    20:10   0:00 /usr/sbin/apache2 -k start
www-data 22354  0.0  0.1 297392  3124 ?        Sl   20:10   0:00 /usr/sbin/apache2 -k start
www-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 start
www-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-enabled
sudo ln -s ../sites-available/sinatra 001-sinatra



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


允许rewrite模块,不然会报Invalid command 'RewriteEngine'错误
cd /etc/apache2/mods-enabled
sudo 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 ruby
require '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>
  AddHandler	fcgid-script .fcgi
  FcgidConnectTimeout 20
</IfModule>

开启fcgi模块,关闭fastcgi模块
sudo ln -s /etc/apache2/mods-available/fcgid.conf /etc/apache2/mods-enabled/fcgid.conf
sudo 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)
  end
end

Rack::Handler::FastCGI.run  Rack::PathInfoRewriter.new(Rails3Fcgi::Application)

改完后就顺利的跑起来了

public/.htaccess文件正常,无需更改,不过将来放到其他项目中估计要做相应的更改
SetEnv RAILS_RELATIVE_URL_ROOT /rails3_fcgi

RewriteEngine On

RewriteRule ^(stylesheets/.*)$ - [L]
RewriteRule ^(javascripts/.*)$ - [L]
RewriteRule ^(images/.*)$ - [L]

RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ rails3_fcgi.fcgi [E=X-HTTP_AUTHORIZATION:%{HTTP:Authorization},QSA,L]


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


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

0
0
分享到:
评论

相关推荐

    Ubuntu10.10下tftp服务器配置笔记

    Ubuntu 10.10 下 TFTP 服务器配置笔记 本文档介绍了在 Ubuntu 10.10 操作系统下如何配置 TFTP 服务器,从虚拟机网络配置到 TFTP 服务器的搭建,旨在帮助读者快速搭建 TFTP 服务器。 一、虚拟机网络配置 在 Ubuntu...

    新手XP下硬盘安装ubuntu10.10图文教程

    Ubuntu 10.10在2010年10月正式发布,让众多Ubuntu用户都对这款全新的系统充满期望。毕竟,Ubuntu 10.10是Canonical公司推出的最为用户友好的系统,而且为它添加了很多新的功能。  熟悉Ubuntu系统的用户了解,在...

    Ubuntu10.10下kgdb环境搭建

    ### Ubuntu10.10下kgdb环境搭建详解 #### 前言 随着Linux操作系统在嵌入式领域的广泛应用,内核级别的调试成为了许多开发者必须掌握的一项技能。不同于用户空间的应用程序,内核级别的调试更加复杂,因为它发生在...

    用Ubuntu10.10 dvd版本作为本地源,Ubuntu 10.10 DVD ISO挂载的方式来更新软件

    ### 使用Ubuntu 10.10 DVD ISO作为本地源更新软件的方法 在本文中,我们将详细介绍如何使用Ubuntu 10.10 DVD ISO文件作为本地软件仓库来更新系统中的软件包。这种方法对于网络不稳定或者带宽有限的环境非常有用,...

    Ubuntu10.10

    ### Ubuntu 10.10 在 Windows XP 下的安装指南及关键知识点 #### 安装环境与准备 - **操作系统**: Windows XP - **硬盘需求**: 至少 40GB 的空闲空间,用于安装 Ubuntu 10.10 和相关文件。 - **所需文件**: - **...

    Ubuntu10.10下嵌入式开发环境的配置.doc

    注意:如果是使用笔记本电脑并通过USB接口连接开发板,则在Ubuntu下的端口通常为`ttyUSB0`,而在Windows系统下则是`COM4`。 #### 四、配置NFS服务 为了方便在宿主机与目标机之间共享文件,可以配置NFS(Network ...

    Ubuntu10.10安装指南

    ### Ubuntu 10.10 安装指南详解 #### 引言 Ubuntu 10.10,代号"Maverick Meerkat",是一款备受赞誉的开源操作系统,基于Debian并采用Linux内核。它以其用户友好、稳定可靠的特点,赢得了全球无数用户的青睐。本文将...

    ubuntu10.10安装配置全过程图文详解

    ### Ubuntu 10.10 安装与配置全过程详解 #### 一、准备工作与下载 在开始安装之前,首先需要准备好相应的环境和资源。Ubuntu 10.10 的下载地址为:[http://www.ubuntu.org.cn/desktop/get-ubuntu/download/]...

    ubuntu-10.10镜像文件下载链接

    ### Ubuntu 10.10 镜像文件下载及使用指南 #### 一、Ubuntu 10.10 概述 Ubuntu 10.10,代号Maverick Meerkat,是Ubuntu发行版的一个版本,于2010年10月10日发布。该版本在桌面环境方面进行了多项改进,并引入了新...

    在U盘中安装Ubuntu 10.10的方法

    2. **Ubuntu 10.10安装介质**:准备一张Ubuntu 10.10的安装盘,可以是CD光盘或USB Live盘。如果使用的是ISO镜像文件,也可以使用如UNetbootin等工具将镜像文件制作成可引导的USB Live盘。 ##### 二、安装注意事项 ...

    ubuntu10.10下cuda+mpi的安装与配置

    在 Ubuntu 10.10 下,首先需要确保系统已安装 g++,因为 CUDA 的编译依赖于它。 1. **安装 g++** - 使用 `sudo apt-get install g++` 命令安装 g++。 - 检查 g++ 是否安装成功,可以运行 `which g++` 查看路径,...

    ubuntu 10.10网络配置10步曲

    ubuntu 10.10网络配置10步曲

    U盘安装ubuntu10.10图文教程

    U盘安装ubuntu10.10图文教程

    Ubuntu 10.10安装配置tftp服务.doc

    本文将详细介绍如何在Ubuntu 10.10环境下安装并配置TFTP服务,以确保服务的正常运行。 #### TFTP配置概述 TFTP服务在Ubuntu 10.10中的配置通常通过xinetd进程来实现。xinetd,即extended internet daemon,是新...

    IAR10.10最新软件 C51+ARM+破解包

    IAR10.10最新软件 C51+ARM+破解包。有详细的破解方法,给需要的人方便下载。由于文件太大无法上传。附上的是百度云的下载链接。

    在Ubuntu 10.10下安装JDK配置Eclipse及Tomcat

    在Ubuntu 10.10操作系统中安装和配置Java开发环境是开发Java应用程序的基础步骤。本文将详述如何安装JDK、配置环境变量、安装Eclipse IDE以及部署Apache Tomcat服务器。 首先,安装JDK(Java Development Kit)是...

    g++4.4 for ubuntu10.10 64bit

    在本文中,我们将深入探讨g++4.4在Ubuntu 10.10 64位环境下的安装、使用以及与其相关的GCC版本和libc-bin的关系。 首先,g++4.4是针对C++编程语言的一个特定版本,它包含了对C++标准库的支持和优化。在这个版本中,...

    一步一步教你在win7下硬盘安装Ubuntu10.10或者ylmf_os3.0

    在 Win7 下硬盘安装 Ubuntu10.10 或者 ylmf os3.0 本文将指导读者在 Win7 操作系统下硬盘安装 Ubuntu10.10 或者 ylmf os3.0,实现双系统共存。安装过程中需要注意的一些关键步骤和细节将被逐步介绍。 一、安装前的...

Global site tag (gtag.js) - Google Analytics