Nginx+uWsgi+Django "Отказано в доступе при подключении к восходящему каналу" (сокет)

Я видел много вопросов на SO по этой теме, и я перепробовал столько методов, сколько мог, но это все еще не решает проблему для меня, поэтому я надеюсь, что этот пост может быть полезным.

Я следую руководству с этого сайта, чтобы настроить Django на Nginx с uWSGI: http://www.oliverelliott.org/article/computing/tut_setup_nginx_django/

файл uwsgi.ini

[uwsgi]
chdir=/home/ec2-user/project/awssite
module=awssite.wsgi
home=/home/ec2-user/project
master=true
processes=2
socket=/home/ec2-user/project/awssite/awssite.socket
chmod-socket=666
vacuum=true

и т.д. / Nginx/ сайты с поддержкой /awssite_nginx.conf

upstream django {
    server unix:///home/ec2-user/project/awssite/awssite.socket;
}
server {
listen          8080;
    server_name     localhost;
    charset utf-8;

    #max upload size
    client_max_body_size 75M;

    #Django media
    location /media {
            alias /home/ec2-user/project/awssite/awssite/media;
    }

    location /static {
            alias /home/ec2-user/project/awssite/awssite/static; 
    }

    location /favicon.ico {
            log_not_found off;
    }

    location / {
            uwsgi_pass django;
            include /home/ec2-user/project/awssite/uwsgi_params;
    }
}

Это код ошибки в /var/log/nginx/error.log

2016/02/15 01:21:22 [crit] 22159#0: *3 connect() to unix:///home/ec2-user/project/awssite/awssite.socket failed (13: Permission denied) while connecting to upstream, client: CLIENT_IP, server: localhost, request: "GET /menu/ HTTP/1.1", upstream: "uwsgi://unix:///home/ec2-user/project/awssite/awssite.socket:", host: "HOST_IP:8080"

Примечание: CLIENT_IP & HOST_IP являются значениями IP-адреса.

Это то, что я пробовал и не работал:
1. chmod 755 домашний каталог и работает uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=666

2. Добавление пользователя nginx в мою группу пользователей и запуск uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=664

3. изменить INI-файл, добавив эти новые строки
chown-socket=ec2-user:nginxuid=nginxgid=nginx а затем работает uwsgi --ini uwsgi.ini Возвращается с "Отказано в разрешении для chown", но когда я запускаю команду с sudo, я получил sudo: uwsgi: command not found (uWSGI установлен для всей системы)

4. Поместите все файлы в другой каталог (вне пользователя ec2-user) но это не позволяет мне получить к ним доступ, если я не запускаю как root и даже тогда это не работает

5. работает uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=664/666 с параметрами --uid nginx--gid nginx--chown-socket=nginx:nginxЗамечания: 664/666 значит я пробовал оба разрешения

6. Переименованы файлы nginx.conf.default и nginx.conf.rpmnew (так что единственный файл conf для nginx для чтения это nginx.conf)

Может ли кто-нибудь пролить свет на то, как я могу решить эту проблему? Я буду продолжать добавлять методы, которые я пробовал и не работал над этим вопросом, пока я работаю над ним. Спасибо:)

РЕДАКТИРОВАТЬ: Благодаря ответу @GwynBleidD, я наконец получил его работать. Вот что работает:

держал мой файл сокета в /tmp
и т.д. / Nginx/ сайты с поддержкой /awssite_nginx.conf

upstream django {
    server unix:///tmp/djangosocket/awssite.socket;
}
....

файл uwsgi.ini

[uwsgi]
chdir=/home/ec2-user/project/awssite
module=awssite.wsgi
home=/home/ec2-user/project
master=true
processes=2
socket=/tmp/djangosocket/awssite.socket
chmod-socket=666
vacuum=true

Я добавил свой ec2-user (вошел в систему пользователя) в группу nginx,
Я изменил права доступа к файлу соответственно
chown -R ec2-user:nginx djangosocket
chmod g+rwx djangosocket

1 ответ

Решение

Если ваш сервер nginx не может получить доступ к сокету uWSGI, попробуйте выполнить следующие шаги:

  1. не помещайте ваш socked в домашний каталог любого пользователя в вашей системе, особенно root! Некоторые операционные системы Unix по умолчанию блокируют доступ к домашнему каталогу для всех, кроме владельца этого каталога и корневого каталога. В этом может помочь добавление пользователя nginx в частную группу этого пользователя (для большинства систем у каждого пользователя есть своя основная группа), но он почти никогда не будет работать для пользователя root.

  2. проверьте, на каком пользователе и в какой группе работает ваш сервер nginx (или любой другой используемый вами http-сервер). Иногда www-dataиногда nginxиногда что-то иное. При создании сокета убедитесь, что имя пользователя будет соответствовать имени пользователя, на котором работает сервер uWSGI, и группе соответствия имен групп на uWSGI (или вы можете поменять ее местами).

  3. Убедитесь, что разрешения вашего сокета не меньше 660. Нет необходимости давать разрешения на это кому-либо, так что не делайте этого.

  4. Убедитесь, что у вашего nginx и uWSGI есть разрешение на доступ к каталогу, в который помещен сокет, и ко всем родительским каталогам.

Хорошее место для файла вашего сокета /var/run каталог (для некоторых систем это /run или оба). Чаще всего он монтируется как ramdisk (tmpfs) и доступен для записи любому, кто находится в системе, поэтому каждый пользователь может создавать сокеты здесь (и получать к ним доступ). Если по какой-либо причине он недоступен в вашей системе, вы также можете попробовать /tmp каталог.

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

Другие вопросы по тегам