Не удается запустить uwsgi как root, "bind(): Permission denied"
Я пытаюсь настроить uWsgi, Django, Nginx с этим документом:
http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html
Завершите настройку файла uwsgi.ini
, создайте мягкую ссылку в /etc/uwsgi/vassals
.
Сбой на последнем шаге: Сделать запуск uWSGI при загрузке системы.
При выполнении этой команды:
sudo /usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data
Я получил эту ошибку:
clock source: unix
detected number of CPU cores: 1
current working directory: /etc/uwsgi/vassals
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
your processes number limit is 3813
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
bind(): Permission denied [core/socket.c line 227]
Tue May 27 05:29:26 2014 - [emperor] curse the uwsgi instance uwsgi.ini (pid: 1391)
Tue May 27 05:29:29 2014 - [emperor] removed uwsgi instance uwsgi.ini
Если я запустил эту команду без sudo
, все будет ОК.
Я добавляю пользователя "kk" в группу "www-data", а вот uwsgi.ini
[uwsgi]
chdir = /home/kk/XXXXXXX
module = wsgi
home = /home/kk/XXXXXXX
master = true
processes = 10
socket = /home/kk/XXXXXXX/mysite.sock
chmod-socket = 666
vacuum = true
Возможно, я допустил ошибку при разрешении файла. У кого-нибудь есть хорошая идея? Спасибо.
Update:
Официальный документ верен, я выполняю шаги по развертыванию проекта в новом VPS, без ошибок.
Ответы
Ответ 1
У меня была эта проблема. Работа без установки идентификаторов группы и пользователей решила проблему. Я, вероятно, передумаю, когда у меня будет больше времени для исправления прав доступа к каталогу, но он работает на данный момент
/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals
ИЗМЕНИТЬ
У меня было время пересмотреть этот ответ, и я должен сказать, что это не очень хорошая практика при запуске uwsgi в процессе производства.
Проблема с учебником как написано в том, что он предполагает, что www-data
является пользователем и что пользователь и группа www-data
имеют доступ ко всем файлам, которые ему нужны на вашем сервере; в частности файл сокета. Замените соответствующие аргументы своим пользователем и группой, и вам будет хорошо идти (и не оставит на вашем сервере пробой безопасности).
Итак, правильная команда (если бы я был пользователем ovangle
в группе ovangle
):
/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid ovangle --gid ovangle
Было бы лучше создать пользователя, который имеет конкретные разрешения, необходимые для успешного запуска сервера, но это оставило в качестве упражнения для читателя.
Ответ 2
Я не знаю, почему разрешения не работают, но я столкнулся с той же проблемой.
Один быстрый способ исправить это - переместить сокеты в /tmp, хотя! (Это довольно разумное место для хранения сокетов в любом случае...)
просто обновите конфигурацию uwsgi с помощью
socket = /tmp/mysite.sock
и nginx-config с:
upstream django {
server unix:///tmp/mysite.sock;
}
и он начнет работать!
Ответ 3
Если вы согласны с использованием сокета веб-порта (например, первой части демонстрации) вместо unix-сокетов.. вы можете изменить это.
# uwsgi.ini
socket = :8001
и это..
# mysite_nginx.conf
upstream django {
# server unix:///home/teewuane/uwsgi-tutorial/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
и вы избежите проблем с разрешением.
Ответ 4
Причиной проблемы, о которой вы спрашиваете, является то, что uwsgi пытается создать файл сокета unix для взаимодействия с веб-сервером по протоколу fastCGI в каталоге, который вы настроили /home/kk/XXXXXXX/
Вы должны установить права на запись для пользователя, запускающего uwsgi из каталога /home/kk/XXXXXXX/
Ответ 5
Перейдем к той же самой проблеме, после ее решения, выполнив работу с пользователями и группами, которые имеют достаточное разрешение для файла сокета, я понял, что это, вероятно, ошибка.
Это очень запутанно, если вы действительно можете запустить его у текущего пользователя с помощью uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data
, а после добавления sudo
вы получите ошибку bind(): Permission denied
.
Единственным объяснением для этого было бы, если вы запустили его без sudo
, как-то --uid www-data --gid www-data
часть НЕ РАБОТАЕТ, и вы фактически запускаете его с текущим пользователем, который имеет достаточное разрешение; и один раз sudo
добавлен, --uid www-data --gid www-data
часть волшебным образом снова работает, а заканчивается тем, что www-data
не имеет достаточного разрешения для привязки файла сокета.
Ответ 6
Вы сделали разрешения назад.
uwsgi работает как www-data.
Ваш сокет находится непосредственно в kk home, который предположительно принадлежит пользователю kk и группе kk.
Вы сделали это так, чтобы kk мог получить доступ ко всему, что принадлежит www-данным, а не к тому, что www-data может получить доступ к тому, что принадлежит kk.
Вы хотите добавить www-данные в группу kk. Таким образом, www-данные могут попасть в сокет в домашней сети kk.
usermod www-data -aG kk
Подтвердите с помощью groups www-data
, и вы должны вернуться www-data : www-data kk
, показывая, что www-данные теперь находятся в основной группе kk.
Теперь, если разрешения для домашней папки kk имеют как минимум "6" для разрешения группы, www-данные могут считывать и записывать в сокет при необходимости. Например. chmod 660 /home/kk/XXXXXXX/mysite.sock
.