37 votes

Comment déployer les travailleurs resques en production ?

Les gars de GitHub ont récemment publié leur application de traitement de fond qui utilise Redis : http://github.com/defunkt/resque http://github.com/blog/542-introducing-resque

J'ai réussi à le faire fonctionner localement, mais j'ai du mal à le faire fonctionner en production. Est-ce que quelqu'un a :

  1. Recette Capistrano pour déployer les travailleurs (contrôler le nombre de travailleurs, les redémarrer, etc)
  2. Déploiement des travailleurs sur une ou plusieurs machines distinctes de celles où s'exécute l'application principale, quels sont les paramètres nécessaires ici ?
  3. obtenir redis pour survivre à un redémarrage du serveur (j'ai essayé de le mettre dans cron mais pas de chance)
  4. comment avez-vous intégré resque-web (leur excellente application de surveillance) dans votre déploiement ?

Merci !

P.S. J'ai posté un problème sur Github à ce sujet mais pas encore de réponse. J'espère que certains gourous de l'OS pourront m'aider sur ce point, car je ne suis pas très expérimenté en matière de déploiements. Je vous remercie !

29voto

tsmango Points 483

J'arrive un peu tard dans la soirée, mais j'ai pensé poster ce qui a marché pour moi. Essentiellement, j'ai configuré god pour surveiller redis et resque. S'ils ne fonctionnent plus, Dieu les redémarre. Ensuite, j'ai une tâche rake qui est exécutée après un déploiement capistrano qui quitte mes travailleurs resque. Une fois que les workers sont arrêtés, Dieu démarre de nouveaux workers pour qu'ils utilisent la dernière version du code.

Voici mon exposé complet sur la façon dont j'utilise resque en production :

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

9voto

Garrett Points 4295

Je l'ai découvert hier soir, pour Capistrano vous devez utiliser san_juan alors j'aime l'utilisation de Dieu pour gérer le déploiement des travailleurs. Pour ce qui est de survivre à un redémarrage, je ne suis pas sûr, mais je redémarre tous les 6 mois donc je ne suis pas trop inquiet.

Bien qu'il suggère différentes façons de le faire, c'est ce qui a fonctionné le plus facilement pour moi. (Dans votre deploy.rb)

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

Pour gérer l'endroit où il fonctionne, sur un autre serveur, etc. section de configuration de la README .

J'utilise Passenger sur ma tranche, donc c'était relativement facile, j'avais juste besoin d'avoir une config.ru comme suit :

require 'resque/server'

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

Pour mon fichier VirtualHost, j'ai :

<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>

Aussi, une note rapide. Assurez-vous de remplacer le resque:setup rake task, cela vous fera gagner beaucoup de temps pour faire naître de nouveaux travailleurs avec Dieu.

J'ai rencontré beaucoup de problèmes, alors si vous avez besoin d'aide, postez un commentaire.

4voto

Brian Armstrong Points 8259

La réponse de Garrett m'a vraiment aidé, je voulais juste poster quelques détails supplémentaires. Il a fallu beaucoup de bricolage pour y arriver...

J'utilise aussi passenger, mais nginx au lieu d'apache.

Tout d'abord, n'oubliez pas que vous devez installer Sinatra, cela m'a perturbé pendant un certain temps. sudo gem install sinatra

Ensuite, vous devez créer un répertoire pour que le truc fonctionne, et il doit avoir un dossier public et un dossier tmp. Ils peuvent être vides mais le problème est que git n'enregistrera pas un répertoire vide dans le repo. Le répertoire doit contenir au moins un fichier, j'ai donc créé quelques fichiers inutiles comme substituts. Il s'agit d'une fonctionnalité bizarre de git.

J'utilise le plugin resque, j'ai donc créé le répertoire à cet endroit (où se trouve le config.ru par défaut). Il semble que Garrett ait créé un nouveau répertoire 'resque' dans son rails_root. L'un ou l'autre devrait fonctionner. Pour moi...

cd MY_RAILS_APP/vendor/plugins/resque/
mkdir public 
mkdir tmp
touch public/placeholder.txt
touch tmp/placeholder.txt

Puis j'ai édité MY_RAILS_APP/vendor/plugins/resque/config.ru donc ça ressemble à ça :

#!/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

N'oubliez pas de changer ADD_SOME_PASSWORD_HERE au mot de passe que vous souhaitez utiliser pour protéger l'application.

Enfin, j'utilise Nginx donc voici ce que j'ai ajouté à mon nginx.conf

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

Et donc il est redémarré lors de vos déploiements, probablement quelque chose comme ceci dans votre deploy.rb

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

Je ne suis pas vraiment sûr que ce soit la meilleure façon de procéder, je n'ai jamais configuré d'applications rack/sinatra auparavant. Mais cela fonctionne.

C'est juste pour lancer l'application de surveillance. Ensuite, j'ai besoin de comprendre la partie divine.

1voto

Gull Points 793

Utilisez ces étapes au lieu de faire la configuration au niveau du serveur web et de modifier le plugin :

#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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X