J'ai une Rails application que j'exécute sur mon serveur. Lorsque je vais sur un bureau distant et que je tente de charger l'application, le serveur prend 3 à 4 minutes pour répondre avec un page HTML simple. Cependant, lorsque je charge la page localement sur le serveur, la page s'affiche en une seconde. J'ai essayé d'envoyer une requête ping au serveur à partir de mon bureau distant et les pings sont réussis dans un délai raisonnable.
Tout cela semble avoir commencé après avoir installé le client de base d'Oracle et SQLPLUS. Dois-je soupçonner Oracle? Quelqu'un a-t-il vécu quelque chose de similaire à cela?
Avoir le même problème ici (même un an plus tard). Sous Linux, vous devez faire ce qui suit:
Recherchez le fichier /usr/lib/Ruby/1.9.1/webrick/config.rb et modifiez-le.
Remplacez la ligne
:DoNotReverseLookup => nil,
avec
:DoNotReverseLookup => true,
Redémarrez webrick et cela fonctionnera comme un charme :)
Eu le même problème. Pour moi, ce post a tenu la solution. Si vous êtes sur Ubuntu, arrêtez (ou désinstallez) le avahi-daemon
. service avahi-daemon stop
arrête le démon.
Webrick se sent maintenant très rapide.
Le problème a un ancien rapport dans Rails Lighthouse , cependant, Ruby-on-Rails a déplacé leurs tickets vers github depuis lors; Kind regrettable que ce vieux problème persiste encore.
Sachez cependant que si vous utilisez avahi-daemon
pour quelque chose, comme recherche d'imprimantes et de scanners sur votre réseau, qui ne fonctionnera plus.
Juste eu le même problème. le
...
:DoNotReverseLookup => true,
...
a fait l'affaire pour moi aussi. Juste au cas où vous utilisez Ruby sous le rvm, voici le chemin à parcourir:
~/.rvm/rubies/Ruby-<version>/lib/Ruby/<version>/webrick/config.rb
"Thin" est maintenant une excellente option pour exécuter les deux localement et sur Heroku:
Site Web: http://code.macournoyer.com/thin/
Vous pouvez l'utiliser localement en mettant votre Gemfile:
gem "thin"
... puis exécutez bundle et démarrez votre serveur avec thin start
ou Rails s
.
Mise à jour sur Heroku
Thin est maintenant considéré comme un choix mauvais pour Heroku. Plus d'informations ici:
https://blog.heroku.com/archives/2013/4/3/routing_and_web_performance_on_heroku_a_faq
Leur recommandation:
Basculez vers un backend Web simultané comme Unicorn ou Puma sur JRuby, ce qui permet au dyno de gérer sa propre file d'attente de demandes et d'éviter le blocage sur les longues demandes.
J'ai eu un problème vaguement similaire qui s'est manifesté lors de l'accès à un serveur WEBrick via un VPN. Les demandes prendraient beaucoup de temps, la plupart sans rien se passer sur le fil. Étant donné que ni les gemmes mongrel
ni thin
ne fonctionnaient avec Ruby1.9 sur Windows et qu'il n'y avait aucun moyen que je m'implique dans la compilation de trucs à partir de la source, je devais m'en tenir à WEBrick.
Le correctif consistait à définir le paramètre de configuration DoNotReverseLookup
sur true
, lors de la création du serveur WEBrick:
server = HTTPServer.new {:DoNotReverseLookup => true, ...}
Vous pouvez utiliser Apache
ou installer Thin
. Dans votre Gemfile: gem 'thin'
Ou vous pouvez consulter la liste des serveurs Web pour Rails .
J'ai connu des retards de 10 secondes fréquemment avec Sinatra. Cet extrait de code l'a résolu pour moi.
Ajoutez ceci près du haut de votre app.rb
fichier
class Rack::Handler::WEBrick
class << self
alias_method :run_original, :run
end
def self.run(app, options={})
options[:DoNotReverseLookup] = true
run_original(app, options)
end
end
Voir source
J'essayais de le faire avec webrick sur 1.8.7 et je n'ai pas pu trouver la configuration à changer. Cependant, une astuce que vous pouvez utiliser consiste à ajouter au fichier hosts du serveur qui exécute webrick l'adresse IP qu'il essaie d'inverser la recherche.
Ceci est un ancien fil de questions et réponses qui m'a aidé à résoudre le :DoNotReverseLookup
problème sur une machine virtuelle de développement local et souhaitait ajouter des informations supplémentaires. Cette page Web explique l'erreur de régression in Ruby core qui conduit à ce problème apparaissant pour certains; l'accent est à moi; le long un court de tout cela est là est une requête d'extraction GitHub pour un Ruby correctif principal à cela et j'espère qu'il sera approuvé et fusionné dans une version bientôt-ish de Ruby:
Après quelques heures de dépannage, il s'est avéré que c'était le cas! Apparemment, quelque part dans l'évolution de la bibliothèque standard de Ruby de 1.8.6 à 2.0.0, WEBrick a acquis une nouvelle option de configuration
:DoNotReverseLookup
qui est défini surnil
par défaut. Puis, au plus profond des entrailles du code de traitement des demandes de WEBrick, il définit ledo_not_reverse_lookup
drapeau sur l'instance de socket de connexion entrante à la valeur deconfig[:DoNotReverseLookup]
. Étant donné que cette valeur estnil
, ce qui est faux, l'effet est le même que la définir surfalse
, en remplaçant le globalSocket.do_not_reverse_lookup
drapeau. Donc, sauf si vous avez:DoNotReverseLookup => true
dans votre configuration WEBrick, une recherche DNS inversée se produira toujours pour chaque nouvelle connexion, ce qui pourrait entraîner une latence grave.
Lié à cette découverte est ne requête pull GitHub de l'auteur proposant comment réparer le problème dans le code source Ruby WEBrick: Correction d'un bug de régression dans WEBrick's : Implémentation de l'option de configuration DoNotReverseLookup # 731
La solution décrite dans la demande consiste à modifier la ligne 181 dans lib/webrick/server.rb
à partir de ceci:
sock.do_not_reverse_lookup = config[:DoNotReverseLookup]
Pour ça:
unless config[:DoNotReverseLookup].nil?
Partager ici si quelqu'un tombe sur ce fil de questions/réponses bien considéré et est intéressé par les progrès dans la résolution de ce problème dans Ruby core. Espérons que cette attraction sera fusionnée ou que le problème sous-jacent sera traité dans d'une certaine façon dans la prochaine version de Ruby; peut-être 2.1.6?
Il s'agit d'une réponse très tardive, mais j'ai passé une bonne partie de la journée à déboguer ce problème avec Rails exécuté sur Vagrant. La modification de la recherche DNS inversée n'a pas amélioré les temps de demande. la combinaison de deux choses a pris le chargement de ma page de ~ 20 secondes à ~ 3 secondes en mode développement:
Remplacez WEBrick par bâtard. J'ai dû utiliser la version préliminaire ou elle ne serait pas installée:
Sudo gem install mongrel --pre
Ajoutez-le ensuite à mon Gemfile pour dev:
group :test, :development do
gem 'mongrel'
end
J'ai ensuite démarré mon serveur comme ceci:
Rails server mongrel -e development
Cela a coupé quelques secondes, 5 ou 6 secondes, mais c'était encore terriblement lent. C'était la cerise sur le gâtea - ajoutez ceci aussi au Gemfile:
group :development do
gem 'Rails-dev-boost', :git => 'git://github.com/thedarkone/Rails-dev-boost.git'
end
Dans ma probablement situation rare, cela a fonctionné après avoir vidé mes iptables, cela n'a eu aucun effet secondaire parce que je n'avais pas de règles personnalisées (juste Ubuntu par défaut permet tout):
Sudo iptables -F
Il n'y a pas d'option DoNotReverseLookup
dans Ruby 1.8.x webrick. La solution est de mettre:
Socket.do_not_reverse_lookup = true
quelque part au début de votre script.
Source: WEBrick et Socket.do_not_reverse_lookup: Un conte en deux actes