Linux下Rails3 + Lighttpd + fcgi部署研究

    前言:为什么要研究Ruby on Rails的部署
    学习Ruby on Rails已经一段时间了,一直使用自带的WEBrick服务器进行开发。
    WEBrick是一款纯Ruby编写的服务器,使用方便,很适合开发环境下进行系统调试。但是它不支持多线程访问,换句话说,所有的Ruby请求都是按照到达的时间先后,顺序处理的,因此效率不高,无法应用在实际的生产环境中。所以今天研究了一下如何将Rails3应用部署到真实的线上环境中。
   
    搜集了一下当前比较流行的Rails部署方案,这些资料里面介绍了许多可选的方案:
    1、Agile Web Development with Rails (4th edition),Chapter 16;
    2、范凯的博客:在Linux平台上安装和配置Ruby on Rails详解;
    3、一个日本开发者的博客:Rails 3.0.0rc + lighttpd + FastCGI で無理矢理動かしてみた。
    其中,范凯在RoR部署方案深度剖析一文中详细列举和分析了各种方案的优缺点以及性能上的差异,十分有借鉴意义。他认为各个方案在性能方面的排序为:
    Lighttpd+FastCGI  >  Lighttpd+Mongrel  >  Nginx+Mongrel  >  Apache+Mongrel  >  Ngignx+FastCGI  >  Apache+FastCGI
    因此,本文也采取了和他相同的部署方案。但是,由于他的博客较老,Ruby on Rails两年来从2.x升级到了3.x,以前的部署步骤也发生了变化,按照他的方法已经无法成功部署Rails3应用了。因此,本文根据相关资料,进行了些尝试。
   
    我使用的环境如下:
    1、Linux ubuntu 2.6.32-32-generic #62-Ubuntu SMP Wed Apr 20 21:54:21 UTC 2011 i686 GNU/Linux
    2、gcc version 4.3.4 (Ubuntu 4.3.4-10ubuntu1)
    在开始部署之前,请确保你有一个Unix系统和较高版本的gcc编译器。
   
    一、安装Ruby解释器
    现在Ruby提供了针对Ubuntu平台的deb安装包,并且你也可以使用apt-get安装Ruby解释器,但是我仍然建议自行下载Ruby源代码编译安装。因为可以自己定制Ruby安装的路径,并且可以在编译过程中自行添加更多的特性,还可以自己控制安装的版本。
    Ruby的源代码可以从Ruby官方网站下载:Ruby解释器下载
    下载源代码包到本地Linux主机,然后解压缩,进入该目录,进行配置,编译和安装:
    tar xvfz ruby-1.9.2-p180.tar.gz
    cd ruby-1.9.2-p180
    ./configure -prefix=/opt/ruby-1.9.2-p180
    make && make install
  
    如果想浏览所有的configure参数,可以:
    ./configure -h
    如果不定制安装的目录,默认将安装到/usr/local目录下面。然而我建议自行定制一个ruby的安装目录,例如/opt/ruby-1.9.2-p180,这样便于以后的升级,不会和操作系统其他软件混在一起。而且今后可能会安装其他版本的Ruby解释器,通过分开目录安装还可以在不同的Ruby解释器之间切换。
 
    安装好以后,我比较喜欢在/usr/local/bin下面建立软连接的方式来把Ruby加入系统搜索路径:
    ln -s /opt/ruby-1.9.2-p180/bin/ruby /usr/local/bin/ruby
    ln -s /opt/ruby-1.9.2-p180/bin/gem /usr/local/bin/gem

    二、安装Ruby on Rails
    确认服务器已经连接互联网的情况下执行:
    gem install rails
    即通过gem从rubyforge网站下载rails所有依赖包安装。
  
    安装好rails以后,可以执行:
    ln -s /opt/ruby-1.9.2-p180/bin/rails /usr/local/bin/rails
    rails –v
    确认一下rails的版本。

    三、安装Ruby的数据库适配器
    Rails发行包中已经自带纯Ruby的MySQL数据库适配器,然而对于生产环境来说,我们仍然应该下载安装C版本的数据库适配器,以达到更好的性能。Rails升级到3.0之后,推荐使用mysql2作为MySQL驱动,从这里可以下载mysql2-0.2.11.gem
    gem install mysql2-0.2.11.gem -l -- --with-mysql-dir=/opt/mysql5
    注意--with-mysql-dir应该指向MySQL数据库的安装路径,如果数据库服务器和Web服务器不在同一台机器上,那么Web服务器上也必须安装MySQL软件,因为ruby的C版本MySQL适配器需要在编译的时候联接MySQL的系统库。

    四、安装fcgi支持库
    由于Ruby的fcgi支持库需要在编译的时候联接fcgi的系统库,因此我们需要先安装fcgi库,下载fcgi源代码发行包fcgi-2.4.0.tar.gz
    tar xzvf fcgi-2.4.0.tar.gz
    cd fcgi-2.4.0
    ./configure --prefix=/opt/fcgi-2.4.0
    make && make install
    同样,将fcgi安装在自己指定的目录下,而不是默认的/usr/local,避免多个软件混在一起。

    五、安装Ruby的FCGI支持
    接下来就可以安装ruby的fcgi支持库了,下载fcgi-0.8.8.tgz
    tar xzvf fcgi-0.8.8.tgz
    cd fcgi-0.8.8
    ruby install.rb config -- --with-fcgi-include=/opt/fcgi-2.4.0/include --with-fcgi-lib=/opt/fcgi-2.4.0/lib
    ruby install.rb setup
    ruby install.rb install
    注意:安装完毕之后,请确保/opt/ruby-1.9.2/lib/ruby/site_ruby/1.9.1/i686-linux/目录下有这三个共享库文件:fcgi.so  mysql.so  openssl.so,否则运行中会出现问题。如果缺少fcgi.so请重复步骤五,如果缺少mysql.so请重复步骤三,如果缺少openssl.so,请安装openssl库之后重复步骤一。

    六、安装Lighttpd Web Server
    在安装lighttpd之前,应该确认操作系统已经安装pcre,即Perl兼容的规则表达式库。
    如果没有,请执行:
    sudo apt-get install libpcre3 libpcre3-dev
 
    然后下载Lighttpd:
    http://www.lighttpd.net/download/
    tar xzvf lighttpd-1.4.28.tar.gz
    cd lighttpd-1.4.28
    ./configure --prefix=/opt/lighttpd-1.4.28
 
    configure完毕以后,会给出一个激活的模块和没有激活模块的清单,可以检查一下,是否自己需要的模块都已经激活,在enable的模块中一定要有“mod_rewrite”这一项,否则重新检查pcre是否安装。然后编译安装:
    make && make install

    七、配置Lighttpd
    将Lighttpd的示例配置文件拷贝到配置文件目录中放置:
    mkdir /etc/lighttpd
    cp ./lighttpd-1.4.28/doc/config/lighttpd.conf /etc/lighttpd/
    cp ./lighttpd-1.4.28/doc/config/modules.conf /etc/lighttpd/
    同时可以根据你的实际情况进行修改,主要修改如下:
    1)对/etc/lighttpd/modules.conf进行如下修改:
       server.modules = (
           "mod_access",
           "mod_alias",
           "mod_auth",
           "mod_evasive",
           "mod_redirect",
           "mod_rewrite",
           "mod_setenv",
           "mod_usertrack",
           "mod_fastcgi",
           "mod_simple_vhost",
           "mod_compress",
           "mod_accesslog",
       )
       这个文件设置了lighttpd需要开启的模块。
    2)对/etc/lighttpd/modules.conf进行如下修改:
       server.document-root, server.error-log,accesslog.filename需要指定相应的目录,如果没有创建对应的目录,lighttpd启动时会报错。
    3)用什么权限来运行Lighttpd
       server.username = "USER_NAME"
       server.groupname = "USER_GROUP"
       从安全角度来说,不建议用root权限运行Web Server,可以自行指定普通用户权限。
    4) 配置Lighttpd和Ruby on Rails之间的通信
       这一步配置十分重要,最简单的配置如下:
       $HTTP["host"] =~ "(^|\.)testmengli\.com" {
           server.document-root = "/home/jowett/mini/public"
           server.error-handler-404 = "/dispatch.fcgi"
           fastcgi.server = (".fcgi" =>
               ("localhost" =>
                   (
                     "min-procs" => 1,
                     "max-procs" => 2,
                     "socket" => "/home/jowett/mini/tmp/socket/rails.socket",
                     "bin-path" => "/home/jowett/mini/public/dispatch.fcgi",
                     "bin-environment" => ("RAILS_ENV" => "development")
                   )
               )
           )
       }
       即由lighttpd启动2个FCGI进程,lighttpd和fcgi之间使用本机Unix Socket通信。
       socket:指定了通信的socket文件的存放位置;
       bin-path:指定了request转发的程序位置;
       server.error-handler-404:指定了请求的资源找不到时,进行处理的程序。相当于把动态请求过滤给Ruby on Rails服务器进行处理。
       5) 配置mime
          必须设置mime配置文件,不然lighttpd无法识别css、image等资源类型。
         
          在/etc/lighttpd/lighttpd.conf中添加一行:
          include "mime.conf"
          然后创建mime配置文件:
          touch /etc/lighttpd/mime.conf
         
          并且加入如下内容:
          ##  MimeType handling
          ## -------------------
          ##
          ## Use the "Content-Type" extended attribute to obtain mime type if
          ## possible
          ##
          mimetype.use-xattr        = "disable"
          ##
          ## mimetype mapping
          ##
          mimetype.assign             = (
            ".pdf"          =>      "application/pdf",
            ".sig"          =>      "application/pgp-signature",
            ".spl"          =>      "application/futuresplash",
            ".class"        =>      "application/octet-stream",
            ".ps"           =>      "application/postscript",
            ".torrent"      =>      "application/x-bittorrent",
            ".dvi"          =>      "application/x-dvi",
            ".gz"           =>      "application/x-gzip",
            ".pac"          =>      "application/x-ns-proxy-autoconfig",
            ".swf"          =>      "application/x-shockwave-flash",
            ".tar.gz"       =>      "application/x-tgz",
            ".tgz"          =>      "application/x-tgz",
            ".tar"          =>      "application/x-tar",
            ".zip"          =>      "application/zip",
            ".mp3"          =>      "audio/mpeg",
            ".m3u"          =>      "audio/x-mpegurl",
            ".wma"          =>      "audio/x-ms-wma",
            ".wax"          =>      "audio/x-ms-wax",
            ".ogg"          =>      "application/ogg",
            ".wav"          =>      "audio/x-wav",
            ".gif"          =>      "image/gif",
            ".jpg"          =>      "image/jpeg",
            ".jpeg"         =>      "image/jpeg",
            ".png"          =>      "image/png",
            ".xbm"          =>      "image/x-xbitmap",
            ".xpm"          =>      "image/x-xpixmap",
            ".xwd"          =>      "image/x-xwindowdump",
            ".css"          =>      "text/css",
            ".html"         =>      "text/html",
            ".htm"          =>      "text/html",
            ".js"           =>      "text/javascript",
            ".asc"          =>      "text/plain",
            ".c"            =>      "text/plain",
            ".cpp"          =>      "text/plain",
            ".log"          =>      "text/plain",
            ".conf"         =>      "text/plain",
            ".text"         =>      "text/plain",
            ".txt"          =>      "text/plain",
            ".spec"         =>      "text/plain",
            ".dtd"          =>      "text/xml",
            ".xml"          =>      "text/xml",
            ".mpeg"         =>      "video/mpeg",
            ".mpg"          =>      "video/mpeg",
            ".mov"          =>      "video/quicktime",
            ".qt"           =>      "video/quicktime",
            ".avi"          =>      "video/x-msvideo",
            ".asf"          =>      "video/x-ms-asf",
            ".asx"          =>      "video/x-ms-asf",
            ".wmv"          =>      "video/x-ms-wmv",
            ".bz2"          =>      "application/x-bzip",
            ".tbz"          =>      "application/x-bzip-compressed-tar",
            ".tar.bz2"      =>      "application/x-bzip-compressed-tar",
            ".odt"          =>      "application/vnd.oasis.opendocument.text",
            ".ods"          =>      "application/vnd.oasis.opendocument.spreadsheet",
            ".odp"          =>      "application/vnd.oasis.opendocument.presentation",
            ".odg"          =>      "application/vnd.oasis.opendocument.graphics",
            ".odc"          =>      "application/vnd.oasis.opendocument.chart",
            ".odf"          =>      "application/vnd.oasis.opendocument.formula",
            ".odi"          =>      "application/vnd.oasis.opendocument.image",
            ".odm"          =>      "application/vnd.oasis.opendocument.text-master",
            ".ott"          =>      "application/vnd.oasis.opendocument.text-template",
            ".ots"          =>      "application/vnd.oasis.opendocument.spreadsheet-template",
            ".otp"          =>      "application/vnd.oasis.opendocument.presentation-template",
            ".otg"          =>      "application/vnd.oasis.opendocument.graphics-template",
            ".otc"          =>      "application/vnd.oasis.opendocument.chart-template",
            ".otf"          =>      "application/vnd.oasis.opendocument.formula-template",
            ".oti"          =>      "application/vnd.oasis.opendocument.image-template",
            ".oth"          =>      "application/vnd.oasis.opendocument.text-web",
          # make the default mime type application/octet-stream.
            ""              =>      "application/octet-stream",
          )

    八、启动Lighttpd
    在/etc/hosts文件中加入下面一行:
    127.0.0.1       testmengli.com
    Lighttpd的启动命令是:/usr/local/lighttpd/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
    通过以上步骤,就基本实现了Rails应用在生产环境下的部署,用到的技术包括Lighttpd+fcgi+mysql,希望对大家有帮助!

转载于:https://www.cnblogs.com/mengli/archive/2012/11/20/2778431.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

冒泡排序详解--python

我没学冒泡排序之前眼中的冒泡排序是这个样子的 哈哈哈 https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行! 如有转载,请注明…

uni-app和php交互DES加密解密数据

1 uni-app操作 (1) 打开HBuilderX的视图->显示终端 cd 切换到你项目的根目录 执行命令 npm install crypto-js 安装成功后你的项目根目录会生成node_modules文件夹,里面有crypto-js就说明成功了 (2)接下来在哪使用就直接import CryptoJS f…

字典超详细--python

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行! 如有转载,请注明出处(如不注明,盗者必究&#xf…

ele-plus包的安装和使用

代码仓库 版本详细说明,请查看doc下面的版本文件 最新版本 v0.2.4 安装 npm install ele-plus -S 复制代码引入ElePlus 完整引入 import Vue from vue import ElementUI from element-ui import element-ui/lib/theme-chalk/index.css import App from ./App.vue im…

两数之和-给定一个整数数组nums和一个目标值target,请你在该数组找出和为目标值的那两个整数,并返回他们的数组下标,你可以假设每种输入只会对应一个答案。但是,数组同一个元素不能使-python

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行! 如有转载,请注明出处(如不注明,盗者必究&#xf…

制作github博客

最近几天突发其想,想做一个GitHub的博客,链接https://imutang.github.io,然后决定先使用HUGO来制作我的第一个个人博客,编辑文字方面没有博客园这么方便 转载于:https://www.cnblogs.com/mutangchun/p/11363405.html

选择排序算法python

选择排序定义: https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行! 如有转载,请注明出处(如不注明&am…

如此互联网?

共享单车已经到了尾声,ofo的处境一直遮遮掩掩,用户押金的真金白银却不知何时才能退回,遥遥无期。Mobike也一样,一直在亏本,持续投资依然无法换来其盈利。 记得几年前,开始注意到街上停有Mobike。记得曾和同…

Python中的异常处理Try...except...finally的使用的简单理解

python中的异常处理1.Python中的异常处理定义2.Try…except…finally的使用3.代码4.运行结果1.Python中的异常处理定义 在程序运行的过程中,如果发生了错误就会报错,我们可以事先约定返回一个错误代码,这样就可以知道是否有错,以…

Aveva Marine 新建项目001

1# 项目代号定义,三个字符,例如Abc 2# 新建文件夹,命名为“Abc” 3# 新建文件名为evars.bat文件,放到项目文件夹的根目录 内容为: 1 SET Abc000项目文件夹路径\Abc000\ 2 SET AbcMAC项目文件夹路径\AbcMAC\ 3 SET …

在CSDN写文章头部生成标题目录

步骤: 1.点击帮助,再点击目录。 2.随后出现目录,再点击复制。 3.把你复制的东西粘贴到文章开头,将你想要作为目录的文字设置成为标题。注意:前面有几个井号键就是几级标题。 5.标题目录设置好之后,就可…

《图片另存为JPG/PNG/WebP》让WebP图片下载为PNG格式

WebP是google推行的新的图片格式, 可以使用更小的空间,保存更清晰的图片, 但由于格式较新, Adobe Photoshop CC 2019 20.0.2版本都无法打开查看, 所以我们需要保存网页中的WebP图片为通用性较强png格式 我们可以使用一款扩展程序图片另存为JPG/PNG/WebP, 将WebP格式图片转换为p…

python中对文件进行读和写

Python读取文件Open方法常用形式主要参数注意对文件进行写对文件进行读Open方法 打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,出现OSError报错。 常用形式 两个参数&#xff…

UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x80 in position 14: illegal multibyte sequence

错误情况: 解决办法: 代码; f open("F:\自动化测试工具\Pycharm的项目\老狼.txt", "r", encoding"utf-8")https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏…

散列表(算法导论笔记)

散列表 直接寻址表 一个数组T[0..m-1]中的每个位置分别对应全域U中的一个关键字,槽k指向集合中一个关键字为k的元素,如果该集合中没有关键字为k的元素,则T[k] NIL 全域U{0,1,…,9}中的每个关键字都对应于表中的一个下标值,由实际…

Python的os模块常用文件夹的增删改查详解

python常用os模块增os.makedirs("path\\目录") 用于递归创建目录删os.remove("path")用于删除指定路径(path)的文件os.rmdir("path"),用于删除指定路径(path)的目录改os.rename() 方法用…

Python中常用的Python time模块常用函数

常用函数time.time()函数time.localtime() 函数time.mktime()函数time.strftime() 函数time.strptime() 函数time.sleep() 函数https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载&#xff0c…

SyntaxError: ‘return‘ outside function 在python里面的报错问题

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) Return需要放在函数里面 报错情况: 报错代码&…

Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext

程序是spring boot的。更换了一台服务器就报这个错误了:Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext tomcat的服务是之前注册的,使用的是tomcat8。环境变量里面的java版本是1.7。 在网上看到说是tomc…

python中的以简单例子解释函数参数、函数定义、函数返回值、函数调用

python-函数1.函数定义2.自定义函数,基本规则3.语法4.参数4.1必备参数4.2默认参数4.3不定长参数4.4匿名参数5.函数举例代码1.函数定义 函数是组织好的,可重复使用的,用来实现功能的代码段。 2.自定义函数,基本规则 1.以 def 关…