502 错误 django + nginx + gunicorn - connect() recv()

Posted

技术标签:

【中文标题】502 错误 django + nginx + gunicorn - connect() recv()【英文标题】:502 error django + nginx + gunicorn - connect() recv() 【发布时间】:2017-05-17 18:29:05 【问题描述】:

我已经设置了一个 Digital Ocean 一键式应用程序(安装了 django + nginx + gunicorn 并设置了https://www.digitalocean.com/community/tutorials/how-to-use-the-django-one-click-install-image)。默认值对我有用,但在我尝试通过 service gunicorn restart 应用代码更改后,我收到了 502 错误,并显示以下 nginx 错误日志行:

 connect() to unix:/home/django/gunicorn.socket failed (111: Connection refused) while connecting to upstream, client: 178.136.215.70, server: _, request: "GET / HTTP/1.1",upstream: "http://unix:/home/django/gunicorn.socket:/"..

我研究了类似的问题,发现通常是由 ALLOWED_HOSTS 中的错误引起的,一切都在那里,但我也尝试用单个 '*' 替换 'ip''www.address.com' 并得到不同的错误:

recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 178.136.215.70, server: _, request: "GET / HTTP/1.1", upstream: "http://unix:/home/django/gunicorn.socket:/", host: "192.241.176.184"

编辑:好的,现在更容易了,gunicorn 错误日志告诉我们rest_framework 存在导入错误,但它已安装并且它存在于已安装的应用程序中(并且拼写正确),我已经检查了数千次所以是什么这一切真的错了吗?

     File "/usr/lib/python2.7/dist-packages/django/core/wsgi.py", line 14, in get_wsgi_application
    django.setup()
  File "/usr/lib/python2.7/dist-packages/django/__init__.py", line 18, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/lib/python2.7/dist-packages/django/apps/registry.py", line 108, in populate
    app_config.import_models(all_models)
  File "/usr/lib/python2.7/dist-packages/django/apps/config.py", line 198, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/usr/lib/python2.7/dist-packages/gevent/builtins.py", line 93, in __import__
    result = _import(*args, **kwargs)
  File "/home/django/django_project/blog/models.py", line 5, in <module>
    from rest_framework import serializers
  File "/usr/lib/python2.7/dist-packages/gevent/builtins.py", line 93, in __import__
    result = _import(*args, **kwargs)
ImportError: No module named rest_framework

(目前唯一的问题)EDIT2:我已经重新安装了应用程序文件夹,再次检查了所有内容。现在它告诉ImportError: No module named django_ajax。 Python 2.7、Django 1.8、Gunicorn 19.4.5 (https://github.com/yceruto/django-ajax) 尽管一切似乎都是正确的

编辑:点冻结的响应:

    Django==1.8
django-filter==1.0.1
-e git://github.com/yceruto/django-ajax@9c122e68f8e7ca92333a1533fa464ee6da0f65c5#egg=djangoajax
djangorestframework==3.5.3
gunicorn==19.6.0
Markdown==2.6.7
netifaces==0.10.5
pkg-resources==0.0.0
psycopg2==2.6.2

【问题讨论】:

你安装对了吗?好像有django-ajaxdjangoajax 我在我的 venv 中安装了包 django-ajax,然后它能够​​导入 django_ajax 你能不能在激活 virtualenv 的情况下执行 pip freeze 以查看它是否已经安装。 你能分享一下“pip freeze”的回复吗?这将有助于我们理解,如果 django-ajax 库安装在 venv 或机器本身上 我不确定您为什么要获得 django-ajax 的 github 链接。我的点子冻结是这样出现的。 Django==1.10.5 django-ajax==0.2.0 你可以卸载它并执行 pip install django-ajax 有道理。你能搜索一下哪个 Python 【参考方案1】:

当您执行 Sudo 时,会为 root 用户安装该软件包,并且它会在全局范围内安装。检查此link 以了解 sudo pip 的工作原理。现在您的软件包已全局安装,它正在工作。

我仍然怀疑它使用的是哪个 Python。在错误消息中,它试图访问全局 dist-packages 目录下的包。不是来自虚拟环境。因此,您的 gunicorn 发送链接到全局安装的 Python 而不是虚拟环境之一。

理想情况下,发生的错误应该指向/path/to/virtual_env/virtual_env/lib/python2.7/dist-packages 下的dist-packages,因为这是要使用的python 和库环境。这似乎是问题所在。

如果是这种情况,你能做到以下几点

DJANGODIR=/path/to/django-project/ 
DJANGO_SETTINGS_MODULE=django-project.settings 

激活虚拟环境

cd $DJANGODIR
source /path/to/virtualenv/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

我认为这应该可以解决所有问题...请尝试一下,如果我错过了什么,请告诉我

【讨论】:

【参考方案2】:

我不确定是否应将其视为答案,因为我不明白为什么它会以这种方式工作。如果有人解释得当,我会把一个人的答案标记为正确的。所以,这条线对我有用

  sudo -H pip install djangorestframework

尽管有报告称已安装软件包,但它们并未安装。尽管它们在 pip freeze 之后可见。所以我不知道为什么只是 pip install 不起作用但似乎起作用的真正原因(?),尽管所有权限都是正确的,我尝试从 root 和其他具有相同权限的用户名。

【讨论】:

以上是关于502 错误 django + nginx + gunicorn - connect() recv()的主要内容,如果未能解决你的问题,请参考以下文章

nginx 服务于 Django 静态媒体 | 502错误的网关

Django / nginx / uwsgi出现502错误

502 错误 django + nginx + gunicorn - connect() recv()

django、gunicorn 和 Nginx 的 502 错误

使用 nginx+gunicorn+django 的间歇性 502s

使用 AWS Elastic Beanstalk 部署 Django 应用程序时出现 502 Bad Gateway nginx/1.20.0 错误