Назад | Перейти на главную страницу

Ошибка отказа в разрешении nginx

Я запускаю nginx и единорог для обслуживания приложения Rails.
Приложение Unicorn and Rails работает нормально, но nginx не может открыть общедоступный каталог rails с ошибкой разрешения и вернуть 502 Bad Gateway.

curl http://localhost/
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.6.1</center>
</body>
</html>

вар / журнал / nginx / error.log

014/09/18 18:16:16 [crit] 16619#0: *1 stat() "/home/rails/public_html/rails_app/current/public//index.html" failed (13: Permission denied), client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "localhost"
2014/09/18 18:16:16 [crit] 16619#0: *1 stat() "/home/rails/public_html/rails_app/current/public/" failed (13: Permission denied), client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "localhost"
2014/09/18 18:16:16 [crit] 16619#0: *1 connect() to unix:/tmp/unicorn.rails_app.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://unix:/tmp/unicorn.rails_app.sock:/", host: "localhost"
2014/09/18 18:16:16 [crit] 16619#0: *1 stat() "/home/rails/public_html/rails_app/current/public/500.html/index.html" failed (13: Permission denied), client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://unix:/tmp/unicorn.rails_app.sock/", host: "localhost"
2014/09/18 18:16:16 [crit] 16619#0: *1 stat() "/home/rails/public_html/rails_app/current/public/500.html" failed (13: Permission denied), client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://unix:/tmp/unicorn.rails_app.sock/", host: "localhost"
2014/09/18 18:16:16 [crit] 16619#0: *1 connect() to unix:/tmp/unicorn.rails_app.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://unix:/tmp/unicorn.rails_app.sock:/500.html", host: "localhost"

nginx.conf

user    nginx;
worker_processes        1;

error_log       /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;

events {
        worker_connections 1024; # increase if you have lots of clients
        # accept_mutex off; # "on" if nginx worker_processes > 1
}

http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" "$http_x_forwarded_for"';

        access_log  /var/log/nginx/access.log  main;

        sendfile                on;
        # tcp_nopush    on;
        # tcp_nodelay   off;

        upstream unicorn {
                server unix:/tmp/unicorn.rails_app.sock fail_timeout=0;
        }

        server {
                listen 80 default deferred;
                # server_name example.com;
                root /home/rails/public_html/rails_app/current/public;

                try_files $uri/index.html $uri @unicorn;
                location @unicorn {
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_set_header Host $http_host;
                        proxy_redirect off;
                        proxy_pass http://unicorn;
                }

                error_page 500 502 503 504 /500.html;
                client_max_body_size 4G;
                keepalive_timeout 10;
        }
}

Разрешения для публичных каталогов rails - 775 или 775.
nginx выполняется пользователем 'nginx', а публичные каталоги rails принадлежат пользователю 'rails'.
Я пытался запустить nginx пользователем rails и пользователем root, но возникли те же ошибки.
Понятия не имею, что не так с этими ошибками.
nginx отлично работает, если я установил корневой каталог в / usr / share / nginx / html /. Моя среда - Centos7 на Vagrant и рельсы 2.2.2 с unicorn gem 4.8.3.

[примечание] Я знаю, что /tmp/unicorn.rails_app.sock нужно поместить в другой каталог этот вопрос, но, думаю, проблема не в этом.

nginx работает как nginxuser, как указано в вашей конфигурации. Вы говорите, что ваши каталоги принадлежат root:root.

Гарантировать, что каждый каталог от корня к файлу, к которому nginx пытается получить доступ, имеет право казнь (и возможно чтение?) разрешение. В вашем случае Другой группа разрешений (chmod o+(r)x <recursive list of dirs>).

Если этого недостаточно, попробуйте добавить чтение разрешение на другие в файлах сокетов.

Обычно теперь nginx может stat() эти файлы.

Тот факт, что с nginx все работает нормально root установлен на /usr/share/nginx/html заключается в том, что эти файлы были созданы пакетом nginx с адекватным сочетанием пользователей / групп / разрешений ...

Теперь я вижу другую (и более крупную) проблему: вы пытаетесь работать с рабочими nginx, работающими как nginx:nginx и файлы, принадлежащие root:root, для которого нет записывать разрешение для nginx вообще. Таким образом, любая попытка nginx записать в сокет в конечном итоге потерпит неудачу ...

Вам действительно стоит переосмыслить всю свою конструкцию. Сделайте так, чтобы пользователь / группа nginx и каталоги / файлы совпадали, чтобы nginx мог открывать то, что ему нужно открыть (казнь прямо в каталогах), прочтите, что ему нужно прочитать, и напишите, что ему нужно написать, не полагаясь на Другой группа разрешений, которая в основном позволяет любой пользователь делать то же самое.

Отредактировал мой nginx.conf и изменил пользователя с nginx на deployer (мой пользователь развертывания для capistrano и член группы wheel), и теперь все отлично работает!

Мне удалось решить проблему.
Проблема в том, что nginx не может читать /tmp/unicorn.rails_app.sock, поскольку PrivateTmp = true в /etc/systemd//system/multi-user.target.wants/nginx.service

Это то, что я делаю.
Создан каталог для сокета единорога

mkdir /var/run/unicorn
chown rails:rails /var/run/unicorn
chmod 755 /var/run/unicorn

Модифицированный nginx.conf

upstream unicorn {
    server unix:/var/run/unicorn/unicorn.rails_app.sock fail_timeout=0;
}

Отключен SElinux

sudo setenforce 0

Отключено навсегда
/ и т. д. / sysconfig / selinux

SELINUX=permissive
SELINUXTYPE=targeted

И теперь работает нормально.