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

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

大家好: 我想达到一个启动启动后,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。这两个在环境中是做什么用的呢?

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

liwei78 回复

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

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

我想起来多年前学 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) 去办业务的话,那就会造成很多不相关的人对窗口处理能力无意义的消耗。因为有些人可能仅仅想问问当天的外汇汇率,有些人甚至走错了银行。有了大堂经理,简单业务几秒钟就处理了,而把柜台窗口的处理能力留给真正需要的人,另外还起到很多柜台窗口的负载均衡入口的作用。

推荐看看 monit

samport 回复

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

jasl 回复

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

samport 回复

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

jeffhappily 回复

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

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

Freeman1990 关闭了讨论。 10月27日 10:10
需要 登录 后方可回复, 如果你还没有账号请 注册新账号