【问题标题】:Gunicorn - Where do Unix sockets come from?Gunicorn - Unix 套接字从何而来?
【发布时间】:2015-11-21 09:48:07
【问题描述】:

我正在尝试将 Gunicorn 配置为使用 Unix 套接字,但我找不到任何有关如何创建这些套接字或如何解决它们的文档。

我正在设置一个 Django 应用程序,我可以通过指定端口成功启动到 http。但是,当我尝试使用 Unix 套接字时:

gunicorn myapp.wsgi:application --bind=unix:/appuser/myapp/gunicorn.sock

它返回:

[2015-11-21 09:34:21 +0000] [24380] [INFO] Starting gunicorn 19.3.0
[2015-11-21 09:34:21 +0000] [24380] [ERROR] Retrying in 1 second.
[2015-11-21 09:34:22 +0000] [24380] [ERROR] Retrying in 1 second.
[2015-11-21 09:34:23 +0000] [24380] [ERROR] Retrying in 1 second.
[2015-11-21 09:34:24 +0000] [24380] [ERROR] Retrying in 1 second.
[2015-11-21 09:34:25 +0000] [24380] [ERROR] Retrying in 1 second.
[2015-11-21 09:34:26 +0000] [24380] [ERROR] Can't connect to /appuser/myapp/gunicorn.sock

gunicorn.sock 位于应有的位置,但文件为空。我找不到任何日志或任何东西。我在 AWS 服务器上使用 Nginx,并根据the docs 设置了所有相关配置。如果与此有关,我可以发布我的配置。

我该如何解决这个问题?

【问题讨论】:

    标签: python django sockets unix gunicorn


    【解决方案1】:

    您正在使用 unix 文件系统套接字。这些不是常规文件,因此使用 cat 检查时它们可能看起来是空的。

    unix 文件系统套接字的一个特点是它们不得在应用程序尝试绑定路径之前存在。在绑定之前,该路径上既不能有目录,也不能有文件,也不能有套接字。您必须卸下插座;绑定时,会自动创建套接字。然后,当应用程序终止时,它必须被应用程序(或看门狗)删除,然后其他任何人(包括重新启动的应用程序)才能再次绑定到该路径。

    例子:

    >>> import socket
    >>> s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)
    >>> s.bind("foo.sock")
    # now foo.sock exists
    >>> s.close()
    # foo.sock still exists
    >>> s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)
    >>> s.bind("foo.sock")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    OSError: [Errno 98] Address already in use
    # boom, the socket must be unlinked manually
    >>> import os
    >>> os.unlink("foo.sock")
    >>> s.bind("foo.sock")
    >>> s.close()
    

    为了避免这些问题,我会使用带有基于 http 的反向代理到应用程序的 nginx,并将应用程序绑定到 127.0.0.1:someport。

    【讨论】:

    • 感谢您的精彩解释!我删除了现有的 sock 文件,但问题仍然存在。我可以按照您建议的方式绑定它,但是我必须将端口附加到我的 url 的末尾才能看到我的网站。我应该尝试解决这个问题并完全避免使用 Unix 套接字吗?
    • @AdamStarrh 如果您像链接文档中那样配置 NGINX,我会假设它“正常工作”,除了套接字问题。您需要添加什么端口号?我假设您正在通过 NGINX 连接到您的应用程序,对吗? (即您将您的网络浏览器或其他任何东西指向 NGINX 服务器,然后将请求转发到您的应用程序)
    • 是的,Nginx 是我的反向代理。它的配置就像文档一样。我必须将端口 8000 添加到 url 以显示该站点。我正在研究如何将设置转换回 TCP 以查看是否可以解决。
    • @AdamStarrh 你的 NGINX“监听”指令是什么样子的?它们指向端口 80 还是端口 8000?
    • 我把它全部拆掉并重新构建它,它现在似乎可以工作了。一定是有什么错别字。
    猜你喜欢
    • 2021-09-06
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多