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