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

问题描述 投票:9回答:4

我有一个基于这个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

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

谢谢

python django python-2.7 nginx gunicorn
4个回答
22
投票

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

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

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

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


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. 利润

1
投票

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

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


0
投票

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

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

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

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

  1. 以root用户登录系统
  2. 创建/ home / nginx目录。
  3. 执行此操作后,按照website进行操作,直到创建一个Upstart脚本。
  4. 运行chown -R nginx:nginx / home / nginx
  5. 对于upstart脚本,在最后一行进行以下更改:exec gunicorn --workers 3 - 绑定unix:myproject.sock -u nginx -g nginx wsgi不要添加-m权限,因为它会弄乱套接字。从Gunicorn的文档中,当-m是默认值时,python会找出最佳权限
  6. 启动upstart脚本
  7. 现在转到/etc/nginx/nginx.conf文件。转到服务器模块并附加: location / {include proxy_params; proxy_pass http <>:<> // unix:/home/nginx/myproject.sock; } REMOVE <>不要从这里开始关注digitalocean aricle 现在重新启动nginx服务器,你很高兴。
© www.soinside.com 2019 - 2024. All rights reserved.