Django + gunicorn + nginx:502错误的网关,但有时仅是?

时间:2018-08-15 21:45:38

标签: django nginx gunicorn

我最近决定放弃apache2 + mod_wsgi并尝试使用gunicorn + nginx运行我的Django应用。

在干净的Ubuntu 16.04安装上,我完全遵循这些教程,

我认为一切都很好,但是在浏览我的网站时,我注意到有时不显示任何页面,而只是显示502 Bad Gateway错误。看着error/var/log/nginx/error.log,我只有以下错误:

upstream prematurely closed connection while reading response header from upstream

我不知道这意味着什么

  • 如果在本地主机上运行时没有问题,为什么要安装Django?
  • 还:有时所有页面都能正常工作并显示正常;有时相同的页面会抛出502错误:(
  • 如果问题出自哪里,我怎么知道我的gunicorn安装有什么问题?如何调试?

供您参考:


/etc/systemd/system/gunicorn.socket

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

/etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=myself
Group=www-data
WorkingDirectory=/home/myself/django/myproject
ExecStart=/home/myself/django/myproject/venvprod/bin/gunicorn \
          --access-logfile - \
          --bind unix:/run/gunicorn.sock \
          myproject.wsgi:application

[Install]
WantedBy=multi-user.target

/ etc / nginx / sites-enabled / myproject

server {
    server_name mysite.fr mysite.com;
    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/myself/django/myproject;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mysite.fr/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mysite.fr/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = mysite.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    if ($host = mysite.fr) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name mysite.fr mysite.com;
    return 404; # managed by Certbot
}

如果还有其他需要,请问!我的真正问题是我不知道如何找到问题。我可以使用什么工具?

预先感谢您的帮助。


修改1

我可以确认我没有来自Django代码的任何错误。我记录了所有内容,如下所示:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/home/krazymax/debug-m2g.log',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'django.template': {
            'handlers': ['file'],
            'level': 'INFO',
            'propagate': True,
        },
    },
}

在浏览我的网站时,我没有任何错误登录(页面始终显示,其他页面从不显示,有些页面有时显示,有时不显示)。


编辑2

我尝试遵循this tutorial,即不使用中间袜子文件。即使执行myvenv/bin/gunicorn -c myvenvprod/gunicorn_config.py myproject.wsgi也不成功,但我能够访问我的网站(否则无法访问):我仍在随机显示(或不显示)我的页面。我真的没有任何线索,这是官方的,这种随意的行为使我发疯!

3 个答案:

答案 0 :(得分:2)

我有同样的问题。我安装Django,Gunicorn,nginx,请点击以下链接:https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-18-04 有时我的网站变慢并出现502错误。尤其是在一段时间闲置并卷土重来时。首先单击获取502,然后单击两次使网站运行平稳。 我建立了这个:https://www.datadoghq.com/blog/nginx-502-bad-gateway-errors-gunicorn/ 就我而言:我会增加gunicorn和nginx超时时间:

nginx:

location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
        proxy_connect_timeout 300s;
        proxy_read_timeout 300s;
    }

独角兽服务:

ExecStart=/home/myself/django/myproject/venvprod/bin/gunicorn \
          --access-logfile - \
          --bind unix:/run/gunicorn.sock \
          --timeout 60 \
          myproject.wsgi:application

答案 1 :(得分:1)

此错误通常表示Nginx和Gunicorn之间没有“连接”,问题是套接字文件。

运行“ / home / myself / django / myproject / venvprod / bin / gunicorn myproject.wsgi -b 0.0.0.0:8000”,然后查看输出。 这会在不妖魔化您的Django进程的情况下执行gunicorn服务器。

也许您的Django代码中有错误,并且套接字未正确创建。 在Gunicorn打开的同时,还尝试通过浏览器访问YOUR_IP:8888(例如52.45.241.21:8888):您看到该网站了吗?

如果看到一些Python错误,则应首先使用“ manage.py runserver 0.0.0.0:8000”调试项目。

runserver之后的0.0.0.0:8000允许您通过外部浏览器访问您的网站(例如Gunicorn中的-b 0.0.0.0:8000选项)

记住:在执行Django项目部署上的任何教程之前,请先使用Runserver检查项目是否在计算机上正常运行

编辑:也可以尝试以下更简单的教程:https://gist.github.com/ravidsrk/8431321

希望这个帮助! :)

答案 2 :(得分:0)

经过一千次搜索,我找到了解决问题的方法。

我在虚拟环境中安装了 gunicorn。我必须转到安装文件夹 /virtual/venv/lib/python3.7/site-packages/gunicorn$ 并修改 config.py 文件,将超​​时时间增加到 3000。