如何在生产中部署 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 工作人员