ruby-on-rails - Windows 上的 Rails 部署环境

标签 ruby-on-rails windows ruby-on-rails-3 apache deployment

有没有什么好方法可以在 Windows 机器上使用 Apache 部署基于 Ruby 1.9.3 和 Rails 3.2.6 构建的 Ruby on Rails 应用程序?我花了几个小时在论坛上搜索,但所有的帖子似乎都太旧了,无法使用最新版本的 Ruby 和 Rails。 Mongrel 不再处于开发阶段并不断导致 Rails 崩溃,thin 只支持基本的 Windows 并且在我的电脑上导致 Ruby 运行时“以一种不寻常的方式自行终止”,Passenger 只支持 Linux ......我有点迷茫这一点。

是否有任何稳定的、有据可查的解决方案来为基于 Windows 上的 Apache 的最新框架构建的 Rails 应用程序提供服务?

更新

我最终得出了自己的解决方案。在下面查看有关在 Windows 上部署 Rails 的最新指南。

最佳答案

更新:我刚刚回到部署此流程的公司。在产品使用期间完全没有维护 11 个月后,应用程序和服务器环境仍然可以完美运行:)

好吧,看来我终于想通了。请注意,我正在部署到公司 Intranet 上的一小部分用户,因此我的解决方案可能不适用于所有人。我正在使用优秀的Bitnami RubyStack ,其中包含一个集成的 Apache/Rails/MySQL 安装。从那里我做了以下(适用于 Rails 3.2.6 和 Ruby 1.9.3):

  • 关闭所有 Apache 和 Rails(WEBrick/Thin/Mongrel/Unicorn)服务器。如果您打开了网站的任何开发版本,请退出您的网站。清除浏览器缓存。
  • 如果您还没有,请将您的数据库迁移到生产模式。从 RubyStack 命令行, cd 到您的应用程序目录,然后运行 ​​bundle exec rake db:migrate db:schema:load RAILS_ENV="production" .警告:db:schema:load 将删除生产数据库中的所有数据。
  • 预编译您的 Assets :bundle exec rake assets:precompile .请注意,这可能需要很长时间,具体取决于您的 Assets 。
  • 在您的 httpd.conf (对我来说是 C:\RubyStack-3.2.5-0\apache2\conf\httpd.conf)

    确保没有注释掉必要的模块:
    LoadModule expires_module modules/mod_expires.so
    LoadModule headers_module modules/mod_headers.so
    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    LoadModule rewrite_module modules/mod_rewrite.so
    

    然后将以下代码粘贴到文件中的某处,使用 app_name是 Rails 应用程序的文件夹名称和 *:82是 Apache 正在监听的任何端口号(由命令 Listen <port_number> 表示:
    <VirtualHost *:82>
    
      # Your server's web or IP address goes here.
      # You can leave at localhost if deploying to
      # company intranet or some such thing.
      ServerName localhost
    
      # Customize the next two lines with your app's public directory
      DocumentRoot "C:/RubyStack-3.2.5-0/projects/app_name/public"
      <Directory "C:/RubyStack-3.2.5-0/projects/app_name/public">
        Allow from all
        Options -MultiViews
      </Directory>
    
      RewriteEngine On
    
      # Redirect all non-static requests to Rails server,
      # but serve static assets via Apache
      RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
      RewriteRule ^/(.*)$ balancer://app_balancers%{REQUEST_URI} [P,QSA,L]
    
      # Serves dynamic rails assets from multiple servers
      # to improve performance. A Rails server such as
      # thin or WEBrick must be running on at least one of
      # these ports in order for Apache to serve your site
      <Proxy balancer://app_balancers>
        BalancerMember http://localhost:3001/
        BalancerMember http://localhost:3002/
      </Proxy>
    
      # Support for far-futures expires header
      <LocationMatch "^/assets/.*$">
        Header unset ETag
        FileETag None
        # RFC says only cache for 1 year
        ExpiresActive On
        ExpiresDefault "access plus 1 year"
      </LocationMatch>
    </VirtualHost>
    
  • 为您的应用程序将使用的每个 Rails 服务器创建一个 Windows 批处理文件 (*.bat)。确保在平衡器的端口上以生产模式运行它们。例如,对于您的第一台服务器:
    @echo off
    cd D:\your_app_folder
    rails s -e production -p 3001
    
  • 注意:接下来的几个步骤是必要的,因为 Rails 服务器需要作为服务运行,否则如果没有用户登录到服务器,它们将被关闭。这也允许它们在失败时自动重新启动。但是,Windows 无法将批处理文件作为服务运行,因此我们必须将它们转换为 Windows EXE。但是标准的 Windows EXE 不能用作服务,因为它们不响应 OnStart 和 OnStop 方法。所以,为了最终让我们的服务器作为 Windows 服务运行,我们必须使用 Non-Sucking Service Manager 作为我们 Windows EXE 的前端。
  • 下载一个 BAT 到 EXE 转换器(只是谷歌一个)并从你的批处理文件中制作 EXE。确保您获得的转换器在运行时具有隐藏命令窗口的选项(该选项通常称为“可见性”或类似名称。)
  • 下载 Non-Sucking Service Manager (nssm.exe)。把它放在永久的地方,然后将该文件夹添加到您的路径中。
  • 启动命令提示符。类型 nssm install <servicename> ,其中 <servicename>是您希望您的服务被调用的任何内容。系统将提示您输入要作为服务运行的应用程序的路径;选择您在步骤 7 中创建的 Windows EXE,然后单击安装,将命令行选项留空。
  • 对平衡器中的所有端口重复步骤 6-8,为每个 Rails 服务器创建不同的服务。
  • 启动您刚刚创建的所有服务(开始菜单 -> 管理工具 -> 服务)。服务应该立即启动,但您必须给 Rails 服务器至少 30 秒的初始化时间。
  • 启动 Apache 。如果它没有启动,请检查您是否包含了所有必需的模块(在步骤 4 的第一部分中列出)。
  • 导航至 localhost:82 ,如果您自定义它,请将您的端口号替换为 82。您应该会看到您的网站看起来与开发时完全一样。

  • 如果这太长而不适合 StackOverflow,请告诉我。我刚刚花了很多时间来解决这个问题,并认为是时候有人写一篇关于在 Windows 上部署 Rails 的最新指南了(如果有的话,我还没有看过)。祝你好运,如果有人对此有问题或改进,请告诉我!

    关于ruby-on-rails - Windows 上的 Rails 部署环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11252199/

    相关文章:

    ruby-on-rails - 米娜部署: ERROR: Deploy failed

    ruby-on-rails - Rails 3 - Delayed_Job (collectiveidea),试图延迟邮件程序 - 错误 : NoMethodError (undefined method `delay' for UserMailer:Class)

    ruby-on-rails - rails : permission denied for relation schema_migrations

    c++ - 如何在运行时加载 COM DLL

    css - Chrome 文本非常糟糕

    ruby-on-rails - Ruport - `each' :String 的未定义方法 ""

    sql - 带有 PostgreSQL 的 Rails 3 应用程序 - 获取按对话分组的消息列表

    javascript - Rails 茧 gem : populate multiple fields

    c++ - Cloud Files API 支持哪些 Windows 版本?

    ruby-on-rails - Rails 更新操作的路由助手是什么?