部署 写给大家看的 Rails 部署:第一篇 简单快捷的部署方案

Rei · August 05, 2012 · Last by Rei replied at October 04, 2013 · 13400 hits

前言 Rails 是当今最优秀的 Web 框架,它大大提升了 Web 开发者的开发效率。但由于 Web 实质上是一门综合技术,牵涉的领域较多,没有其他 Web 开发经验的人也是不好上手 Rails 的。

最近,新手问题中部署相关的问题出现频率较高。其实现在并不是没有部署相关的书籍和文章,比如入门宝书《Web 开发敏捷之道》中就有一章的内容是专门讲部署。不过我观察发现,中文的资料普遍滞后,英文资料对于新手可能有难度。所以我萌生了写一系列、由浅至深的部署文章的想法。我的部署经验并不丰富,基本是伴随 CodeCampo 的上线运行积累起来的,很多时候处于得过且过的状态。如果能达到理解我的部署方案,并且找到更好的替代方案,那么就相当于越过了入门这道坎了,相信你就可以根据自己的需求优化自己的部署方案。

http://chloerei.com/2012/08/05/rails-deploy-guides-1-base-deploy/

文比较长,点击链接阅读全文。

如果是 ubuntu 12.0.4 并且使用 gnome terminal 的话,把这个加上把?否则使用 rvm use 会报错误的 https://rvm.io/integration/gnome-terminal/

#1 楼 @dfang 好,加上了。我用 kubuntu 的没留意到这个问题。

其实不是很理解 login shell 区分出来的意义,感觉是 shell 过度设计。又或者 rvm 为什么不直接把配置放到 .bashrc 里面?

慢慢看,部署这东西一定要放到 wiki 里 ps.wiki 里面的环境搭建方案真是太酷了,新 ubuntu 照着来一点困难都没有....除了 mysql2 还需要 sudo apt-get install libmysql-ruby libmysqlclient-dev

我当吃螃蟹的吧,昨天刚搭好 ubuntu 环境,照着你的来 希望能一次成功 - -

#3 楼 @evan 因为 rails 默认是用 sqlite3,所以没有把安装 mysql 的内容加进去。

接受多些反馈,完善了之后再放 wiki 吧。

#4 楼 @evan 推荐用 vbox 搭建虚拟机来练习。我写文的时候也是用虚拟机反复恢复快照来测试。

强烈支持 👍

[错误] 403 Forbidden!!! 我是 root 用户,/projects/myapp是root:root,权限应该怎么配?

[建议] 把原始的 nginx 启动 | 停止 | 重启命令也列出来

[问题] nginx 和 passenger 是不是配好跑起来这样就够了?以后如果出现性能问题,除了在缓存,数据库等方面进行优化,这里需要优化吗?比如配置

[错误] 403 Forbidden!!! 我在 nginx.conf 中把 user nobody 打开,重启的时候提示没有 nobody 这个 param; 然后我改成 user root,访问首页没问题,但是访问 controller 就出现错误 This application process is currently running as user 'nobody' and group 'nogroup'

期待第二篇

[建议] 提醒一下部署前先在项目下 rails -eproduction 试试看能不能跑起来

http://blog.ninjahideout.com/posts/a-guide-to-a-nginx-passenger-and-rvm-server 这个也不错 403 还是没解决,项目全部 chomd 777 也不行

#8 楼 @evan 不要用 root 权限部署应用。passenger 会自动用项目文件所属的用户运行应用,但是 root 用户权限太高了(应用的漏洞会影响整个系统的安全性),passenger 会使用默认用户(nobody)执行,导致权限不足。

http://www.modrails.com/documentation/Users%20guide%20Nginx.html#user_switching

#9 楼 @evan 改成 user nobody nogroup;,如果只有前面的参数会找同名的 gorup,但是没有 nobody 这个 group。同样也是安全问题,不要把 nginx worker 的用户用 root 来跑。

#12 楼 @evan 不要用 777。

其实我还想写用户权限的内容,不过怕第一篇塞太多内容会弄晕人,所以留待后篇了。

#12 楼 @evan rails s -e production 的提示加上了

先收藏了,马上要用了,哈哈!

@Rei 不行 不弄了 是不是不能在 root 用户下存放项目?期待后篇吧

[403 解决] 弄好了,还真是不能把项目放在 root 用户下,新建了个用户把项目放下面就没问题了

#18 楼 @evan 是的,不能放在 root 用户下。

@Rei 请问 nginx 和 passenger 是不是这样配好跑起来这样就够了?以后如果需要优化性能,除了在缓存,数据库等方面进行优化,这里需要优化吗?比如配置,意义大吗

#20 楼 @evan 需要优化。passenger 还有进程池,最小进程数,部署后马上载入这些参数可以设置。要合理利用服务器内存,进程数是需要配置的。

http://www.modrails.com/documentation/Users%20guide%20Nginx.html#_configuring_phusion_passenger

Rails 应用现在是多进程模型,要响应更多的请求,就开更多的进程,内存需求就越大。

@Rei 谢谢,非常感谢 如果有可能的话 不知道您能不能写下 Rails 性能优化方面的文章 因为 Rails 性能真的是一个头痛的问题 比如使用 redis, 缓存策略,甚至包括一些 gems 如果这个能完成 那么 rails 从搭建环境,部署,性能优化就全了 期待有天能出现像京东,淘宝那样用 rails 开发出来的网站。

#2 楼 @Rei 我都是 ln ~/.bash_profile ~/.bashrc 的。

其实很多人觉得部署困难是因为对 Linux 熟悉度的问题,很多人都是以为 Rails 学起来简单就来了,没有关注到 Rails 背后有一套庞大的 Web 开发体系。 所以我的建议是,当各位在部署遇到困难的时候,或许应该多花心思在 Linux 服务器的熟悉度上面。 说到底 Rails 部署也就 4 步:

  • 安装 Gem
  • 修改配置文件
  • 启动 App Server
  • 配置 Nginx 反向代理

而大多数人遇到的都是这些之外的。

#24 楼 @huacnlee 因为怕文章过长,把原定想写的用户权限给去掉了,结果发现用户权限果然是个问题。

26 Floor has deleted

#27 楼 @Guest 我不翻墙能打开

支持 LZ,让一个新手部署还是很难的

能不能贴一下 stand alone 模式 配置多个站点的?

#30 楼 @fresh_fish 我没有实践过,所知道的也是 31 楼链接的内容。

我还是喜欢用 puma,感觉 passenger 性能还是不够好,特别是日请求量上千万时,服务器内存和 CPU 消耗太大

#33 楼 @zeeler 你们的应用日请求上千万?

#34 楼 @huacnlee 给客户端做 API,请求上千万很正常的事情

#35 楼 @zeeler 期待分享一下高请求下的部署经验。

好文章,受益菲浅

#36 楼 @Rei 比较简单,基本就是 nginx + puma + rails-api(API 别用整个 rails 框架,太耗内存效率也低) + redis + memcached,我们的 API 不直接访问数据库的,都是从底层 API 获取数据,底层的有 lighttpd + fastcgi + php5.x 也有 nginx + tornado + python 2.7,不过我更建议 ruby 用 sinatra 框架,更轻量级,资源消耗更小一些;另外 cache 策略也很重要,有些更新变化不大的,cache 策略决定了性能。当然,你可以灵活一下,比如一些变化不频繁的列表,甚至可以静态化,用 rails 生成静态 json 或 xml 文件,这样就能发挥 web 服务器的性能,支持高并发量;一般来说,静态化并发支持的高,但响应速度可能不如使用内存的 cache,各有优缺点。至于 cache 的细节以后找机会聊吧,不是一两句能说完的,里面很多小技巧,google 一下也有很多文章。

哇喔,用 Passenger 的噢,先收藏晚點看哈哈.. 不過我比較喜歡 Unicorn + Nginx,希望這部分以後也看得到><

期待续作

#38 楼 @zeeler 感谢分享,有几个问题请教一下: 》redis 不也是和 memcached 一样的 kv 内存缓存吗?为什么还要同时使用呢? 》API不直接访问数据库而是直接访问底层怎么理解?

#41 楼 @itsvoid redis 和 memcached 不一样的,后者是 kv 缓存,前者不止如此,还支持队列等,两者应用场合不同。比如,一个产品介绍,有 2 个投票按键,一个是喜欢,一个是不喜欢,要缓存大量用户并发投票时,memcached 就不那么适用了。API 不直接访问数据库直接访问底层很简单呀,因为数据库不对 API 这层开放,只通过底层的 API 来提供服务,就像你调用新浪微博 openapi 一样,人家的数据最后肯定保存在数据库里面,你能直接访问到新浪数据库吗?

Linode 最低配置的,使用 Passenger 和 Unicorn 分别可以放多少个站点?就是一般的博客主页,访问人数不多的。听说 Unicorn 要比 Passenger 少一倍。。

我用 nginx + thin 在 linode 最低配置上,部署@Rei 的 codecompo,3 servers,表示毫无压力啊。 看我的配置http://test-china.org/topics/2

#43 楼 @JeskTop http://codecampo.com 这个网站,一个进程 40m 内存,我开了 3 个进程,大部分时间都是空闲的(多么希望遇到性能问题)。访问人数不多的时候,各个部署方案在性能上没什么差别,主要看你觉得是否方便管理。

Unknow user #46 August 14, 2012

@Rei 有空做个 railscast

这个头像真帅,看着很舒服!你本人吗?

#47 楼 @1272729223 是的 :kissing_face:

#45 楼 @Rei 楼主应该早点摆脱动漫萝莉妹子头像了。

专门注册个帐号来感谢楼主!希望能尽快出第二篇,期待第二篇啊!

#48 楼 @Rei 为啥现在没了……

#51 楼 @cqcn1991 旧博客废弃了,旧文章我看看也过时了,有空我更新一下内容重发一篇。

如果很急要找以前的内容可以看这里 https://github.com/chloerei/chloerei.com/tree/master/tech/_posts

#52 楼 @Rei 嗯,找到你博客发现也只有你 writings.io 的了。你这个话我倒是想起一个问题。就是社区一起写文章一起维护。不过一个人倒是也没办法维护别人的文章……

#52 楼 @Rei 删除了内容吗。。看不到了

#54 楼 @chareice 过时了,先找别的文章吧

You need to Sign in before reply, if you don't have an account, please Sign up first.