Nginx et Unicorn Bad GatewayConnect () à Unix: /tmp/Mobile.Socket ont échoué et échoué (111: Connexion refusée)

StackOverflow https://stackoverflow.com/questions/9445545

Question

J'essaie (j'essaie) de configurer un serveur Ubuntu 11.04 sur RackSpace pour exécuter une application Rails 3.2 avec Nginx et Unicorn. J'ai trouvé ce blog génial http://techbot.me/2010/08/deployment-recipes-deploying-monitoring-andSecury-your-rails-application-to-a-cllean-ubuntu-10-04-install-using-nginx-et- Licorne/ Cela m'a aidé massivement et en dehors des problèmes de configuration de MySQL, je pense que j'ai tout cloué à l'exception d'une mauvaise erreur de passerelle

Le journal d'erreur Nginx affiche

2012/02/25 14:38:34 [crit] 29139#0: *1 connect() to unix:/tmp/mobile.socket failed (2: No such file or directory) while connecting to upstream, client: xx.xx.xxx.xx, server: localhost, request: "GET / HTTP/1.1", upstream: "http://unix:/tmp/mobile.socket:/", host: xx.xx.xxx.xx

(J'ai X'd Out les domaines)

Je suppose que cela pourrait être un truc d'autorisations d'utilisateur, mais le fichier n'existe pas réellement et je ne sais pas comment il devrait être créé. Je suis réticent à le créer manuellement car je pense que cela réparerait un symptôme plutôt que de réparer la cause

Il convient également de noter que l'utilisateur que j'ai créé sur le serveur a des autorisations Sudo et doit utiliser Sudo pour démarrer Nginx, vous ne savez pas si cela est juste? Tous les pointeurs sur ce que je devrais rechercher pour résoudre ce problème sont grandement appréciés. Pour l'exhaustivité, mes fichiers de configuration ressemblent à ce /etc/init.dunicorn

#! /bin/sh
### BEGIN INIT INFO
# Provides: unicorn
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the unicorn web server
# Description: starts unicorn
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/unicorn_rails
DAEMON_OPTS="-c /home/testapp/mobile/current/unicorn.rb -E production -D"
NAME=unicorn_rails
DESC=unicorn_rails
PID=/home/testapp/mobile/shared/pids/unicorn.pid

case "$1" in
  start)
echo -n "Starting $DESC: "
$DAEMON $DAEMON_OPTS
echo "$NAME."
;;
  stop)
echo -n "Stopping $DESC: "
        kill -QUIT `cat $PID`
echo "$NAME."
;;
  restart)
echo -n "Restarting $DESC: "
        kill -QUIT `cat $PID`
sleep 1
$DAEMON $DAEMON_OPTS
echo "$NAME."
;;

et la configuration nginx dans / etc / nginx / sites-disponible / par défaut

# as we are going to use Unicorn as the application server
# we are not going to use common sockets
# but Unix sockets for faster communication
upstream mobile {
  # fail_timeout=0 means we always retry an upstream even if it failed
  # to return a good HTTP response (in case the Unicorn master nukes a
  # single worker for timing out).

  # for UNIX domain socket setups:
  server unix:/tmp/mobile.socket fail_timeout=0;
}

server {
    # if you're running multiple servers, instead of "default" you should
    # put your main domain name here
    listen 80 default;
# you could put a list of other domain names this application answers
server_name localhost;

root /home/testapp/mobile/current/public;
access_log /var/log/nginx/mobile_access.log;
rewrite_log on;

location / {
    #all requests are sent to the UNIX socket
    proxy_pass http://mobile;
    proxy_redirect off;

    proxy_set_header Host $host:$proxy_port;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    client_max_body_size 10m;
    client_body_buffer_size 128k;

    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_read_timeout 90;

    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
}

# if the request is for a static resource, nginx should serve it directly
# and add a far future expires header to it, making the browser
# cache the resource and navigate faster over the website
location ~ ^/(images|javascripts|stylesheets|system)/ {
  root /home/testapp/mobile/current/public;
  expires max;
  break;
}

}

METTRE À JOURMon fichier unicorn.rb

# See http://unicorn.bogomips.org/Unicorn/Configurator.html for complete
# documentation.
worker_processes 4
# Help ensure your application will always spawn in the symlinked
# "current" directory that Capistrano sets up.
working_directory "/home/testapp/mobile/current"
# listen on both a Unix domain socket and a TCP port,
# we use a shorter backlog for quicker failover when busy
listen "/tmp/mobile.socket", :backlog => 64
# nuke workers after 30 seconds instead of 60 seconds (the default)
timeout 30
# feel free to point this anywhere accessible on the filesystem
user 'testapp', 'testapp'
shared_path = '/home/testapp/mobile/shared'
pid "#{shared_path}/pids/unicorn.pid"
stderr_path "#{shared_path}/log/unicorn.stderr.log"
stdout_path "#{shared_path}/log/unicorn.stdout.log"

Selon la suggestion, j'ai créé manuellement le fichier mobile.socket et j'obtiens maintenant l'erreur suivante

[error] 1083#0: *4 connect() to unix:/tmp/mobile.socket failed (111: Connection refused) while connecting to upstream

Est-ce juste une chose d'autorisations sur le fichier mobile.socket? Si oui, de quels autorisations devrais-je avoir besoin?

MISE À JOUR 2Nginx et Unicorn semblent tous deux courir ok

TestApp @ Airmob: ~ / mobile / actuel $ ps Aux | grep nginx

root      6761  0.0  0.1  71152  1224 ?        Ss   18:36   0:00 nginx: master process /usr/sbin/nginx
testapp   6762  0.0  0.1  71492  1604 ?        S    18:36   0:00 nginx: worker process
testapp   6763  0.0  0.1  71492  1604 ?        S    18:36   0:00 nginx: worker process
testapp   6764  0.0  0.1  71492  1604 ?        S    18:36   0:00 nginx: worker process
testapp   6765  0.0  0.1  71492  1604 ?        S    18:36   0:00 nginx: worker process
testapp  13071  0.0  0.0   8036   600 pts/0    R+   21:21   0:00 grep --color=auto nginx
Était-ce utile?

La solution

J'ai renommé mobile.socket à mobile.sock dans les fichiers de configuration pertinents (Unicorn.rb et nginx par défaut) et tout est bon, pas besoin de créer des fichiers de socket, cela fonctionne comme prévu.

Cela se produit également si le serveur d'applications n'est pas en cours d'exécution (dans mon cas Unicorn). Unicorn crée la prise et Nginx le cherche. Si le socket n'est pas là, Nginx lance un bruit, donc si vous lisez ceci à la recherche d'une solution, assurez-vous que votre serveur d'applications (Unicorn) est en cours d'exécution et assurez-vous que tous vos noms de socket correspondent dans les différents fichiers de configuration (Unicorn.rb et quel que soit le fichier nginx.conf, la prise mentionnée dedans)

Autres conseils

Vous avez spécifié qu'il devrait utiliser la prise située à /tmp/mobile.socket Alors oui, la solution est de le créer simplement.

upstream mobile {
  # for UNIX domain socket setups:
  server unix:/tmp/mobile.socket fail_timeout=0;
}

Je suppose que vous faites référence à la même prise dans votre unicorn.rb.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top