Я пытаюсь установить 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 по-прежнему выдает мне ошибку отказа в разрешении: (
У меня недостаточно репутации на serverfault для комментариев, поэтому я должен дать «ответ»:
Вызов bind () привязывает сокет к узлу в файловой системе, поэтому возможно у вашего пользователя нет прав на запись в / run !? В моей системе / tmp имеет og + w
, а / run - og-w
. Попробуйте создать сокет в подпапке / run, у которой есть права на запись.
Что вы имеете в виду под «сокет создан нормально»? Можете ли вы подключиться к нему с помощью другого процесса? Похоже, розетка есть. Но, судя по тому, что я написал выше, я не ожидаю, что он появится в файловой системе.