Настройка Django + nginx + uwsgi + supervisord: разница между сокетами в / run vs / tmp

Я пытаюсь установить 2 веб-приложения Django на одном компьютере, используя uWSGI emperor и nginx, и попросить супервизора управлять запуском и перезапуском процесса Emperor. Наконец, после долгих поисков в Интернете мне удалось получить рабочее развертывание. Тем не менее, во время выдергивания волос я обнаружил что-то странное, и был бы признателен, если бы кто-нибудь объяснил мне, почему это происходит.

Итак, я запускаю свой процесс uWSGI в режиме императора от имени пользователя root. Конфигурационные файлы вассала ini позаботятся об отказе от прав для моего uid и создании файла сокета, принадлежащего моему пользователю с группой как www-data (чтобы nginx мог писать в нее) и разрешениями 660. Вот пример вассальной конфигурации:

[uwsgi]
uid = xxxx

chdir = %(project_dir)/%(project)
home = %(venv_base)/%(venv)
module = %(project).wsgi:application

master = true
processes = 4

socket = /tmp/%(project).sock
chown-socket = %(uid):www-data
chmod-socket = 660
stats = /tmp/%(project)_stat.sock
logto = %(project_dir)/logs/uwsgi.log
# Cleans up when the process is killed (includes deleting the socket file)
vacuum = true

Это работает нормально, но если я попытаюсь создать сокет в / run вместо / tmp, я начну получать ошибки отказа в разрешении для вызова сокета bind (). Сокет создается нормально с соответствующими правами собственности и разрешениями, но вассал не может вызвать для него bind () или unlink ().

[uwsgi]
uid = xxxx

chdir = %(project_dir)/%(project)
home = %(venv_base)/%(venv)
module = %(project).wsgi:application

master = true
processes = 4

socket = /tmp/%(project).sock
chown-socket = %(uid):www-data
chmod-socket = 660
stats = /tmp/%(project)_stat.sock
logto = %(project_dir)/logs/uwsgi.log
# Cleans up when the process is killed (includes deleting the socket file)
vacuum = true

Это работает нормально, но если я попытаюсь создать сокет в / run вместо / tmp, я начну получать ошибки отказа в разрешении для вызова сокета bind (). Сокет создается нормально с соответствующими правами собственности и разрешениями, но вассал не может вызвать для него bind () или unlink ().

[uwsgi]
uid = xxxx

chdir = %(project_dir)/%(project)
home = %(venv_base)/%(venv)
module = %(project).wsgi:application

master = true
processes = 4

socket = /tmp/%(project).sock
chown-socket = %(uid):www-data
chmod-socket = 660
stats = /tmp/%(project)_stat.sock
logto = %(project_dir)/logs/uwsgi.log
# Cleans up when the process is killed (includes deleting the socket file)
vacuum = true

Это работает нормально, но если я попытаюсь создать сокет в / run вместо / tmp, я начну получать ошибки отказа в разрешении для вызова сокета bind (). Сокет создается нормально с соответствующими правами собственности и разрешениями, но вассал не может вызвать для него bind () или unlink (). Почему это происходит? В чем разница между / tmp и / run и когда их использовать? Мы будем благодарны за любую помощь или указатели.

РЕДАКТИРОВАТЬ : Я просто попытался установить разрешения сокета на 777, но uwsgi по-прежнему выдает мне ошибку отказа в разрешении: (

1
задан 7 December 2016 в 17:21
1 ответ

У меня недостаточно репутации на serverfault для комментариев, поэтому я должен дать «ответ»:

Вызов bind () привязывает сокет к узлу в файловой системе, поэтому возможно у вашего пользователя нет прав на запись в / run !? В моей системе / tmp имеет og + w , а / run - og-w . Попробуйте создать сокет в подпапке / run, у которой есть права на запись.

Что вы имеете в виду под «сокет создан нормально»? Можете ли вы подключиться к нему с помощью другого процесса? Похоже, розетка есть. Но, судя по тому, что я написал выше, я не ожидаю, что он появится в файловой системе.

0
ответ дан 4 December 2019 в 05:33

Теги

Похожие вопросы