Отказано в доступе при попытке запустить процесс Daphne systemctl

Я развертываю веб-сайт с использованием Django и Django-Channels, при этом сервер Channel daphne ASGI заменяет типичную настройку Gunicorn WSGI. Используя это руководство по Gunicorn WSGI в качестве начального руководства. Я попытался написать службу systemctl для своего сервера daphne, когда столкнулся с приведенной ниже ошибкой:

CRITICAL Listen failure: [Errno 13] Permission denied: '27646' -> b'/run/daphne.sock.lock'

К сожалению, мне не удалось найти ответы на вопрос, почему доступ к файлу .sock будет запрещен (в контексте Дафны), поэтому я надеялся получить подсказки о том, с чего начать отладку этой проблемы. Ниже мои файлы daphne.socket и daphne.service.

daphne.service

[Unit]
Description=daphne daemon
Requires=daphne.socket
After=network.target

[Service]
User=brianl
Group=www-data
WorkingDirectory=/home/brianl/autoXMD
ExecStart=/home/brianl/autoXMD/env/bin/daphne -u /run/daphne.sock -b 0.0.0.0 -p 8000 autoXMD.asgi:application
[Install]
WantedBy=multi-user.target

daphne.socket

[Unit]
Description=daphne socket

[Socket]
ListenStream=/run/daphne.sock

[Install]
WantedBy=sockets.target

Основываясь на связанном учебнике DigitalOcean, я начинаю свой сервис с sudo systemctl start daphne.socket.

Я предполагаю, что есть какое-то несоответствие между настройкой служб systemctl для Gunicorn и Daphne, которое я пропустил, но я точно не знаю.

(Если это поможет, я планирую использовать Nginx в качестве основного сервера, но я еще не дошел до этого)

РЕДАКТИРОВАТЬ:

Было бы полезно, если бы я также приложил полный вывод, который дает systemd:

● daphne.service - daphne daemon
   Loaded: loaded (/etc/systemd/system/daphne.service; enabled; vendor preset: enabled)
   Active: failed (Result: start-limit-hit) since Thu 2019-09-05 22:00:43 UTC; 1min 51s ago
  Process: 22041 ExecStart=/home/brianl/autoXMD/env/bin/daphne -u /run/daphne.sock -b 0.0.0.0 -p 8000 autoXMD.asgi:application (code=exited, status=0/SUCCESS)
 Main PID: 22041 (code=exited, status=0/SUCCESS)

Sep 05 22:00:43 autoxmd daphne[22041]:   warnings.warn('%s.  joblib will operate in serial mode' % (e,))
Sep 05 22:00:43 autoxmd daphne[22041]: 2019-09-05 22:00:43,013 INFO     Starting server at tcp:port=8000:interface=0.0.0.0, unix:/run/daphne.sock
Sep 05 22:00:43 autoxmd daphne[22041]: 2019-09-05 22:00:43,017 INFO     HTTP/2 support not enabled (install the http2 and tls Twisted extras)
Sep 05 22:00:43 autoxmd daphne[22041]: 2019-09-05 22:00:43,020 INFO     Configuring endpoint tcp:port=8000:interface=0.0.0.0
Sep 05 22:00:43 autoxmd daphne[22041]: 2019-09-05 22:00:43,022 INFO     Listening on TCP address 0.0.0.0:8000
Sep 05 22:00:43 autoxmd daphne[22041]: 2019-09-05 22:00:43,022 INFO     Configuring endpoint unix:/run/daphne.sock
Sep 05 22:00:43 autoxmd daphne[22041]: 2019-09-05 22:00:43,022 CRITICAL Listen failure: [Errno 13] Permission denied: '22041' -> b'/run/daphne.sock.lock'
Sep 05 22:00:43 autoxmd systemd[1]: daphne.service: Start request repeated too quickly.
Sep 05 22:00:43 autoxmd systemd[1]: daphne.service: Failed with result 'start-limit-hit'.
Sep 05 22:00:43 autoxmd systemd[1]: Failed to start daphne daemon.

person Brian Lee    schedule 03.09.2019    source источник
comment
Вы уже изменили владельца папки /run для пользователя brianl?   -  person Toan Quoc Ho    schedule 03.09.2019
comment
как упомянул @ToanQuocHo, это происходит из-за того, что у пользователя brianl нет разрешения писать на .sock . вы можете использовать sudo chmod 775 .sock   -  person mehdi    schedule 03.09.2019
comment
Эй, я пытался sudo chmod 775 /runsudo chmod 775 /run/*), но ничего не получилось. Любые дополнительные предложения?   -  person Brian Lee    schedule 06.09.2019
comment
Хорошо, я понял. У тебя ошибка в конфиге. Проблема в том, что этот daphne -u /run/daphne.sock -b 0.0.0.0 -p 8000 не эквивалентен gunicorn -bind ...., параметр для daphne -u попытается создать unix-сокет, а затем привязаться к нему. Решение состоит в том, чтобы просто опустить часть с созданием сокета самостоятельно. поэтому просто удалите Requires=daphne.socket из службы.   -  person Take_Care_    schedule 06.09.2019
comment
Должен ли я также удалить часть -u /run/daphne.sock из команды daphne?   -  person Brian Lee    schedule 06.09.2019
comment
Если вам не нужен локальный сокет для подключения к вашему приложению, да, вы можете. Идея локального сокета заключается в том, что он не занимает ни один из сетевых портов, и вам не нужно запоминать порт, чтобы другие локальные службы могли подключаться по этому пути сокета, установленному сетевым устройством.   -  person Take_Care_    schedule 06.09.2019
comment
Он по-прежнему будет прослушиваться в сети, поэтому вы сможете получить к нему доступ с помощью локальных вызовов и т. д.   -  person Take_Care_    schedule 06.09.2019
comment
Я попытался удалить Requires=daphne.socket из daphne.service, но не смог проверить соединение с curl --unix-socket /run/gunicorn.sock localhost. (Дано в учебнике DigitalOcean) Попытка curl 0.0.0.0:8000 вместо этого приводит к той же ошибке. Любые дополнительные советы?   -  person Brian Lee    schedule 07.09.2019
comment
РЕДАКТИРОВАТЬ: похоже, что дополнительное удаление -u /run/daphne.sock наконец заставило curl работать. Как мне заставить его работать, используя подход сокетов? (для тех, кто столкнется с этой проблемой в будущем)   -  person Brian Lee    schedule 07.09.2019
comment
Проблема определенно связана с daphne -u /run/daphne.sock project.asgi:application, поскольку вы получаете сообщение об ошибке только при запуске этой команды.   -  person theEpsilon    schedule 08.08.2020


Ответы (1)


Я думаю, что это произошло из-за проблемы с разрешением. По умолчанию каталог /run принадлежит пользователю root. Таким образом, сокету daphne не удалось создать файл daphne.sock.lock в каталоге /run.

Решение состоит в том, что создайте папку в каталоге /run и дайте разрешение своему пользователю и группе.

Например:

sudo mkdir /run/daphne
sudo chown brianl:www-data /run/daphne

Теперь измените путь к носку Unix в файле службы и сокета.

daphne.service

[Unit]
Description=daphne daemon
Requires=daphne.socket
After=network.target

[Service]
User=brianl
Group=www-data
WorkingDirectory=/home/brianl/autoXMD
ExecStart=/home/brianl/autoXMD/env/bin/daphne -u /run/daphne/daphne.sock -b 0.0.0.0 -p 8000 autoXMD.asgi:application
[Install]
WantedBy=multi-user.target

daphne.socket

[Unit]
Description=daphne socket

[Socket]
ListenStream=/run/daphne/daphne.sock

[Install]
WantedBy=sockets.target

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

person Akash Mallik    schedule 09.12.2020