Я запускаю 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 работает как nginx
user, как указано в вашей конфигурации. Вы говорите, что ваши каталоги принадлежат 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
И теперь работает нормально.