web-dev-qa-db-fra.com

Nginx ne peut pas trouver le fichier socket Unix avec Unicorn (aucun fichier ou répertoire de ce type)

Je déploie une application Rails 4 sur un serveur Fedora 19 x64 utilisant Nginx et Unicorn. Le problème est que j'obtiens une erreur lors de la visite de l'adresse: "Nous sommes désolés, mais quelque chose s'est mal passé . "

Mon journal des erreurs Nginx (/var/log/nginx/error.log) spectacles:

2014/03/08 03:50:12 [warn] 23934#0: conflicting server name "localhost" on 0.0.0.0:80, ignored
2014/03/08 03:50:12 [warn] 23936#0: conflicting server name "localhost" on 0.0.0.0:80, ignored
2014/03/08 03:50:14 [crit] 23939#0: *1 connect() to unix:/tmp/Unicorn.[app name].sock failed (2: No such file or directory) while connecting to upstream, client: [client IP], server: localhost, request: "GET /v1/industries/1.xml HTTP/1.1", upstream: "http://unix:/tmp/Unicorn.[app name].sock:/v1/industries.json", Host: "api.[app name].ca"

Autant que je puisse en voir, Nginx ne sait pas que le socket existe. Cependant, en regardant dans /tmp, Cela fait:

[root@localhost tmp]# ls
Unicorn.[app name].sock

Je reste bloqué à ce stade, peu importe comment je modifie mon fichier de configuration Unicorn ou mon fichier de configuration Nginx. Les deux sont exploités:

/var/www/[nom de l'application] /config/Unicorn.rb :

working_directory "/var/www/[app name]"
pid "/var/www/[app name]/pids/Unicorn.pid"
stderr_path "/var/www/[app name]/log/Unicorn.log"
stdout_path "/var/www/[app name]/log/Unicorn.log"
listen "/tmp/Unicorn.[app name].sock"
worker_processes 2
timeout 30

/etc/nginx/conf.d/default.conf :

upstream app {
    server unix:/tmp/Unicorn.[app name].sock fail_timeout=0;
}
server {
    listen 80;
    server_name localhost;
    root /var/www/[app name]/public;
    try_files $uri/index.html $uri @app;
    location @app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_Host;
        proxy_redirect off;
        proxy_pass http://app;
    }
    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}

La façon dont j'ai démarré ces deux démons est la suivante:

Unicorn_Rails -c /var/www/[app name]/config/Unicorn.rb -D -E production
service nginx start

Les journaux Unicorn ne contiennent aucune information pertinente, pas plus que les journaux de production. Cette configuration semble simple, quelqu'un a-t-il déjà vécu cela? Merci pour toute l'aide que vous pouvez apporter.

Au fait, je suivais initialement ce tutoriel: https://www.digitalocean.com/community/articles/how-to-deploy-Rails-apps-using-Unicorn-and-nginx-on-centos -6-5

42
jamsesso

Après plusieurs heures et un grand total de 3 bières, j'ai réussi à comprendre le problème. Après des heures de fouille, je suis finalement tombé sur ce Réponse de panne de serveur

En termes simples, il semble que les programmes qui créent des fichiers dans /tmp (ou /var/tmp comme je l'ai découvert) sont les seuls programmes capables de voir les fichiers dans ce répertoire. Unicorn était en train de créer le fichier socket UNIX, mais Nginx ne pouvait pas le voir.

La solution que j'ai employée consiste à demander à Unicorn de créer des sockets dans /var/sockets.

81
jamsesso

J'ai soudainement eu une situation similaire après avoir changé nginx pour utiliser un service de démarrage systemd basé sur leur modèle .

Il en résulte que le problème était avec PrivateTmp=true, ce qui fait que nginx était impossible d'accéder au fichier socket créé par gunicorn. Une fois que j'ai changé cela en PrivateTmp=false l'erreur résolue.

13
n8henrie