【发布时间】:2019-01-22 19:31:56
【问题描述】:
我最近决定放弃 apache2 + mod_wsgi 并尝试使用 gunicorn + nginx 来运行我的 Django 应用程序。
在干净的 Ubuntu 16.04 安装上,我完全按照这些教程进行操作:
- https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04
- https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-16-04#create-a-gunicorn-systemd-service-file
我以为一切都会好起来的,但是在浏览我的网站时,我注意到有时有几个页面根本没有显示,只是显示502 Bad Gateway 错误。查看error/var/log/nginx/error.log,我只有以下错误:
upstream prematurely closed connection while reading response header from upstream
我不知道这意味着什么:
- 如果我在 localhost 上运行时没有问题,为什么要安装 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,即不使用中间 sock 文件。没有成功,即使在执行 myvenv/bin/gunicorn -c myvenvprod/gunicorn_config.py myproject.wsgi 时我能够访问我的网站(否则不能):我的页面仍然随机显示(或不显示)。我真的不知道,这是官方的,这种随机行为让我发疯!
【问题讨论】: