拜读ribbon和ShiningRay的性能分析贴, 决定在 mac 上尝试一下 lightTPD + FastCGI 这种 rails 部署方式.
关于如何在 Leopard 上面编译安装, 这里有两篇极为详细的教程:
http://hivelogic.com/articles/view/ruby-rails-leopard
http://hivelogic.com/articles/view/installing-mysql-on-mac-os-x
同样也是从这个博主的文章中弄懂了 Unix-like 系统的目录结构, 明白了为什么要把自己编译的软件安装在/usr/local/下面. (03年就把自己闷在宿舍装 RedHat, 可是后来一直对 Unix-like 知之甚少.)
http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
有了前辈的探索, 这一路装来倒也没碰上太大的麻烦, 不过还是要注意以下几点:
ruby1.9 和 ruby-fcgi 不合, 研究如何部署到生产环境的话, 还是不要贪玩的好.
编译 mysql 的时候记得加 max 参数, rails 好多操作都是靠事务支持的, 所以离不开 InnoDB.
--with-plugins=max-no-ndb
关于下面的安装过程:
curl -O 代表下载文件, 要是你不喜欢这种方式, 也可以用别的软件来下载.
sudo 的前提是你得有个密码, 否则在输入密码那里直接回车是不被接受的.
第一步: 配置 PATH
编辑 .profile
1 | mate ~/.profile |
根据具体情况加入如下内容:
冒号分隔, 想要先查找的路径放前面, 最后那个 $PATH 代表系统原有的路径, 我们把它放到最末尾.
现在我们还没有这么多软件, 只是提前准备着.
1 | export PATH="/usr/local/ruby/bin:/usr/local/mysql/bin:/usr/local/lighttpd/bin:/usr/local/fcgi/bin:/usr/local/pcre/bin:/usr/local/bin:/usr/local/sbin:$PATH" |
重新加载配置
1 | . ~/.profile |
OK~, 根据前文提到的博主的建议, 让我们给源码建立一个目录统一管理:
1 | sudo mkdir -p /usr/local/src |
第二步: 安装 Ruby
虽然已经内置 ruby1.8.6 了, 不过我只是想亲自试一下安装过程.
内存大补贴(MBARIpatch)地址有点乱, 自己下载吧.
http://sites.google.com/site/brentsrubypatches
1 | curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.gz |
检查一下安上了没有:
1 | which ruby |
第三步: 安装 RubyGems
在你的 Mac 上面会有很多预置的 gem, 而且还 cleanup 不掉, 要是实在觉得碍眼, 可以查看一下路径, 然后重命名屏蔽掉, 但是千万别删除内置的 ruby, 否则后果很严重 (例如: textmate 失明.)
1 | gem environment |
gem 命令可以通过以下命令查看
1 | gem help commands |
命令参数是可以进行简化输入的, 只要不产生歧义. 例如:
1 | gem e # gem environment |
第四步: 安装 Rails
网慢是么? 把 rails 连同依赖包都下载到本地安装吧. 查看一下 rails 都依赖哪些 gem
1 | gem dependency rails -v 2.3.2 -r |
写这些文字的时候我看到的结果是6个 (其中 rake 要求 >= 0.8.3, 不过实际安装时却管我要 0.8.4, 不晓得为什么)
- rake (>= 0.8.3, runtime)
- activesupport (= 2.3.2, runtime)
- activerecord (= 2.3.2, runtime)
- actionpack (= 2.3.2, runtime)
- actionmailer (= 2.3.2, runtime)
- activeresource (= 2.3.2, runtime)
到 http://rubyforge.org 把这些 .gem 文件都下载回来, 放在一起, 文件名不要改.
1 | sudo cp /Downloads/*.gem . |
速度很快吧~ 要是不安装文档会更快.
1 | gem install -l rails-2.3.2.gem --no-rdoc --no-ri |
第五步: 安装 Mysql
网上流行的编译参数, 具体这些参数的含义, 我这个菜鸟目前还无法回答, 注意 —with-plugins=max-no-ndb
编译和安装的过程有点长 (加起来大约20分钟), CPU 有点热…
1 | curl -O http://mysql.mirror.tw/Downloads/MySQL-5.1/mysql-5.1.33.tar.gz |
既然是 DIY, 你就得自己运行脚本填充最初的系统表.
1 | cd /usr/local/mysql |
mac os x 是靠 launchd 守护进程运行的, 配置文件用的是 PropertyList (XML 格式), 通过观察发现每10秒检查一次, 发现进程不在就启动.
现在我们让 launchd 去看着 mysql, 保证它 7*24 都在运行.
方法是新建 /Library/LaunchDaemons/com.mysql.mysqld.plist 写入如下内容.
问:为什么是这个名字?
答:我看 apple 内置的文件都是这样命令的, 看起来像是 com.公司.产品.plist
1 | <?xml version="1.0" encoding="UTF-8"?> |
加入守护清单
1 | sudo launchctl load -w /Library/LaunchDaemons/com.mysql.mysqld.plist |
查看清单
launchctl list
解除守护
1 | sudo launchctl unload -w /Library/LaunchDaemons/com.mysql.mysqld.plist |
有了自己编译的 mysql, 当然少不了那个 C 版本的 ruby 驱动.
1 | curl -O http://rubyforge.org/fsr/download.php/51087/mysql-ruby-2.8.1.tar.gz |
mysql 的 make 文件比较完整, 你可以随时通过这份编译好的源码卸载掉它
1 | sudo make uninstall |
第六步: 安装 FastCGI
1 | curl -O http://www.fastcgi.com/dist/fcgi-2.4.0.tar.gz |
第七步: 安装 lightTPD
ribbon 的文章里告诫我们要先装 PCRE, 我们不要去怀疑:
1 | curl -O ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.8.tar.gz |
有了前辈经验作为铺垫, 安装倒也简单:
1 | curl -O http://www.lighttpd.net/download/lighttpd-1.4.22.tar.gz |
把默认配置文件复制出来
1 | cp ./doc/lighttpd.conf /etc/lighttpd.conf |
至于怎么配置, 有点超出我的能力范围了, 我只能勉强让它跑起来. 我只改动了下面几处:
- 开几个模块 mod_ rewrite access fastcgi simple_vhost cgi comtypo:codess accesslog
- 指定路径的时候不能用 ~/ 这样的路径
- 指定日志 accesslog.filename = “/var/log/lighttpd/access.log”, 这里的路径不是硬性规定, 但是记得如果没有这个目录的话要先创建.
lighttpd 配置:
$HTTP["host"] =~ ".+" {
server.document-root = "/Users/colder/Sites/rails/public"
server.error-handler-404 = "/dispatch.fcgi"
fastcgi.server = (".fcgi" =>
( "localhost" =>
( "min-procs" => 3,
"max-procs" => 3,
"socket" => "/tmp/rails.socket",
"bin-path" => "/Users/colder/Sites/rails/public/dispatch.fcgi",
"bin-environment" => ("RAILS_ENV" => "development")
)
)
)
}
launchd 的配置过程和 mysql 相似, 但也有点特殊. 从这份文件中可以看出如果守护的程序是带参数的, 那么第一个参数必须是程序本身. 参数名与参数值之前还不能留空格.
新建 /Library/LaunchDaemons/com.lighttpd.lighttpd.plist 写入如下内容:
1 | <?xml version="1.0" encoding="UTF-8"?> |
然后加载这个文件:
1 | sudo launchctl load -w /Library/LaunchDaemons/com.lighttpd.lighttpd.plist |
有了 launchd, mysql 和 lighttpd 的运行基本上不用担心了, 那 rails 的运行靠谁呢? 答案是 lighttpd. 配置文件说明了这一点, 当 lighttpd 启动的时候, 它会启动若干个 rails 实例 (数量由 min-procs 和 max-procs 决定). 即使是中途手动杀掉了 ruby 进程, 只要有请求进来, lighttpd 还是会去启动 rails 实例进行响应的.
OK~ 如果人品没有什么大问题的话, 到这里应该已经跑起来了, 这也正应了 rails 官方的那句台词:”先跑起来再说!”
如果跑不起来呢? 嗯! 我就碰到了下面的这个问题: 在 Windows 创建的 rails 项目, 复制到 Mac 上面就跑不起来了. 碰到这种情况, 看看你的rails目录下面的 public/dispatch.fcgi 开头第一句, 如果类似于: #!C:/Ruby/bin 这样的话, 请竖起中指!
然后心平气和的改成
1 | #!/usr/local/ruby/bin/ruby |
还有, 不要可惜了你的 Mac, 她不只有个光鲜的外表, 里边也很有内涵, 例如 tail
想知道 lighttpd 为什么启动不了的时候可以用它查看错误日志, 然后再一边修改配置, 一边回来查看这10秒一次的新日志.
1 | tail -f /var/log/lighttpd/error.log |
当然, 用在 rails 开发的时候会更合适:
1 | tail -f ~/Sites/rails/log/development.log |
经过这一番折腾, Rails 开发环境总算是跑起来了.
不是部署环境么?
呃. 就我目前的水平, 还不敢谈部署, 只想着用 ribbon 推荐的部署环境进行开发, 就已经满意了, 至于什么时候谈部署, 还得慢慢来, 现在水平还太烂, 深入学习 *nix 和 rails 才一个月, 不敢奢望太多.
至少目前很多问题还不好解决, 例如:
不知道为什么后端有时候会死掉, 而且 lighttpd 又不会去重开. (手动杀的就可以重开).
偶尔还会出现连接失败(开发环境, 小量请求).
好吧~ 世上没有十全十美, 不是么?