我最近决定放弃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
我不知道这意味着什么
供您参考:
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
[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
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
}
如果还有其他需要,请问!我的真正问题是我不知道如何找到问题。我可以使用什么工具?
预先感谢您的帮助。
我可以确认我没有来自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,
},
},
}
在浏览我的网站时,我没有任何错误登录(页面始终显示,其他页面从不显示,有些页面有时显示,有时不显示)。
我尝试遵循this tutorial,即不使用中间袜子文件。即使执行myvenv/bin/gunicorn -c myvenvprod/gunicorn_config.py myproject.wsgi
也不成功,但我能够访问我的网站(否则无法访问):我仍在随机显示(或不显示)我的页面。我真的没有任何线索,这是官方的,这种随意的行为使我发疯!
答案 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。