簡體   English   中英

Gunicorn-Unix套接字來自何處?

[英]Gunicorn - Where do Unix sockets come from?

我試圖將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,並已根據docs設置了所有相關配置。 如果與此有關,我可以發布我的配置。

我該如何解決?

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

為避免這些問題,我將nginx與基於http的反向代理一起使用到應用程序,並將該應用程序綁定到127.0.0.1:someport。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM