ruby-on-rails - Rails 3.1 应用部署教程

标签 ruby-on-rails apache deployment passenger

我正在为服务器上的 Rails 3.1.1 应用程序寻找一个很好的部署教程。我所说的好实际上是指完整。我发布这个问题的原因是,尽管网络上有大量教程(谷歌、博客、书籍、其他计算器问题等),但它们似乎都集中在部署过程的问题上或者对与我需要的不匹配的部署环境做出一些假设。

我意识到在服务器上部署 Rails 应用程序需要各种不同的程序和工具,这些程序和工具需要进行配置,不知何故,我总是卡在看似“小”的事情上,这让我非常沮丧。

所以,让我们从头开始。我现在拥有的是一台可以通过SSH和域名访问的服务器,我们称之为 www.example.com .服务器运行一个全新的 Ubuntu 10.04 x64 并且只安装了一个用户,即 root(通过 root 我使用 SSH 访问服务器)。
笔记!没有安装 Apache、Ruby、PHP、MySQL、cPanel 或任何其他面板,只是全新安装的最低要求。

此外,Web 服务器将托管单个应用程序,而数据库将在同一台机器上运行。

据我所知,部署 Rails 应用程序的过程遵循以下场景:

  • 安装 Ruby

  • 我已经通过使用多用户安装过程使用 RVM 做到了这一点(仅仅是因为我只有 root 用户并且它会自动执行)。这似乎很好,但我确实有一些问题:

    直接安装 Ruby 而不是通过 RVM 安装会更有意义吗(我认为可能是在效率方面 - RVM 在以我不理解的方式修改一些 bash_profile 文件的场景背后也做了一些魔法,这以某种方式似乎侵入性...)?

    通过 RVM 以单独用户身份安装是否更有意义(是否会出现任何安全问题)?
  • 必备 gem

  • 既然安装了 Ruby,那么最好的初始 gem 集是什么?

    我只安装了 bundler,所以一旦我将应用程序上传到服务器上,我就可以运行 bundle install 命令,该命令将依次安装所需的应用程序 gem。

    问题 - 我应该事先安装 rails gem 吗?还有其他需要安装的 gem 吗?
  • 网络服务器

  • 这就是我觉得棘手的地方。我正在尝试使用 apache 和 mod-passenger 进行部署(它们似乎是最受欢迎的)。所以我安装了 apache web 服务器和乘客 gem 以及所有相关的依赖项(乘客提到的库)。

    现在,问题出现了。首先是用户相关。 Apache 是如何运行的?我的意思是在每个用户下?如果我安装它并使用 root 用户(重新)启动它,它会永久在 root 用户下运行吗?这是坏事吗?如果是,我应该创建另一个用户吗?如果是,如何?我应该将新用户放入哪些组,他应该拥有哪些权限(即他应该有权访问哪些文件夹)。在这种情况下如何启动 apache(在 root 下,在该用户下,在配置文件的某处添加一行等)
  • 网站配置

  • 网站配置的东西放在哪里?可以将它放入 apache.conf 中,还是应该在可用站点中创建一个新文件?或者我应该简单地重用已经存在的默认文件?如果在上一步中创建了一个新用户,他应该对配置文件拥有哪些权限?

    另外......最终将rails应用程序放在哪里?在哪个文件夹里最好?家下面的某个地方?也许在/var/www 下?我想知道这会如何影响为应用程序提供服务的 apache 进程的权限? (通常我在提供应用程序时遇到问题,它提示它没有特定文件夹的权限。此外,使用新的 Assets 管道 - 我不完全理解 - 正在创建 Assets 文件,他们似乎没有继承父文件夹权限...)
  • 数据库

  • 作为数据库,我使用 MySQL 并且安装它非常简单。我在这里的问题再次与用户相关。我应该为数据库使用特殊用户吗? MySQL 如何实际管理用户(他们是内部用户,还是 Linux 用户或......?)。数据库用户应该与上面的“网络用户”相同吗?或者它应该是一个不同的?
  • Assets

  • 在这里,我真的迷路了。我真的很难让 Assets 管道正常工作。我已经检查了 railscasts 集和 rails 网站教程,我似乎在理论上理解了这件事,但我在实践中遇到了问题。

    所以这里的问题是 - 我应该运行什么命令来预编译 Assets ? (尝试运行 rake Assets :预编译)。可以吗?我应该在 production.rb 文件中更改什么?生成的 Assets 如何与上面创建的网络用户或数据库用户相关联?我个人在这一步遇到了一个问题,即日志文件说某些 css 文件无法访问(例如,我在供应商/ Assets 文件夹下安装了 jqplot 库并且无法访问它的文件 - 我应该在这里添加一个 list 文件吗? ?)。

    如果有人能给我指出一篇很好的文章或解释所有这些内容的资源,那就太好了。我遇到问题的主要领域是 Apache、Passenger、Ruby、Rails 和 MySQL 如何与 Linux 用户交互。如何正确设置 Rails 应用文件夹的权限? Assets 管道如何影响用户权限?

    谢谢

    最佳答案

    这是我部署 Rails 的方式:

  • 安装 Ruby

  • 我不会使用 RVM,因为将它与 cron 作业之类的东西结合起来正常运行非常棘手。可行(例如使用包装器),但有点麻烦。如果您在该机器上不需要其他 Ruby 版本,只需自己从源代码安装它。
  • gem

  • 就让 Bundler 发挥它的魔力吧。记得用标志安装 --without test development --deployment .不过,我不会事先这样做。只要确保你有捆绑器。
  • 网络服务器

  • 使用Passenger(使用Apache 或Nginx)是一个很好且简单的选择。当您从 apt 安装 Apache 时,它​​将以特殊用户身份运行。

    Apache 在 Ubuntu 上自动正确配置。它将在重新启动时启动。
  • 网站配置

  • 所有配置都在/etc/apache2.conf 中。将您的虚拟主机配置放在/etc/apache2/sites-available 中并使用 a2ensite启用它。

    将您的应用放入 /var/www ,因为这是 Ubuntu 中的默认位置。我通常会创建一个部署用户。

    通过将您的应用程序分配给 www-data 来确保用户可以访问您的应用程序团体。
  • 数据库

  • MySQL 有自己的用户系统。以 root 用户身份登录并使用 SQL 创建一个新用户:GRANT ALL ON 'application_production'.* TO 'deploy' IDENTIFIED BY 'some password';
  • Assets

  • Assets 应作为拥有应用程序的用户生成。您应该将任何 css 和 javascript 文件添加到 production.rb。例如:
    config.assets.precompile += %w(backend.css)
    
  • 结论

  • 使用像 Capistrano 这样的部署工具会有所帮助。 .当您运行时 capify , 取消注释 Capfile 中的相应行获取 Assets 编译。这是我的:
    ENV['RAILS_ENV'] = 'production'
    load 'deploy' if respond_to?(:namespace) # cap2 differentiator
    load 'deploy/assets'
    load 'config/deploy'
    require 'capistrano/ext/multistage'
    require "bundler/capistrano"
    require 'capistrano_colors'
    

    这就是我通常安装 Rails 应用程序的方式。我希望这会让你继续前进。最近我写了一个gem用于集成Chef -与 Capistrano 独奏,被称为 capistrano-chef-solo .它非常 alpha,如果您刚开始部署,可能会有点太复杂,但它可能对您有所帮助。

    关于ruby-on-rails - Rails 3.1 应用部署教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8114848/

    相关文章:

    ruby-on-rails - :autosave property of has_many associations broken in Rails 2. 3.4?

    css - 使用 bootstrap-sass gem 覆盖 Rails 中的 Bootstrap 变量

    css 无法在 apache 后面的 glassfish(bootsfaces primefaces)上运行 jsf 应用程序

    php - 使用 apache 2.2.17 安装 PHP 5.3.5 时出现问题(apache 崩溃)

    deployment - .NET Core - 'dotnet publish' 命令如何工作?

    ruby-on-rails - 如何使用 ActiveRecord 在 SQLite3 中设置 FTS 虚拟表?

    ruby-on-rails - 如何转换事件记录模型验证

    php - 如何让 php/apache 使用 AT 守护进程来安排任务

    jsp - Tomcat下部署javabean是否必须使用webapps/ROOT文件夹

    asp.net-mvc - 部署的 ASP.NET MVC 4 项目无法运行