Nginx Django和Gunicorn.Gunicorn袜子文件丢失了?

kal*_*alo 11 python django nginx python-2.7 gunicorn

我有一个基于这个https://github.com/jcalazan/ansible-django-stack的ansible配置VM 但由于某种原因尝试启动Gunicorn会出现以下错误:

无法连接到/path/to/my/gunicorn.sock

并在nginx日志文件中:

连接到上游时connect()到unix:/path/to/my/gunicorn.sock失败(2:没有这样的文件或目录)

实际上,指定目录中缺少套接字文件.我已经检查了目录的权限,他们没事.

这是我的gunicorn_start脚本:

NAME="{{ application_name }}"
DJANGODIR={{ application_path }}
SOCKFILE={{ virtualenv_path }}/run/gunicorn.sock
USER={{ gunicorn_user }}
GROUP={{ gunicorn_group }}
NUM_WORKERS={{ gunicorn_num_workers }}

# Set this to 0 for unlimited requests. During development, you might want to
# set this to 1 to automatically restart the process on each request (i.e. your
# code will be reloaded on every request).
MAX_REQUESTS={{ gunicorn_max_requests }}

echo "Starting $NAME as `whoami`"

# Activate the virtual environment.
cd $DJANGODIR
. ../../bin/activate

# Set additional environment variables.
. ../../bin/postactivate

# Create the run directory if it doesn't exist.
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Programs meant to be run under supervisor should not daemonize themselves
# (do not use --daemon).
exec gunicorn \
    --name $NAME \
    --workers $NUM_WORKERS \
    --max-requests $MAX_REQUESTS \
    --user $USER --group $GROUP \
    --log-level debug \
    --bind unix:$SOCKFILE \
    {{ application_name }}.wsgi
Run Code Online (Sandbox Code Playgroud)

有谁能建议还有什么可能导致丢失的套接字文件?

谢谢

小智 23

好吧,既然我没有足够的代表评论,我会在这里提到缺少套接字没有提出很多特殊性,但我可以告诉你一些关于我是如何从你的鞋子开始并得到的东西工作.

它的长短之处在于,当被暴发户运行并且从未起步,运行或关闭时,gunicorn遇到了问题.以下是一些可帮助您获取更多信息以跟踪问题的步骤:

  • 在我的情况下,当发生这种情况时,gunicorn从来没有做过任何错误记录,所以我不得不寻找其他地方.试着ps auxf | grep gunicorn看看你是否有工人去.我没有.
  • 在系统日志中查看来自暴发户的投诉grep init: /var/log/syslog,告诉我我的gunicorn服务已被停止,因为它重生太快,但我怀疑这将是你的问题,因为你没有在你的conf中重生.无论如何,你可能会在那里找到一些东西.
  • 看到gunicorn无法运行或记录错误后,我决定尝试从命令行运行它.转到manage.py所在的目录,并针对gunicorn实例运行upstart命令的扩展版本.类似的东西(用适当的litterals替换所有的变种而不是我使用的垃圾.):

    /path/to/your/virtualenv/bin/gunicorn --name myapp --workers 4 --max-requests 10 --user appuser --group webusers --log-level debug --error-logfile /somewhere/I/can/find/error.log --bind unix:/tmp/myapp.socket myapp.wsgi

  • 如果你很幸运,在手动运行命令后,你可能会得到一个python回溯或者在你的gunicorn错误日志中找到一些东西.一些可能出错的事情:

    • django错误(加载你的设置模块可能有问题吗?).确保您的wsgi.py引用服务器上的相应设置模块.
    • 你的upstart脚本中的空白问题.我有一个隐藏在空间中的标签,这些标签可以解决问题.
    • 用户/权限问题.最后,我能够在命令行上以root身份运行gunicorn,但不能通过upstart配置以非root用户身份运行.

希望有所帮助.追踪这些东西已经有好几天了.


Bri*_*e64 8

在跟随Michal Karzynski的伟大指南" 用Nginx,Gunicorn,virtualenv,supervisor和PostgreSQL设置Django "后,我遇到了同样的问题.

这就是我解决它的方式.

我在bash脚本中有这个变量用于通过Supervisor启动gunicorn(myapp/bin/gunicorn_start):

SOCKFILE={{ myapp absolute path }}/run/gunicorn.sock
Run Code Online (Sandbox Code Playgroud)

当你第一次运行bash脚本时,使用root权限创建一个'run'文件夹和一个sock文件.所以我sudo删除了运行文件夹,然后重新创建它没有sudo权限和瞧!现在,如果您重新运行Gunicorn或Supervisor,您将不再有烦人的丢失袜子文件错误消息!

TL; DR

  1. Sudo删除运行文件夹.
  2. 重新创建它没有sudo权限.
  3. 再次运行Gunicorn.
  4. ????
  5. 利润