如何在 unix 套接字上绑定 Daphne?

Posted

技术标签:

【中文标题】如何在 unix 套接字上绑定 Daphne?【英文标题】:How to bind Daphne on a unix socket? 【发布时间】:2017-11-29 02:11:47 【问题描述】:

到目前为止,我使用的是Gunicorn,带有这个配置文件systemd:

[Unit]
Description=gunicorn daemon
After=network.target


[Service]
EnvironmentFile=/var/www/user/.envvars
User=user
Group=www-data
WorkingDirectory=/var/www/user
ExecStart=/var/www/venv/bin/gunicorn --workers 3 --bind unix:/var/www/user/user.sock config.wsgi:application --env DJANGO_SETTINGS_MODULE='config.settings.production'

[Install]
WantedBy=multi-user.target

以及nginx 对此 unix 套接字的代理请求。

尝试Daphne,发现不能指定--env DJANGO_SETTINGS_MODULE='config.settings.production'

但是我在asgi.py中指定了这个变量,就正常了。

我一运行gunicorn service,就立即创建了来自nginx 的请求的套接字本身。

当我尝试用 Daphne 做同样的把戏时,我得到一个错误:

6 月 26 日 11:48:32 p435061.kvmvps daphne[8447]: ValueError: invalid 以 8 为基数的 int() 的文字:'/var/www/user/user.sock'

但是当我尝试运行Daphne 并创建我的systemd 文件时,我不知道如何使用unix.sock

更新

我更改了设置文件,它给出了一些奇怪的东西,但它有效:

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


[Service]
EnvironmentFile=/var/www/gglobal/.envvars
User=gglobal
Group=www-data
WorkingDirectory=/var/www/gglobal
ExecStart=/var/www/venv/bin/daphne -b unix:/var/www/gglobal/gglobal.sock  config.asgi:channel_layer -v2

[Install]
WantedBy=multi-user.target

systemctl status daphne 返回:

Jun 26 17:53:46 p435061.kvmvps daphne[14183]: 2017-06-26 17:53:46,722 DEBUG    get 'RDS_HOSTNAME' casted as 'None' with default '<NoValue>'
Jun 26 17:53:46 p435061.kvmvps daphne[14183]: 2017-06-26 17:53:46,722 DEBUG    get 'RDS_PORT' casted as 'None' with default '<NoValue>'
Jun 26 17:53:46 p435061.kvmvps daphne[14183]: 2017-06-26 17:53:46,722 DEBUG    get 'REDIS_ENDPOINT_ADDRESS' casted as 'None' with default '<NoValue>'
Jun 26 17:53:46 p435061.kvmvps daphne[14183]: 2017-06-26 17:53:46,722 DEBUG    get 'REDIS_PORT' casted as 'None' with default '<NoValue>'
Jun 26 17:53:46 p435061.kvmvps daphne[14183]: 2017-06-26 17:53:46,723 DEBUG    get 'DJANGO_SENTRY_DSN' casted as 'None' with default 'https://56bb387ee6ef4e7b
Jun 26 17:53:46 p435061.kvmvps daphne[14183]: 2017-06-26 17:53:46,723 DEBUG    get 'DJANGO_SENTRY_CLIENT' casted as 'None' with default 'raven.contrib.django.
Jun 26 17:53:46 p435061.kvmvps daphne[14183]: 2017-06-26 17:53:46,723 DEBUG    get 'DJANGO_SENTRY_LOG_LEVEL' casted as '<class 'int'>' with default '20'
Jun 26 17:53:46 p435061.kvmvps daphne[14183]: 2017-06-26 17:53:46,724 DEBUG    get 'DJANGO_SENTRY_LOG_LEVEL' casted as '<class 'int'>' with default '20'
Jun 26 17:53:46 p435061.kvmvps daphne[14183]: 2017-06-26 17:53:46,724 DEBUG    get 'DJANGO_ADMIN_URL' casted as 'None' with default '<NoValue>'
Jun 26 17:53:48 p435061.kvmvps daphne[14183]: DEBUG 2017-06-26 17:53:48,186 base 14183 140286354425600 Configuring Raven for host: <raven.conf.remote.RemoteCo

但是 nginx 发誓缺少 *.sock 文件:

2017/06/26 17:47:51 [crit] 12682#12682: *59 connect() to unix:/var/www/project/project.sock failed (2: No such file or directory) while connecting to upstream, client: 5.152.1.201, server: mydomain.com, request: "GET / HTTP/2.0", upstream: "http://unix:/var/www/project/project.sock:/", host: "mydomain.com"

我花了一整天的时间来解决这个问题,但什么也没发生。

【问题讨论】:

看起来你为达芙妮使用了错误的参数。像 -u &lt;path to socke&gt; 这样的东西而不是像 -b &lt;path to sock&gt; 这样的东西? @ZadaZorg 应该和 -b 和 -u 一起标明? 【参考方案1】:

答案很简单:

问题是我指出-b unix:,而unix:前缀干扰了工作,当然标志应该设置-u

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


[Service]
EnvironmentFile=/var/www/gglobal/.envvars
User=gglobal
Group=www-data
WorkingDirectory=/var/www/gglobal
ExecStart=/var/www/venv/bin/daphne -u /var/www/gglobal/gglobal.sock  config.asgi:channel_layer -v2

[Install]
WantedBy=multi-user.target

【讨论】:

以上是关于如何在 unix 套接字上绑定 Daphne?的主要内容,如果未能解决你的问题,请参考以下文章

你如何在 Python 中使用 Unix 套接字?

如何确定打开的套接字是 TCP 还是 unix 域套接字?

如何使用 UnixDomainSocketEndPoint 在 dotnet 中创建 unix 套接字?

如何通过 Mac OS X 上的 Unix 域套接字传递用户凭据?

如何使用 SOCK_DGRAM 制作双向 unix 域套接字?

如何在Openshift平台上通过Jenkins管道运行docker-in-docker?