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

Rei · 发布于 2012年8月05日 · 最后由 Rei 回复于 2013年10月04日 · 8661 次阅读
1

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

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

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

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

共收到 55 条回复
1748
dfang · #1 · 2012年8月05日

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

1
Rei · #2 · 2012年8月05日

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

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

96
evan · #3 · 2012年8月05日

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

96
evan · #4 · 2012年8月05日

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

1
Rei · #5 · 2012年8月05日

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

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

1
Rei · #6 · 2012年8月05日

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

96
happypeter · #7 · 2012年8月05日

强烈支持 👍

96
evan · #8 · 2012年8月05日

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

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

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

96
evan · #9 · 2012年8月05日

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

244
fsword · #10 · 2012年8月05日

期待第二篇

15
huobazi · #11 · 2012年8月05日
96
evan · #12 · 2012年8月05日

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

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

1
Rei · #13 · 2012年8月05日 2 个赞

#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 来跑。

1
Rei · #14 · 2012年8月05日

#12楼 @evan 不要用 777。

1
Rei · #15 · 2012年8月05日

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

1
Rei · #16 · 2012年8月05日

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

2909
1272729223 · #17 · 2012年8月05日

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

96
evan · #18 · 2012年8月05日

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

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

1
Rei · #19 · 2012年8月05日

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

96
evan · #20 · 2012年8月05日

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

1
Rei · #21 · 2012年8月05日

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

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

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

96
evan · #22 · 2012年8月05日

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

374
fenprace · #23 · 2012年8月05日

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

2
huacnlee · #24 · 2012年8月06日

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

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

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

1
Rei · #25 · 2012年8月06日

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

26楼 已删除
2299
hawkflying · #27 · 2012年8月06日

http://chloerei.com/2012/08/05/rails-deploy-guides-1-base-deploy/ 怎么打不开? 难道这个地址在墙外?

1
Rei · #28 · 2012年8月06日

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

2622
jjym · #29 · 2012年8月06日

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

395
fresh_fish · #30 · 2012年8月06日

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

1
Rei · #32 · 2012年8月06日

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

1411
zeeler · #33 · 2012年8月08日

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

2
huacnlee · #34 · 2012年8月08日

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

1411
zeeler · #35 · 2012年8月08日

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

1
Rei · #36 · 2012年8月08日

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

2988
billie66 · #37 · 2012年8月08日

好文章,受益菲浅

1411
zeeler · #38 · 2012年8月08日 3 个赞

#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一下也有很多文章。

96
hechian · #39 · 2012年8月08日

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

96
jasonchi · #40 · 2012年8月08日

期待续作

1451
itsvoid · #41 · 2012年8月08日

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

1411
zeeler · #42 · 2012年8月09日

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

1164
jesktop · #43 · 2012年8月14日

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

808
lihuazhang · #44 · 2012年8月14日

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

1
Rei · #45 · 2012年8月14日

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

3165
Guest · #46 · 2012年8月14日

@Rei 有空做个 railscast

2909
1272729223 · #47 · 2012年8月14日

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

1
Rei · #48 · 2012年8月14日

#47楼 @1272729223 是的 :kissing_face:

1164
jesktop · #49 · 2012年8月15日

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

96
airysoar · #50 · 2012年8月17日

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

3873
cqcn1991 · #51 · 2013年9月08日

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

1
Rei · #52 · 2013年9月08日

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

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

3873
cqcn1991 · #53 · 2013年9月08日

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

5433
chareice · #54 · 2013年10月04日

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

1
Rei · #55 · 2013年10月04日

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

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册