rails sockets unix nginx ruby-on-rails-4 unicorn

sockets - rails - Nginx no puede encontrar el archivo de socket de Unix con Unicorn(sin dicho archivo o directorio)



nginx puma rails (2)

Estoy implementando una aplicación Rails 4 en un servidor Fedora 19 x64 usando Nginx y Unicorn. El problema es que recibo un error al visitar la dirección: "Lo sentimos, pero algo salió mal".

Mi registro de errores de Nginx ( /var/log/nginx/error.log ) muestra:

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"

Por lo que puedo ver de esto, Nginx no sabe que el socket existe. Sin embargo, mirando en /tmp , lo hace:

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

Me sigo atascando en este punto, sin importar cómo modifique mi archivo de configuración Unicorn o mi archivo de configuración Nginx. Ambos son atacados:

/ var / www / [nombre de la aplicación] /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 forma en que he estado iniciando estos dos daemons es la siguiente:

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

Los registros de Unicorn no contienen información relevante ni los registros de producción. Esta configuración parece sencilla, ¿alguien ha experimentado esto antes? Gracias por cualquier ayuda que usted nos pueda proporcionar.

Por cierto, al principio estaba siguiendo este tutorial: https://www.digitalocean.com/community/articles/how-to-deploy-rails-apps-using-unicorn-and-nginx-on-centos-6-5


De repente, tuve una situación similar después de cambiar nginx para usar un servicio de inicio systemd basado en su plantilla .

Termina que el problema fue con PrivateTmp=true , lo que hace que nginx no pueda acceder al archivo de socket creado por gunicorn. Una vez que cambié esto a PrivateTmp=false el error se resolvió.


Después de muchas horas y un gran total de 3 cervezas, he logrado resolver el problema. Después de horas de excavar, finalmente encontré esta respuesta de Server Fault

En términos simples, parece que los programas que crean archivos en /tmp (o /var/tmp como he descubierto) son los únicos programas que pueden ver los archivos en ese directorio. Unicorn creó el archivo socket de UNIX, sin embargo, Nginx no pudo verlo.

La solución que he empleado es hacer que Unicorn cree sockets en /var/sockets .