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

Python Nginx Django和Gunicorn。Gunicorn袜子文件丢失?,python,django,python-2.7,nginx,gunicorn,Python,Django,Python 2.7,Nginx,Gunicorn,我有一个基于此配置的ansible虚拟机,但由于某些原因,尝试启动Gunicorn时会出现以下错误: 无法连接到/path/to/my/gunicorn.sock 在nginx日志文件中: connect()到unix:/path/to/my/gunicorn.sock在连接到上游时失败(2:没有这样的文件或目录) 实际上,指定目录中缺少套接字文件。我已经检查了目录的权限,它们都很好 这是我的gunicorn_开始脚本: NAME="{{ application_name }}" DJANGOD

我有一个基于此配置的ansible虚拟机,但由于某些原因,尝试启动Gunicorn时会出现以下错误:

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

在nginx日志文件中:

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

实际上,指定目录中缺少套接字文件。我已经检查了目录的权限,它们都很好

这是我的gunicorn_开始脚本:

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
是否有人能提出导致套接字文件丢失的其他原因


谢谢

好吧,因为我没有足够的代表发表评论,我在这里要提到的是,缺少的插座没有太多的特殊性,但我可以告诉你一些关于我是如何从你的角度开始工作的

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

  • 在我的例子中,当这种情况发生时,gunicorn从未抽出时间做任何错误日志记录,所以我不得不去别处寻找。请尝试
    ps auxf | grep gunicorn
    ,查看是否有员工离开。我没有
  • 在系统日志中查找来自upstart的投诉,
    grep init:/var/log/syslog
    ,我发现我的gunicorn服务已停止,因为它恢复得太快,尽管我怀疑这将是您的问题,因为您的配置中没有恢复。无论如何,您可能会在那里找到一些东西
  • 在看到gunicorn无法运行或记录错误后,我决定尝试从命令行运行它。转到manage.py所在的目录,对gunicorn实例运行upstart命令的扩展版本。比如(用适当的垃圾代替我使用的垃圾来替换所有的VAR):

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

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

    • django错误(可能是加载设置模块时出现问题?)。确保您的wsgi.py正在引用服务器上相应的设置模块
    • upstart脚本中的空白问题。我有一个标签藏在空间里,把东西都吞了
    • 用户/权限问题。最后,我能够在命令行上以root用户身份运行gunicorn,但不能通过upstart配置以非root用户身份运行gunicorn

希望有帮助。我花了好几天的时间来追踪这些东西。

在阅读了迈克尔·卡钦斯基的《伟大指南》之后,我遇到了同样的问题

我就是这样解决的

我在bash脚本中使用了这个变量,通过Supervisor(myapp/bin/gunicorn\u start)启动gunicorn:

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

TL;DR

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

  • 嗯,我在这个问题上花了一个多星期的时间,终于找到了答案。 请遵循的链接,但他们并没有指出重要的问题,其中包括一个

  • 连接到上游时没有带电的上游
  • *4连接unix:/myproject.sock()到上游时失败(13:权限被拒绝)
  • gunicorn操作错误:[Errno 1]不允许操作
  • *1连接()到unix:/tmp/myproject.sock失败(2:没有这样的文件或目录)

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

    要解决所有问题,请遵循以下方法: 第一件事是:

  • 以root用户身份登录到系统
  • 创建/home/nginx目录
  • 完成此操作后,按照进行操作,直到创建一个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将计算出最佳权限
  • 启动upstart脚本
  • 现在只需转到/etc/nginx/nginx.conf文件。 转到服务器模块并附加:

    地点/{ 包括代理参数; 代理通行证http://unix:/home/nginx/myproject.sock; } 删除 从现在开始,不要跟随数字海洋地图

  • 现在重新启动nginx服务器,就可以开始了

  • 我也遇到了同样的问题,发现我在gunicorn脚本中将DJANGO_SETTINGS_模块设置为生产设置,而wsgi设置使用的是dev


    我将DJANGO_设置_模块指向dev,一切正常

    当您尚未安装需求时,也可能会出现错误。在我的例子中,查看gunicorn错误日志,我发现有一个丢失的模块。通常发生在您忘记pip安装新需求时。

    hmm,忘了提到您可能应该使用--daemon o
    SOCKFILE={{ myapp absolute path }}/run/gunicorn.sock