在Windows上部署Rails环境

11

是否有任何好方法可以在Windows机器上使用Apache部署基于Ruby 1.9.3和Rails 3.2.6构建的Ruby on Rails应用程序?我花费了数小时搜寻论坛,但是所有帖子似乎都太旧,无法与最新版本的Ruby和Rails一起使用。Mongrel不再开发,经常导致Rails崩溃,thin仅具有基本的Windows支持,并且在我的计算机上会导致Ruby运行时 "以异常方式终止",Passenger仅适用于Linux... 我有点迷失了。

是否有稳定,文档化良好的解决方案来服务于基于最新框架的Rails应用程序,并且可以在Windows上使用Apache?

更新

最终,我自己找到了解决方案。查看下面的指南,了解如何在Windows上部署Rails。


这只是一个猜测,但你是否在尝试使用Mongrel,并且使用了--prefix标志来启动? - thisfeller
我曾为一位客户查看过这个问题,我们考虑使用他们现有的戴尔机器...我们将其重新配置为Ubuntu服务器。 - TomDunning
@thisfeller,我没有使用前缀标志,因为根据这篇文章,自Rails 2.2以来,这种方法已经不再适用。 - jake
2个回答

16

更新:我刚刚回到了部署此进程的公司。在产品正在使用的11个月内没有进行任何维护的情况下,应用程序和服务器环境仍然运行得非常顺畅 :)

好的,看起来我终于弄明白了。请注意,我正在为公司内部网的一小群用户部署,因此我的解决方案可能并不适用于所有人。我使用了优秀的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)

    确保必要的模块没有被注释掉:

  5. 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>
    
  6. 为你的应用程序使用的每个Rails服务器创建一个Windows批处理文件(*.bat)。确保在你的负载均衡器上以生产模式运行它们,使用端口。例如,对于你的第一个服务器:

  7. @echo off
    cd D:\your_app_folder
    rails s -e production -p 3001
    
    注意:接下来的几个步骤是必需的,因为Rails服务器需要作为服务运行,否则如果没有用户登录到服务器,它们将被关闭。这也使它们能够在失败时自动重启。然而,Windows不能将批处理文件作为服务运行,所以我们必须将它们转换为Windows EXE文件。但标准的Windows EXE文件无法用作服务,因为它们不响应OnStart和OnStop方法。因此,为了让我们的服务器最终作为Windows服务运行,我们必须使用NSSM(Non-Sucking Service Manager)作为我们的Windows EXE文件的前端界面。
    1. 下载一个BAT到EXE转换器(只需搜索一下),并从批处理文件中创建EXE文件。确保您获取的转换器有一个选项,在运行时隐藏命令窗口(该选项通常称为“可见性”或类似内容)。
    2. 下载Non-Sucking Service Manager(nssm.exe)。将其放置在永久位置,并将该文件夹加入您的路径。
    3. 启动一个命令提示符。键入"nssm install ",其中是您想要服务命名的任何内容。将提示您输入要作为服务运行的应用程序的路径;选择您在第7步中创建的Windows EXE文件,然后单击安装,留空命令行选项。
    4. 为您的负载均衡器中的所有端口重复步骤6-8,为每个Rails服务器创建一个不同的服务。
    5. 启动您刚刚创建的所有服务(开始菜单->管理工具->服务)。服务应立即启动,但必须给Rails服务器至少30秒来进行初始化。
    6. 启动Apache。如果无法启动,请检查是否包括了所有必要的模块(列在第4步的第一部分中)。
    7. 导航到localhost:82,如果您自定义了端口号,请将其替换为您的端口号。您应该看到与开发环境完全相同的网站。如果这太长了不适合在StackOverflow上发布,请告诉我。我刚刚花费了很多时间来解决这个问题,并认为是时候有人写一个关于Windows上Rails部署的最新指南了(如果有的话,我还没见过)。祝好运,如果有人有问题或改进,请告诉我!

如果您已经安装了XAMPP(使用Bitnami安装程序),那么这样做不会破坏它吗? - Mr_LinDowsMac
@Mr_LinDowsMac 我从未尝试过那个,但我上面概述的步骤不应该会破坏它。唯一有可能影响您堆栈其他部分的是第四步,编辑您的 httpd.conf。即使如此,如果您确保将新的 <VirtualHost> 放在您尚未使用的端口上,那也不应该发生。我没有整合多个 Bitnami Stacks 的任何经验。也许您可以使用独立的 Ruby 安装程序,并从现有的 XAMPP 中使用它。不确定最佳方法是什么。 - jake

0

谢谢您的建议!我想我可能会尝试这个或者 Bitnami RubyStack,后者声称不需要任何配置。一旦我弄清楚了,我会让大家知道的。 - jake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接