Gunicorn - Unix 套接字从何而来?

Gunicorn - Where do Unix sockets come from?

我正在尝试将 Gunicorn 配置为使用 Unix 套接字,但我找不到任何关于如何创建这些套接字或如何对其进行故障排除的文档。

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

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

它 returns 具有:

[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 设置了所有相关配置。如果与此有关,我可以post我的配置。

我该如何解决这个问题?

您正在使用 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。