Подтвердить что ты не робот

Nginx не может найти файл сокета unix с Unicorn (нет такого файла или каталога)

Я развертываю приложение Rails 4 на сервере Fedora 19 x64, используя Nginx и Unicorn. Проблема в том, что я получаю сообщение об ошибке при посещении адреса: "Мы сожалеем, но что-то пошло не так".

Журнал ошибок Nginx (/var/log/nginx/error.log) показывает:

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"

Насколько я понимаю, Nginx не знает, что сокет существует. Однако, глядя в /tmp, он делает следующее:

[[email protected] tmp]# ls
unicorn.[app name].sock

Я продолжаю застревать в этот момент, независимо от того, как я изменяю конфигурационный файл Unicorn или мой конфигурационный файл Nginx. Оба зафиксированы:

/var/www/[имя приложения]/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;
}

Как я начинаю эти два демона:

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

Журналы Единорога не содержат никакой соответствующей информации и не производят журналы. Эта установка кажется прямой, кто-нибудь испытал это раньше? Спасибо за любую помощь, которую вы можете предоставить.

Кстати, я изначально следовал этому руководству: https://www.digitalocean.com/community/articles/how-to-deploy-rails-apps-using-unicorn-and-nginx-on-centos-6-5

4b9b3361

Ответ 1

После многих часов и всего трех сортов пива мне удалось выяснить проблему. После долгих разрывов я наконец наткнулся на этот ответ на ошибку сервера

В условиях непрофессионала кажется, что программы, которые создают файлы в /tmp (или /var/tmp, как я обнаружил), являются единственными программами, которые могут видеть файлы в этом каталоге. Unicorn создавал файл сокета UNIX, однако Nginx его не видел.

Решение, которое я использовал, состоит в том, чтобы Unicorn создавал сокеты в /var/sockets.

Ответ 2

У меня внезапно возникла аналогичная ситуация после смены nginx, чтобы использовать службу запуска systemd на основе их шаблона.

В конечном итоге проблема была в PrivateTmp=true, что делает так, что nginx был не смог получить доступ к файлу сокета, созданного с помощью gunicorn, Как только я изменил это на PrivateTmp=false, ошибка была устранена.

Ответ 3

Одна из проблем, с которыми я столкнулся, - это журналы ошибок nginx, которые не имели правильного пути:

эта команда будет полезна, чтобы знать точные ошибки nginx с помощью

tail -f /var/log/nginx/error.log