如何在生产环境中部署Resque工作者?

39

GitHub最近发布了他们的后台处理应用程序,其中使用了Redis: http://github.com/defunkt/resque http://github.com/blog/542-introducing-resque

我已经在本地使它工作,但是我很难使它在生产环境中工作。有没有人可以提供以下帮助:

  1. Capistrano配方以部署worker(控制workers数量,重启它们等)
  2. 将Worker部署到与主应用程序运行不同的机器上,这里需要什么设置?
  3. 让redis在服务器重新启动后继续运行(我尝试将其放在cron中,但没有成功)
  4. 您如何将resque-web(他们出色的监视应用程序)集成到您的部署中?

谢谢!

P.S. 我在Github上发布了一个问题,但还没有回复。希望一些SO大牛可以帮忙解决这个问题,因为我在部署方面缺乏经验。谢谢!


Resque很糟糕,使用Sidekiq。 - Damien Roche
4个回答

29

我来晚了,但想分享一下我的解决方案。基本上,我使用god监测redis和resque的运行状态。如果它们停止运行,god会重新启动它们。然后,我有一个rake任务,在capistrano部署后运行,该任务关闭我的resque工作进程。一旦工作进程被关闭,god将启动新的工作进程,以运行最新的代码库。

以下是我如何在生产环境中使用resque的完整说明:

http://thomasmango.com/2010/05/27/resque-in-production


太好了,感谢您的分享。我将文件放入我的配置文件夹并替换了从bundle show resque中找到的resque版本号。非常感谢! - Matt Gaidica

9

我昨晚刚想到,对于 Capistrano,你应该使用 san_juan,然后我喜欢使用 God 来管理工人的部署。至于如何在重启后存活,我不确定,但我每六个月重启一次,所以不太担心。

虽然他建议了不同的启动方式,但这是对我最容易实现的方法。(在您的 deploy.rb 中)

require 'san_juan'
after "deploy:symlink", "god:app:reload"
after "deploy:symlink", "god:app:start"

为了管理它的运行,例如在另一个服务器上,他在README配置部分中介绍了相关内容。
我在我的服务器上使用Passenger,所以这相对简单,我只需要有一个类似于下面这样的config.ru文件即可:
require 'resque/server'

run Rack::URLMap.new \
  "/" => Resque::Server.new

我的VirtualHost文件中有:

<VirtualHost *:80>
        ServerName resque.server.com
        DocumentRoot /var/www/server.com/current/resque/public

        <Location />
          AuthType Basic
          AuthName "Resque Workers"
          AuthUserFile /var/www/server.com/current/resque/.htpasswd
          Require valid-user
        </Location>
</VirtualHost>

此外,快速提醒一下。确保覆盖resque:setup rake任务,这将为使用God生成新工作进程节省大量时间。
我遇到了很多麻烦,所以如果您需要更多帮助,请发表评论。

很棒的东西,Garrett,感谢你的帮助!你说得对,这真的很令人困惑。我在下面添加了一些更详细的信息,对我的设置有所帮助。 - Brian Armstrong
Garrett,关于神的部分还有点困惑。你是在和san_juan一起使用这些吗?http://github.com/defunkt/resque/tree/master/examples/god/当你部署时,god如何将新代码从存储库传输到工作机器上?我的工作机器正在加载环境。 - Brian Armstrong
另外,我并不是很明白他们所说的自定义resque:setup任务的含义。你是否只是像这样创建了一个任务,并使用默认设置进行加载?http://www.pastie.org/private/bxpevk0g7tfntmvhn6gew 我并没有真正理解这个。 - Brian Armstrong
在Capistrano中,我删除了san_juan,它非常有问题,所以我自己写了一个:http://gist.github.com/238268 - Garrett
https://gist.github.com/ed94682f99b6b47f02f7 - Redis的这个有点临时性,我是基于Resque的那个来做的。 - Garrett
没问题,我知道尝试深入了解新技术并想砸电脑的感觉。 - Garrett

4
Garrett的回答真的很有帮助,只想再附加几个细节。要做得正确需要很多调试...
我也使用passenger,但是是nginx而不是apache。
首先,不要忘记您需要安装sinatra,这让我纠结了一段时间。 sudo gem install sinatra
然后,您需要为运行程序创建一个目录,并且必须拥有public和tmp文件夹。它们可以为空,但问题是git不会在存储库中保存空目录。该目录必须至少有一个文件,因此我制作了一些占位符垃圾文件。这是git中的奇怪特性/错误。
我正在使用resque插件,所以我在那里创建了该目录(默认的config.ru所在位置)。看起来Garrett在他的rails_root中新建了一个'resque'目录。两者都可以工作。对我来说...
cd MY_RAILS_APP/vendor/plugins/resque/
mkdir public 
mkdir tmp
touch public/placeholder.txt
touch tmp/placeholder.txt

然后我编辑了MY_RAILS_APP/vendor/plugins/resque/config.ru文件,使其看起来像这样:

#!/usr/bin/env ruby
require 'logger'

$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/lib')
require 'resque/server'

use Rack::ShowExceptions

# Set the AUTH env variable to your basic auth password to protect Resque.
AUTH_PASSWORD = "ADD_SOME_PASSWORD_HERE"
if AUTH_PASSWORD
  Resque::Server.use Rack::Auth::Basic do |username, password|
    password == AUTH_PASSWORD
  end
end

run Resque::Server.new

不要忘记将ADD_SOME_PASSWORD_HERE更改为您想要用来保护应用程序的密码。

最后,我正在使用Nginx,这是我在nginx.conf中添加的内容:

server {
  listen   80;
  server_name  resque.seoaholic.com;
  root /home/admin/public_html/seoaholic/current/vendor/plugins/resque/public;
  passenger_enabled on;
}

因此,在您的部署中重新启动,可能会像在您的deploy.rb文件中一样执行以下操作:

run "touch #{current_path}/vendor/plugins/resque/tmp/restart.txt"

我不确定这是否是最佳方法,因为我以前从未设置过rack/sinatra应用程序。但它可以工作。

这只是为了启动监控应用程序。接下来我需要弄清楚god部分。


要跟踪并创建生产部署的空文件夹,只需在该目录中添加一个名为.gitkeep的新文件,并在.gitignore文件中忽略该目录。然后提交它。 - millisami
现在,您可以将Resque-Web作为机架应用程序挂载到生产应用程序的子路径上:http://railscasts.com/episodes/271-resque?view=asciicast - m33lky

1

使用以下步骤,而不是在 Web 服务器级别上进行配置和编辑插件:

#The steps need to be performed to use resque-web with in your application

#In routes.rb

ApplicationName::Application.routes.draw do
  resources :some_controller_name
  mount Resque::Server, :at=> "/resque"
end

#That's it now you can access it from within your application i.e
#http://localhost:3000/resque

#To be insured that that Resque::Server is loaded add its requirement condition in Gemfile

gem 'resque', :require=>"resque/server"

#To add  basic http authentication add resque_auth.rb file in initializers folder and add these lines for the security

Resque::Server.use(Rack::Auth::Basic) do |user, password|
  password == "secret"
end

#That's It !!!!! :)

#Thanks to Ryan from RailsCasts for this valuable information.
#http://railscasts.com/episodes/271-resque?autoplay=true 

https://gist.github.com/1060167


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