如何在生产中部署 resque 工作者?

Posted

技术标签:

【中文标题】如何在生产中部署 resque 工作者?【英文标题】:How to deploy resque workers in production? 【发布时间】:2010-12-16 11:42:04 【问题描述】:

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

我让它在本地工作,但我很难让它在生产中工作。有没有人:

    用于部署工作人员的 Capistrano 配方(控制工作人员的数量、重新启动它们等) 部署的工作人员将机器与运行主应用程序的地方分开,这里需要什么设置? 让 redis 在服务器重新启动后幸存下来(我尝试将其放入 cron 但没有成功) 您是如何在部署中使用 resque-web(他们出色的监控应用程序)的?

谢谢!

附:我在 Github 上发布了一个关于此的问题,但还没有回复。希望一些 SO 大师可以帮助解决这个问题,因为我在部署方面不是很有经验。谢谢!

【问题讨论】:

Resque 很糟糕,使用 Sidekiq。 【参考方案1】:

我参加聚会有点晚了,但我想我会发布对我有用的东西。本质上,我有上帝设置来监控 redis 和 resque。如果它们不再运行,上帝会重新启动它们。然后,我有一个 rake 任务,该任务在 capistrano 部署退出我的 resque 工作人员后运行。一旦工人退出,上帝会启动新的工人,以便他们运行最新的代码库。

这是我如何在生产中使用 resque 的完整文章:

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

【讨论】:

很棒的分享。将文件放在我的配置文件夹中,并替换从 bundle show resque 找到的 resque 版本号。谢谢!【参考方案2】:

我昨晚才发现这一点,对于 Capistrano,您应该使用 san_juan,然后我喜欢使用 God 来管理工作人员的部署。至于能否在重启后幸存,我不确定,但我每 6 个月重启一次,所以我不太担心。

虽然他建议了不同的启动方式,但这对我来说是最简单的。 (在您的 deploy.rb 中)

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

为了管理它在哪里运行,在另一台服务器上等,他在README 的configuration section 中进行了介绍。

我在我的切片上使用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 任务,它会为你节省大量时间来与上帝一起产生新的工人。

我遇到了很多麻烦,所以如果您需要更多帮助,请发表评论。

【讨论】:

Garrett 很棒的东西,感谢您的帮助!你是对的,这真的很令人困惑。我在下面添加了一些有助于我设置的更多细节。 加勒特,对上帝的部分仍然有些困惑。您是否将这些与 san_juan 一起使用? github.com/defunkt/resque/tree/master/examples/god 大神在部署的时候怎么把仓库里的新代码拿到worker机器上?我的工人正在加载环境。 另外,我并没有真正理解自定义resque:setup 任务的含义。您是否只是制作了一个这样的默认设置来加载它? pastie.org/private/bxpevk0g7tfntmvhn6gew这个我不太明白。 在 Capistrano 中我删除了 san_juan,这是非常有问题的,所以我自己制作了:gist.github.com/238268 gist.github.com/ed94682f99b6b47f02f7 - redis 是一种转变,我基于 resque 的。【参考方案3】:

加勒特的回答真的很有帮助,只是想发布更多细节。花了很多功夫才把它弄好……

我也在使用乘客,但使用的是 nginx 而不是 apache。

首先,别忘了你需要安装 sinatra,这让我很困惑。 sudo gem install sinatra

然后你需要为这个东西创建一个运行目录,并且它必须有一个 public 和 tmp 文件夹。它们可以是空的,但问题是 git 不会在 repo 中保存一个空目录。该目录必须至少有一个文件,所以我制作了一些垃圾文件作为占位符。这是 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 应用程序。但它有效。

这只是为了让监控应用程序运行。接下来我需要弄清楚上帝的部分。

【讨论】:

要跟踪和创建一个用于生产部署的空文件夹,只需在该目录中添加一个新文件.gitkeep 并在.gitignore 文件中忽略该目录。然后提交。 您现在可以将 resque-web 作为机架应用安装在生产应用的子路径上:railscasts.com/episodes/271-resque?view=asciicast【参考方案4】:

使用这些步骤,而不是使用 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

【讨论】:

以上是关于如何在生产中部署 resque 工作者?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 resque-web 监控 Coffee-resque 工作人员

如何清除卡住/陈旧的 Resque 工作人员?

如何破坏由resque工人排队的工作?

如何在不清除整个队列的情况下从 Resque 队列中删除特定作业?

Resque作业,如何停止正在运行的作业

部署为 WAR 时 JRuby 中的线程安全 Resque Workers