Comment diagnostiquer correctement une erreur 500 (Rails, Passenger, Nginx, Postgres)

J’ai du mal à diagnostiquer une erreur 500 de mon application en cours de production. Je l’ai déjà fait fonctionner, mais après le redéploiement via Capastrano, je n’arrive pas à le faire.

Voici les faits:

  1. Le serveur est configuré avec nginx + passenger et j’utilise PostgreSQL.
  2. Les actifs statiques fonctionnent correctement, car je peux y accéder facilement dans un navigateur.
  3. Je peux accéder à la console de rails via RAILS_ENV=production bundle exec rails console et effectuer des actions Active Record (comme pour récupérer des données à partir de la firebase database).
  4. Dans la console, je peux exécuter app.get("/") , qui renvoie également une erreur 500 (après avoir d’abord affiché la requête exécutée pour charger le modèle).
  5. Le fichier production.log n’est jamais écrit. J’ai mis les permissions 777 dessus pour le plaisir. J’ai également défini le niveau de consignation sur: debug sans rien montrer.
  6. Le journal nginx (que le passager utilise également) ne montre aucune indication d’erreurs, il signale simplement les erreurs de cache.

Parce que rien n’est utilisé, je ne sais pas quoi faire ici. J’ai essayé de définir une autorisation complète sur tout le répertoire de l’application sans aucune aide. Redémarré le serveur plusieurs fois, rien. La firebase database est là et les rails peuvent clairement communiquer avec elle. Je ne suis pas sûr de ce que j’ai fait pour le faire courir la première fois. Je ne sais pas pourquoi les rails ne produisent rien dans le journal.

Ok, j’ai compris ça. L’application fonctionnait bien en mode développement, alors je savais que quelque chose de spécifique à la production était en train de le foirer. Je suis allé dans config / environnements / production.rb et change ces parameters:

 # Full error reports are disabled and caching is turned on config.consider_all_requests_local = false # changed from true config.action_controller.perform_caching = true # changed from false 

Et puis, après le redémarrage du passager, les rails m’ont montré l’erreur avec stacktrace. Il s’avère que j’oubliais de précomstackr le pipeline d’actifs!

Choses à vérifier

1) Etes-vous sûr de fonctionner dans un environnement de production? Vérifiez si des entrées se trouvent dans le fichier development.log

2) Configurez votre application pour vous envoyer un e-mail lorsqu’une erreur 500 se produit avec une trace complète de la stack. J’utilise le joyau du Notificateur d’exception mais il y a beaucoup d’autres solutions pour cela.

3) Lorsque vous vérifiez votre application dans la console, êtes-vous sûr de démarrer la console en mode production? Il est possible que l’application ne démarre pas du tout et que vous ayez simplement oublié de définir le paramètre de production, pensant ainsi que l’application fonctionne correctement si ce n’est pas le cas.

4) Avez-vous une erreur nginx 500 ou une erreur Rails 500? Si nginx alors il est probable que votre application ne démarre pas du tout et très improbable que vous obtiendrez une erreur de rails dans votre fichier journal. Les ressources sont des fichiers statiques et leur navigation prouve qu’il n’existe rien d’autre que votre existence.

5) Êtes-vous sûr de vérifier le bon dossier sur le serveur? Cela semble vraiment stupide, mais capistrano pourrait déployer l’application sur un dossier différent de celui que ninx recherche pour votre application. Vérifiez donc le dossier que capistrano déploie et le dossier que nginx recherche.

Juste une suggestion, j’utiliserais plutôt Licorne que passager. C’est génial avec nginx.

Mon problème est que le fichier journal du passager ( error.log ) n’a rien. Ensuite, il s’agit d’un problème de journal de rotation. Courir

  passenger-config reopen-logs 

résolu mon problème. Plus

Avez-vous essayé de courir en mode développement pour voir si l’erreur se signale elle-même?