Nginx Django 和 Gunicorn。 Gunicorn 袜子文件丢失?

Posted

技术标签:

【中文标题】Nginx Django 和 Gunicorn。 Gunicorn 袜子文件丢失?【英文标题】:Nginx Django and Gunicorn. Gunicorn sock file is missing? 【发布时间】:2015-04-25 16:49:37 【问题描述】:

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

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

nginx 日志文件中:

connect() to 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

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

谢谢

【问题讨论】:

【参考方案1】:

好吧,由于我没有足够的代表发表评论,我会在这里提到缺少的套接字并没有提供太多的特异性,但我可以告诉你一些关于我是如何从你的鞋子开始的,并且让事情顺利进行。

总而言之,gunicorn 在由 upstart 运行时遇到了问题,要么从未启动并运行或关闭。以下步骤可帮助您获取更多信息以追踪您的问题:

就我而言,当这种情况发生时,gunicorn 从来没有时间做任何错误记录,所以我不得不寻找其他地方。试试ps auxf | grep gunicorn 看看你有没有工人去。我没有。 在系统日志中查找来自暴发户grep init: /var/log/syslog 的投诉,显示我的 gunicorn 服务已停止,因为它重生速度太快,但我怀疑这将是您的问题,因为您没有重生功能你的conf。无论如何,您可能会在那里找到一些东西。

在看到 gunicorn 无法运行或记录错误后,我决定尝试从命令行运行它。转到 manage.py 所在的目录,然后针对 gunicorn 实例运行 upstart 命令的扩展版本。类似的东西(用适当的litterals而不是我使用的垃圾替换所有vars。):

/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 引用了服务器上的相应设置模块。 新贵脚本中的空白问题。我有一个隐藏在乱七八糟的空间中的标签。 用户/权限问题。最后,我能够在命令行上以 root 身份运行 gunicorn,但不能通过 upstart 配置以非 root 用户身份运行。

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

【讨论】:

嗯,忘了说你可能应该在命令行上使用 --daemon (虽然不在你的 upstart conf 中),这样你就可以在它运行时检查日志和东西。 我尝试了上述步骤,但遗憾的是找不到任何东西。没有其他 gunicorn 进程正在运行,系统日志中也没有任何内容。比我发现问题出在哪里。我试图将 /webapps/my-app/run/gunicorn-sock 的 sockfile 目录更改为 /sockets/gunicorn.sock 并且它有效。但我不知道旧目录有什么问题,它有 777 权限,并且启动 gunicorn 的用户是所有者。 啊,对不起。我以为您使用的是暴发户,而不是supervisord。我认为 supervisord 有它自己的活动日志,可能会为您提供更多信息。 一个很好的调试建议(我希望我能经常记住它):尝试在终端中运行 exec 命令 为了解决这个问题,我不得不 chmod 777 /env/bin/gunicorn 和 /env/bin/python【参考方案2】:

在遵循 Michal Karzynski 的出色指南“Setting up Django with Nginx, Gunicorn, virtualenv, supervisor and PostgreSQL”后,我遇到了同样的问题。

我就是这样解决的。

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

SOCKFILE= myapp absolute path /run/gunicorn.sock

当您第一次运行 bash 脚本时,会创建一个“运行”文件夹和一个 sock 文件使用 root 权限。所以我 sudo 删除了运行文件夹,然后在没有 sudo 权限的情况下重新创建它,瞧!现在,如果您重新运行 Gunicorn 或 Supervisor,您将不再有烦人的缺少 sock 文件错误消息!

TL;DR

    Sudo 删除运行文件夹。 在没有 sudo 权限的情况下重新创建它。 再次运行 Gunicorn。 ???? 利润

【讨论】:

【参考方案3】:

当您没有 pip 安装需求时,也可能会出现该错误。就我而言,查看 gunicorn 错误日志,我发现缺少一个模块。通常发生在您忘记 pip install 新要求时。

【讨论】:

【参考方案4】:

嗯,我在这个问题上工作了一个多星期,终于弄明白了。 请点击来自digital ocean 的链接,但他们没有指出重要的问题之一,其中包括

    连接上游时没有实时上游 *4 connect() to unix:/myproject.sock 在连接上游时失败(13:权限被拒绝) gunicorn OSError: [Errno 1] Operation not allowed

    *1 connect() to unix:/tmp/myproject.sock failed (2: No such file or directory)

这些问题基本上是Nginx 和 Gunicorn 连接的权限问题。 为简单起见,我建议为您创建的每个文件/项目/python 程序授予相同的 nginx 权限

要解决所有问题,请遵循以下方法: 首先是:

    以root用户登录系统 创建 /home/nginx 目录。 完成此操作后,按照website 进行操作直到创建一个 Upstart 脚本。 运行 chown -R nginx:nginx /home/nginx 对于 upstart 脚本,在最后一行进行以下更改: exec gunicorn --workers 3 --bind unix:myproject.sock -u nginx -g nginx wsgi 不要添加 -m 权限,因为它会弄乱套接字。从 Gunicorn 的文档来看,默认 -m 时,python 会找出最佳权限 启动新贵脚本

    现在只需转到 /etc/nginx/nginx.conf 文件。 转到服务器模块并附加:

    位置/ 包括代理参数; proxy_pass http://unix:/home/nginx/myproject.sock; 删除 不要从这里开始关注数字海洋文章

      现在重启 nginx 服务器,一切顺利。

【讨论】:

【参考方案5】:

我遇到了同样的问题,发现我在 gunicorn 脚本中将 DJANGO_SETTINGS_MODULE 设置为生产设置,而 wsgi 设置正在使用 dev。

我将 DJANGO_SETTINGS_MODULE 指向 dev,一切正常。

【讨论】:

以上是关于Nginx Django 和 Gunicorn。 Gunicorn 袜子文件丢失?的主要内容,如果未能解决你的问题,请参考以下文章

Nginx Django 和 Gunicorn。 Gunicorn 袜子文件丢失?

为啥 nginx 不会用 django 和 gunicorn 显示静态内容?

Gunicorn 和 Django 与 Upstart 和 Nginx

使用 Nginx、Gunicorn 和 Supervisor 部署 Django

使用 Django、Nginx、Gunicorn 和主管进行空日志记录

使用 nginx 和 gunicorn 运行多个 django 项目