Windows上的Rails部署环境

agu*_*les 11 windows apache deployment ruby-on-rails ruby-on-rails-3

有没有什么好办法在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部署的最新指南.

agu*_*les 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
    
    Run Code Online (Sandbox Code Playgroud)

    然后将以下代码粘贴到文件中的某个位置,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>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 为您的应用将使用的每个Rails服务器创建一个Windows批处理文件(*.bat).务必在生产模式下在平衡器的端口上运行它们.例如,对于您的第一台服务器:

    @echo off
    cd D:\your_app_folder
    rails s -e production -p 3001
    
    Run Code Online (Sandbox Code Playgroud)
  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部署的最新指南(如果有的话,我还没有看到它).祝你好运,如果有人对此有任何问题或改进,请告诉我!