Nginx ne peut pas trouver le fichier unix socket avec Unicorn (pas de tel fichier ou répertoire)

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

Mon Nginx journal d'erreur (/var/log/nginx/error.log) affiche:

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"

d'après ce que je vois, Nginx n'est pas au courant que le socket existe. Cependant, en regardant dans /tmp, c'est fait:

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

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

/var/www/[nom de l'application]/config/licorne.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/par défaut.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 été le démarrage de ces deux démons est comme suit:

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

les registres Unicorn ne contiennent aucune information pertinente, pas plus que les registres de production. Cette configuration semble tout droit vers l'avant, quelqu'un a vécu cela avant? Merci pour toute aide que vous pouvez fournir.

au fait, j'ai d'abord suivi ce tutoriel: https://www.digitalocean.com/community/articles/how-to-deploy-rails-apps-using-unicorn-and-nginx-on-centos-6-5

39
demandé sur jamsesso 2014-03-08 21:57:26

2 réponses

après de nombreuses heures et un total de 3 bières, j'ai réussi à comprendre le problème. Après des heures à creuser, je suis finalement tombé sur ce Serveur Faute de réponse

en termes simples, il apparaît que les programmes qui créent des fichiers dans /tmp (ou /var/tmp comme je l'ai découvert) sont les seuls programmes qui sont en mesure de voir les fichiers dans ce répertoire. Unicorn créait le fichier UNIX socket, mais Nginx ne le voyait pas.

LA solution que j'ai utilisé est D'avoir Unicorn créer des sockets dans /var/sockets.

77
répondu jamsesso 2017-04-13 12:13:48

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 se termine que le problème était avec PrivateTmp=true, ce qui fait que nginx était impossible d'accéder au fichier de socket créé par gunicorn. Une fois que je l'ai changé en PrivateTmp=false l'erreur résolue.

9
répondu n8henrie 2016-01-01 03:04:33