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:nginx
uid=nginx
gid=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, попробуйте выполнить следующие шаги:
не помещайте ваш socked в домашний каталог любого пользователя в вашей системе, особенно root! Некоторые операционные системы Unix по умолчанию блокируют доступ к домашнему каталогу для всех, кроме владельца этого каталога и корневого каталога. В этом может помочь добавление пользователя nginx в частную группу этого пользователя (для большинства систем у каждого пользователя есть своя основная группа), но он почти никогда не будет работать для пользователя root.
проверьте, на каком пользователе и в какой группе работает ваш сервер nginx (или любой другой используемый вами http-сервер). Иногда
www-data
иногдаnginx
иногда что-то иное. При создании сокета убедитесь, что имя пользователя будет соответствовать имени пользователя, на котором работает сервер uWSGI, и группе соответствия имен групп на uWSGI (или вы можете поменять ее местами).Убедитесь, что разрешения вашего сокета не меньше 660. Нет необходимости давать разрешения на это кому-либо, так что не делайте этого.
Убедитесь, что у вашего nginx и uWSGI есть разрешение на доступ к каталогу, в который помещен сокет, и ко всем родительским каталогам.
Хорошее место для файла вашего сокета /var/run
каталог (для некоторых систем это /run
или оба). Чаще всего он монтируется как ramdisk (tmpfs) и доступен для записи любому, кто находится в системе, поэтому каждый пользователь может создавать сокеты здесь (и получать к ним доступ). Если по какой-либо причине он недоступен в вашей системе, вы также можете попробовать /tmp
каталог.
Если вы также отправляете статические файлы непосредственно из nginx из своего домашнего каталога, рассмотрите возможность добавления nginx в свою личную группу, чтобы он имел доступ для чтения к вашему домашнему каталогу и статическим файлам.