Rails Ruby on Rails 开机启动的相关设置

Freeman1990 · 发布于 2017年08月30日 · 最后由 samport 回复于 2017年09月01日 · 515 次阅读
532215

大家好: 我想达到一个启动启动后, rails 也就跟着起来的效果。 根据之前的经验, 是将/path/of/app/rails server -d 命令放到了Linux 系统的/etc/rc.local 文件中了。 但是系统启动后,并没有启动rails 服务。 提示/usr/bin/evn 'ruby' No such file or directory 这个错误。 请问大家是用什么方式达到开机启动rails 服务的效果呢?

看了有些帖子写的是使用god + puma , 我没太看懂是什么意思。 还有的是用apache 或nginx 来启动rails ? 这块就更没有理解了。 rails 本身也是web服务器, 还需要apache 和nginx 来做什么呢? 小白一枚, 请不吝指教。 THX --------------------------------------- Update - --------------------------------------------------------------

找到了一个方法, 在/etc/init.d/目录下,添加puma 的开机启动, 参照了 https://github.com/puma/puma/tree/master/tools/jungle/init.d 这个。 可以达到rails 开机启动的效果... , 不知道这个做法是否 正确。 看上去是达到了我想要的效果。

还是有疑问, 就是大家在使用rails 的时候,引入进来了apache 和 nginx 。 这两个在环境中是做什么用的呢?

共收到 9 条回复
3469

sudo chmod +x /etc/rc.local

$ sudo vim /etc/rc.local

/usr/local/nginx/sbin/nginx
/etc/init.d/mysql start
sudo -H -u deploy bash -c 'source ~/.rvm/scripts/rvm; cd #{Dir.pwd} && ./bin/start

把启动脚本写到 ./bin/start 里

#!/usr/bin/env ruby
require 'pathname'
require 'fileutils'
include FileUtils

# path to your application root.
APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)

def system!(*args)
  system(*args) || abort("\n== Command #{args} failed ==")
end

chdir APP_ROOT do

  puts '== Installing Dependencies =='
  system! 'bundle install --local'

  puts "\n== Updating UI Assets =="
  system! 'RAILS_ENV=production rake assets:precompile'

  puts "\n== Starting Application Server =="
  system! 'RAILS_ENV=production rake pack:start'  -----> 这只是个例子,具体包装到 rake 里了

  puts "\n== Done =="
end

532215
3469liwei78 回复

感谢回复。 能问 个问题么?这里需要nginx ? 请问nginx 在这里是扮演了什么角色?

3469

nginx 是 web 服务器,rails 启动的服务是应用服务。

26232

我想起来多年前学java web编程时,问过老师同样的问题:既然Tomcat这个应用服务器既可以做java程序的容器,又可以当做普通的静态HTML及图片的Web服务器,为什么不直接将Tomcat修改成80端口,当做普通的Web服务程序用呢?

当时我的老师的解释是:Tomcat这种应用服务器主要目的是处理复杂的数据业务而不是简单的返回静态图片和页面,这也就意味着每次处理一个请求的成本都很高。而Apache或Nginx正好相反,它的主要目的就是处理静态内容,为此做了大量效率及安全上的优化,和应用服务器的静态内容处理能力以及安全性都根本就不是一个量级的。

通过nginx/apache(web服务) + puma/tomcat/php-fpm(应用服务)这种组合,能同时发挥两者的优势。另外,对于中等以上规模的生产环境中,还可以部署为一台apache/nginx后面对应多台相同的Tomcat/Puma等应用服务,实现应用服务器的负载均衡。

类似这个业务设计,其实在生活中也能找到案例,例如银行营业厅的取号机旁边站着的大堂经理(可以看成nginx)。如果没有他们,每个来银行的人都直接到柜台窗口(看成Puma)去办业务的话,那就会造成很多不相关的人对窗口处理能力无意义的消耗。因为有些人可能仅仅想问问当天的外汇汇率,有些人甚至走错了银行。有了大堂经理,简单业务几秒钟就处理了,而把柜台窗口的处理能力留给真正需要的人,另外还起到很多柜台窗口的负载均衡入口的作用。

1107

推荐看看monit

532215
26232samport 回复

非常非常感谢。 这个回答对我来说兼职太赞了。 因为不是做web 后台开发工作,只是偶尔做这方面的事情。 以前也一直有这个疑问, 今天被您解惑了。 感谢回复。

532215
1107jasl 回复

这个也可以达到想要的效果。 后来找到了在/etc/init.d/ 目录下增加 puma 的开机启动脚本。 这样也可以达到我的目的。 感谢回复

96
26232samport 回复

那如果用Amazon Cloudfront 和nginx有冲突吗?因为Cloudfront是cdn,也有proxy server,主要也是处理静态内容的吧?还是两者都是一样的东西呢?

26232
32jeffhappily 回复

我没完全理解你的问题,而且我对Cloudfront不熟悉。我常用的CDN是Cloudinary,仅仅是使用最单纯的图片CDN服务而已:让用户的浏览器在访问我的页面上时,不是从我的服务器获取图片,而是从Cloudinary的服务器下载图片。

我没有关注过Amazon Cloudfront提供的对一个网站整体的Proxy。我猜想是相当于在用户的apache或nginx网站前面增加了Squid反向代理,并且让网站域名指向反向代理的服务器。亚马逊的反向代理服务是分布式的,性能估计很强。Squid/CacheFlow/CDN反向代理 -> nginx -> AppServer这种三层结构已经不是小网站考虑的范围了。

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