Gunicorn - Unix套接字来自哪里?

Ada*_*rrh 5 python unix sockets django gunicorn

我试图配置Gunicorn使用Unix套接字,但我找不到任何关于如何创建这些套接字或如何解决它们的文档.

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

gunicorn myapp.wsgi:application --bind=unix:/appuser/myapp/gunicorn.sock
Run Code Online (Sandbox Code Playgroud)

它返回:

[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
Run Code Online (Sandbox Code Playgroud)

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

我该如何解决这个问题?

Jon*_*fer 5

您正在使用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()
Run Code Online (Sandbox Code Playgroud)

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