有没有什么好办法在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部署的最新指南。
更新: 我刚回到我使用此流程部署的公司。在产品投入使用后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将删除生产数据库中的所有数据。
预编译您的资产: bundle exec rake assets:precompile
。请注意,这可能需要一个 非常 很长一段时间取决于你的资产。
在你的 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服务运行,我们必须使用非吸引服务管理器作为我们的Windows EXE的前端。
下载BAT到EXE转换器(只需谷歌一个),并从您的批处理文件中生成EXE。确保你获得的转换器有一个选项,可以在命令窗口运行时隐藏它(该选项通常称为“可见性”或类似的东西。)
下载 非吸吮服务经理 (nssm.exe)。把它放在永久的地方并将该文件夹添加到您的路径中。
启动命令提示符。类型 nssm install <servicename>
,哪里 <servicename>
是你希望你的服务被调用。系统将提示您输入要作为服务运行的应用程序的路径;选择您在步骤7中创建的Windows EXE,然后单击“安装”,将命令行选项留空。
对您的balancer中的所有端口重复步骤6-8,为每个Rails服务器创建不同的服务。
启动刚刚创建的所有服务(“开始”菜单 - >“管理工具” - >“服务”)。服务应该立即启动,但您必须至少给Rails服务器初始化30秒。
启动Apache。如果它没有启动,请检查是否包含所有必需的模块(在步骤4的第一部分中列出)。
导航 localhost:82
如果您自定义它,请将您的端口号替换为82。您应该看到您的网站看起来与开发中的完全相同。
如果这个太长而不适合StackOverflow,请告诉我。我花了很多时间来解决这个问题,并认为有人写了一篇关于Windows上Rails部署的最新指南(如果有的话,我还没有看到它)。祝你好运,如果有人对此有任何问题或改进,请告诉我!