【问题标题】:OS X: Development & Production Deployment for RoR with Apache and PassengerOS X:使用 Apache 和 Passenger 的 RoR 开发和生产部署
【发布时间】:2013-11-17 10:53:05
【问题描述】:

由于接下来的几天尝试为 Rails、Apache 和Passenger 设置开发环境,我的脑袋快要从混乱中爆炸了。

我的问题是:

  1. 开发环境需要乘客吗?我可以只用 pow.cx 开发吗? - 我 99.99% 确定答案是否定的(你不使用乘客进行开发),但我需要确认,因为我现在很困惑。
  2. 当我部署时,我只使用Passenger,对吗? IE。在部署之前,我从不接触乘客。
  3. 我的开发环境是否正确?
  4. 生产部署只是在Passenger 和Apache VHOST 的影响下移动rails 应用程序?

背景(我建议你阅读):

似乎网络上的所有信息都关心为已经知道自己在做什么的人解释事情,而不是详细解释事情是如何工作的,这只是一系列安装步骤,这让我非常困惑事物的作用,以及如何设置开发环境和正确部署 RoR 应用程序 - 所以请耐心等待这个冗长的问题。

在过去的 3 天里,我一直在尝试在我的 Macbook Pro 上设置一个开发环境,该环境不会被 Apple 对 Apache 安装的可笑限制所破坏。我安装了一个自定义的 Apache 安装(从 bitnami 使用他们的 ruby​​ 堆栈,因为我拒绝使用 Server.app),这样我就可以运行 Apache 并将 PHP 之类的东西轻松升级到 5.5,而且效果很好。

我正在尝试进入 RoR,但到目前为止,这一直是一场斗争,我准备放弃了。

我知道您需要 Apache 来为 Rails 应用程序提供服务,以便服务器可以同时处理请求,而不是一次处理一个请求,并且存在各种接口,例如 Thin 或其他;强烈推荐乘客。

我按照他们的说明安装了Passenger,并为Bitnami 乘客安装做了一些修改,而不是Mac OS X 上的默认Apache - 它正在工作。当我启动 apache 并运行时:passenger-memory-stats 我从安装指南中得到预期的结果,这告诉我乘客正在运行。

但是,当我尝试部署一个简单的 hello world Rails 应用程序时,我收到大量“我们很抱歉……”或者根本没有结果,只是一个空白页。

我相当确定我的开发环境是正确的,除了最后一点之外一切正常。我可以想象在 pow.cx 服务器上进行的开发,一旦部署准备就绪,您只需复制 Rails 应用程序并配置 Apache 的 VHOST 以指向您准备好部署的应用程序,而让 Passenger 处理其余部分,对吗?

我通过 Postgress.app 使用 PostgresSQL,服务器工作正常,我可以连接到它。

我的 Gemfile 中有 gem 'pg'

我已经阅读并尝试了以下 SO 问题的所有可能的解决方案,但我要么没有得到任何结果,要么是空日志,这……至少可以说是令人愤怒:

综上所述,我正在尝试使用以下命令部署这个 hello world 应用程序(在标准 Rails 服务器上运行):

通过以下方式调用应用程序:

http://dmarket.local:8081/

虚拟主机:

<VirtualHost *:8081>

    PassengerEnabled on

    RailsEnv production
    ErrorLog /Applications/rubystack/apache2/htdocs/helloworld/project_error.log
    CustomLog /Applications/rubystack/apache2/htdocs/helloworld/project_error.log combined

    ServerName dmarket.local:8081
    ServerAlias www.dmarket.local:8081
    DocumentRoot "/Applications/rubystack/apache2/htdocs/helloworld/public"

    PassengerPreStart http://dmarket.local:8081

    <Directory "/Applications/rubystack/apache2/htdocs/helloworld/public">

        Allow from all
        Options -MultiViews

    </Directory>

</VirtualHost>

主机文件:

127.0.0.1   dmarket.local
127.0.0.1   www.dmarket.local

DATABASE.YML(开发、测试和生产相同):

  adapter: postgresql
  encoding: unicode
  host: 127.0.0.1
  port: 5432
  database: tsujp
  pool: 5
  username: tsujp
  password: 

【问题讨论】:

    标签: ruby-on-rails apache deployment passenger development-environment


    【解决方案1】:

    您的问题的答案摘要

    • 您不需要开发中的乘客。您可以使用 Pow 进行开发,并使用Passenger 进行部署。

      但是如果你愿意,可以在开发中使用Passenger。在开发中使用Passenger 是一个好主意,因为这样您的开发环境将更加匹配您的生产环境,从而降低在部署时遇到意外问题的风险。

      在开发中使用Passenger 非常容易。 Use it's Standalone mode,并运行 passenger start 而不是 rails server

    • Pow 严格来说是一个仅用于开发的服务器。作者建议不要在生产中使用它。
    • 部署时,您触摸Passenger。在部署时间之前,您必须接触Passenger,但您可以
    • 生产部署确实是在Passenger的作用下移动一个应用程序,并设置一个虚拟主机。当然,您还需要安装 gems (bundle install) 设置数据库(编辑 config/database.yml)、运行数据库迁移 (bundle exec rake db:migrate) 等。

    我还发布了您链接到的帖子的更新,以便让碰巧通过搜索找到这些帖子的人的生活更轻松。

    Apache 与 Nginx

    你会发现很多人推荐 Nginx(例如 Sergio 就这样做了)。我支持该建议。 Nginx 比 Apache 更快,能更好地处理慢速客户端,并且通常更易于使用。

    Passenger 与 Nginx 配合得很好。 It has an Nginx integration mode 就像 Apache 模式一样简单。 Sergio 建议使用 Nginx + Unicorn 或 Nginx + Puma,但 Nginx + Passenger(取代 Unicorn/Puma)更容易设置、性能出色、使用更少的内存、工作得更好并且功能更多。 Nginx + Unicorn 需要大量配置,使用init脚本进行进程管理等。

    但这只是建议。你没有使用 Nginx。坚持使用 Apache + Passenger 很好。 Apache 对大多数人来说都足够好用。

    关于您的乘客问题

    但是,当我尝试部署一个简单的 hello world Rails 应用程序时,我收到大量“我们很抱歉……”或者根本没有结果,只是一个空白页。

    每当您遇到意外错误时,您应该做的第一件事就是阅读日志文件。有两个日志文件对您很重要:

    • Web 服务器错误日志,通常是 /var/log/apache/error.log。此日志文件包含:

      • Phusion 乘客错误消息。
      • Rails 应用程序写入 STDERR 的所有内容。这通常包括 Rails 在启动期间遇到的错误(但不是它在处理请求时遇到的错误)。
    • Rails 开发日志(或生产日志,如果您在生产中运行),log/development.log(或log/production.log)。在请求处理期间发生错误时,通常会在此处记录。此文件包含 Rails 在启动期间遇到的错误。

    错误消息通常会告诉您问题是什么以及如何解决。

    这个技巧也可以在the Phusion Passenger manual, Troubleshooting section.找到

    卡皮斯特拉诺

    Sergio 推荐 Capistrano。我支持该建议。您应该记住 Capistrano 补充乘客;它不会取代乘客。 Capistrano 是一个用于自动化任务的工具。您当前是否创建应用程序的 tarball 并将其 scp 到您的服务器,然后在那里解压?好吧,Capistrano 会为您自动完成这类事情。

    有关堆栈的所有不同部分(Apache、Passenger、Capistrano、HAProxy、Chef 等)如何组合在一起的更多信息,请查看@987654324 上的“大局”部分@。

    推荐总结

    • 在开发中使用passenger start。这是迄今为止最容易上手的。您无需编辑任何配置文件,它立即生效。
    • 在生产环境中使用 Phusion Passenger for Nginx。

    【讨论】:

    • 言语无法形容这为我清除了多少东西。非常感谢,我会按照您描述的方式研究使用 Nginx 和Passenger。
    【解决方案2】:

    不需要开发中的乘客。事实上,在开发模式下,你甚至不需要 apache。您可以使用内置的 Webrick 服务器 ($ rails server) 来运行您的应用程序。是的。 Pow 是一个很好的工具,我一直在使用它。

    在生产中也有多种选择。其中之一是 Apache+Passenger,是的。但是你需要把 Nginx 放在前面(因为 Apache 不能很好地处理慢速客户端)。如果你有 nginx,那么你可以用别的东西替换 apache+passenger。很长一段时间以来,我一直在使用 Unicorn(来自 github 的 ruby​​ Web 服务器)。现在我最喜欢的是彪马。它比独角兽使用更少的资源,但对您的代码有更多要求(最好是线程安全的,因为 puma 是一个线程服务器)。

    现在,关于开发-生产差异:众所周知,开发应该尽可能地类似于生产,因为它可以最大限度地降低部署时的风险。所以,我的建议是:到处使用独角兽(开发和生产)。仅在生产环境中将 nginx 放在其前面。

    还有,

    要实际执行部署,请查看 Capistrano。它成为部署 Rails 应用程序的行业标准(但它也可以部署 PHP、静态文件和你拥有的东西)。

    【讨论】:

    • Phusion Passenger 已经有一段时间的 Nginx 模式了。事实上,Passenger + Nginx(而不是 Passeger + Apache)是当今的首选。没有必要仅仅因为你想使用 Nginx 而使用 Unicorn/Puma。乘客也比 Unicorn 和 Puma 使用更少的内存。客运在不断发展;现在,Passenger 中有很多独角兽和彪马没有的功能。
    • 对。事实上,我当时正在使用 nginx 模块。但它在概念上是一样的:nginx 作为反向代理,将请求分发给后端。实际上,在这种情况下添加 Apache 是不必要的。
    • 非常感谢,这为我澄清了一些事情 - 以及您在其中包含的一些最佳实践。我一定会关注他们的。
    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2023-03-29
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2014-12-08
    相关资源
    最近更新 更多