11

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

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

更新

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

4

2 回答 2

16

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

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

  1. 关闭所有 Apache 和 Rails (WEBrick/Thin/Mongrel/Unicorn) 服务器。如果您打开了任何开发版本,请退出您的网站。清除浏览器缓存。

  2. 如果您还没有,请将您的数据库迁移到生产模式。从 RubyStack 命令行, cd 到您的应用程序目录,然后运行bundle exec rake db:migrate db:schema:load RAILS_ENV="production"​​. 警告:db:schema:load 将删除生产数据库中的所有数据。

  3. 预编译您的资产:bundle exec rake assets:precompile. 请注意,这可能需要长时间,具体取决于您的资产。

  4. 在你的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 应用程序的文件夹名称和*:82Apache 正在侦听的任何端口号(由命令表示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>
    
  5. 为您的应用程序将使用的每个 Rails 服务器创建一个 Windows 批处理文件 (*.bat)。确保在平衡器的端口上以生产模式运行它们。例如,对于您的第一台服务器:

    @echo off
    cd D:\your_app_folder
    rails s -e production -p 3001
    
  6. 注意:接下来的几个步骤是必要的,因为 Rails 服务器需要作为服务运行,否则如果没有用户登录到服务器,它们将被关闭。这也允许它们在失败时自动重新启动。但是,Windows 无法将批处理文件作为服务运行,因此我们必须将它们转换为 Windows EXE。但是标准的 Windows EXE 不能用作服务,因为它们不响应 OnStart 和 OnStop 方法。所以,为了最终让我们的服务器作为 Windows 服务运行,我们必须使用 Non-Sucking Service Manager 作为我们的 Windows EXE 的前端。

  7. 下载一个 BAT 到 EXE 转换器(只需 google 一个)并从您的批处理文件中制作 EXE。确保您获得的转换器具有在运行时隐藏命令窗口的选项(该选项通常称为“可见性”或类似名称。)

  8. 下载非吸吮服务管理器(nssm.exe)。把它放在永久的地方,然后将该文件夹添加到您的路径中。

  9. 启动命令提示符。类型nssm install <servicename><servicename>您希望调用的服务在哪里。系统将提示您输入您希望作为服务运行的应用程序的路径;选择您在步骤 7 中创建的 Windows EXE,然后单击安装,将命令行选项留空。

  10. 对平衡器中的所有端口重复步骤 6-8,为每个 Rails 服务器创建不同的服务。

  11. 启动您刚刚创建的所有服务(开始菜单 -> 管理工具 -> 服务)。服务应该立即启动,但您必须给 Rails 服务器至少 30 秒的时间来初始化。

  12. 启动阿帕奇。如果它没有启动,请检查您是否包含了所有必要的模块(在第 4 步的第一部分中列出)。

  13. 导航到localhost:82,如果您对其进行了自定义,请将您的端口号替换为 82。您应该看到您的网站看起来与开发中的完全一样。

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

于 2012-07-23T20:25:08.920 回答
0

XAMPP 可能会帮助您实现这一目标,这里有不错的指南:http ://www.andriets.com/development-en/ruby/ruby-xampp-en.html

于 2012-07-03T15:09:46.750 回答