39

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

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

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

谢谢!

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

4

4 回答 4

29

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

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

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

于 2010-05-27T16:45:22.027 回答
9

我昨晚才想通,对于 Capistrano 你应该使用san_juan,然后我喜欢使用上帝来管理工人的部署。至于能否在重启后幸存,我不确定,但我每 6 个月重启一次,所以我不太担心。

尽管他建议了不同的启动方式,但这对我来说是最简单的。(在您的 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:setuprake 任务,它会为你节省大量时间来与上帝一起产生新的工人。

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

于 2009-11-14T21:28:16.410 回答
4

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

我也在使用乘客,但使用的是 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 应用程序。但它有效。

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

于 2009-11-18T20:51:50.570 回答
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

于 2011-07-04T11:08:41.237 回答