问题 Windows上的Rails部署环境


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

是否有任何稳定的,有文档记录的解决方案,用于在Windows上使用Apache构建最新框架的Rails应用程序?

UPDATE

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


8019
2018-06-28 20:16


起源

这是一个完整的黑暗镜头,但你是在尝试mongrel,并从--prefix标志开始? - thisfeller
我看了一下这个客户,我们正在考虑使用他们现有的戴尔机器...我们将其重新用作ubuntu服务器。 - TomDunning
@thisfeller,我没有使用前缀标志,因为根据 这个 自从Rails 2.2以来这个帖子没有用。 - aguazales


答案:


更新: 我刚回到我使用此流程部署的公司。在产品投入使用后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应用程序的文件夹名称和 *: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>
    
  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服务运行,我们必须使用非吸引服务管理器作为我们的Windows EXE的前端。

  7. 下载BAT到EXE转换器(只需谷歌一个),并从您的批处理文件中生成EXE。确保你获得的转换器有一个选项,可以在命令窗口运行时隐藏它(该选项通常称为“可见性”或类似的东西。)

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

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

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

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

  12. 启动Apache。如果它没有启动,请检查是否包含所有必需的模块(在步骤4的第一部分中列出)。

  13. 导航 localhost:82如果您自定义它,请将您的端口号替换为82。您应该看到您的网站看起来与开发中的完全相同。

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


15
2017-07-23 20:25



如果您已经安装了XAMPP(使用Bitnami安装程序),该怎么办?这不会打破它吗? - Mr_LinDowsMac
@Mr_LinDowsMac我从来没有尝试过,但我上面概述的步骤不应该破坏它。唯一可能影响堆栈其他部分的是第4步,编辑httpd.conf。即便如此,如果您确保将新的<VirtualHost>放在尚未使用的端口上,也不会发生这种情况。我没有任何集成多个Bitnami堆栈的经验。也许您可以使用独立的Ruby安装程序,只需使用现有的XAMPP内容即可。不确定最好的方法。 - aguazales


XAMPP可能会帮助您实现这个,体面的指南: http://www.andriets.com/development-en/ruby/ruby-xampp-en.html


0
2017-07-03 15:09



谢谢你的建议!我想我可能会尝试使用这个或Bitnami RubyStack,它声称不需要任何配置。一旦我搞清楚,我就会让每个人都知道。 - aguazales