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

时间:2015-02-24 06:27:12

标签: python django python-2.7 nginx 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

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

由于

5 个答案:

答案 0 :(得分:22)

好吧,因为我没有足够的代表发表评论,我在这里提到缺少套接字建议没有很多特异性,但我可以告诉你一些我是如何开始的穿上你的鞋子并开始工作。

它的长短不一之处在于,当被新贵开始运行并且从未上升,运行或关闭时,gunicorn遇到了问题。以下是一些可帮助您获取更多信息以跟踪问题的步骤:

  • 在我的情况下,当发生这种情况时,gunicorn从来没有做过任何错误记录,所以我不得不寻找其他地方。试试ps auxf | grep gunicorn,看看你是否有工人要去。我没有。
  • 在系统日志中查看来自新贵的投诉grep init: /var/log/syslog,向我展示我的枪炮服务因为重生太快而被停止了,但我怀疑这是你的问题,因为你没有&#39 ;你的conf中有一个respawn。无论如何,你可能会在那里找到一些东西。
  • 看到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用户身份运行。

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

答案 1 :(得分:8)

在跟随Michal Karzynski的伟大导游'Setting up Django with Nginx, Gunicorn, virtualenv, supervisor and PostgreSQL'之后,我遇到了同样的问题。

这就是我解决它的方法。

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

SOCKFILE={{ myapp absolute path }}/run/gunicorn.sock

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

TL; DR

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

答案 2 :(得分:2)

当您还没有pip安装需求时,也可能会出现错误。在我的情况下,查看gunicorn错误日志,发现其中缺少一个模块。通常会在您忘记点安装新要求时发生。

答案 3 :(得分:1)

我遇到了同样的问题,发现我已经将DJANGO_SETTINGS_MODULE设置为gunicorn脚本中的生产设置,并且wsgi设置使用了开发。

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

答案 4 :(得分:0)

好吧,我在这个问题上工作了一个多星期,终于能够搞清楚了。 请关注digital ocean中的链接,但他们没有查明包含

的重要问题
  1. 连接上游时没有上游
  2. * 4 connect()到unix:/myproject.sock连接上游时失败(13:权限被拒绝)
  3. gunicorn OSError:[Errno 1]不允许操作
  4. * 1 connect()到unix:/tmp/myproject.sock失败(2:没有这样的文件或目录)

    <强>等

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

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

    1. 以root用户身份登录系统
    2. 创建/ home / nginx目录。
    3. 执行此操作后,请按照website 进行操作,直到创建一个Upstart脚本。
    4. 运行chown -R nginx:nginx / home / nginx
    5. 对于upstart脚本,请在最后一行执行以下更改: exec gunicorn - 工作者3 - 绑定unix:myproject.sock -u nginx -g nginx wsgi 不要添加-m权限,因为它弄乱了套接字。从Gunicorn的文档中,当-m是默认值时,python会找出最佳权限
    6. 启动upstart脚本
    7. 现在转到/etc/nginx/nginx.conf文件。 转到服务器模块并附加:

      location / {         包括proxy_params;         proxy_pass http&lt;&gt;:&lt;&gt; // unix:/home/nginx/myproject.sock;         } 删除&lt;&gt; 请勿在此处关注digitalocean aricle

      1. 现在重新启动nginx服务器,你很高兴。