一个Django应用程序正在AWS实例上运行,通过gunicorn和nginx配置,它运行了一年多,但突然间,我得到了502错误的网关错误,然后我在nginx错误中看到了下面提到的消息日志,
error_code
我的nginx配置:
2017/05/17 16:18:35 [error] 1040#0: *7460 connect() to unix:/home/ubuntu/webapps/myproject/myproject/myproject.sock failed (111: Connection refused) while connecting to upstream, client: xx.xxxx.xx.xxx, server: xx.xx.xx.xxx, request: "GET / HTTP/1.1", upstream: "http://unix:/home/ubuntu/webapps/myproject/myproject/myproject.sock:/", host: "xx.xx.xx.xxx", referrer: "http://xx.xx.xx.xxx"
my gunicorn.conf
server {
client_max_body_size 200M;
listen 80;
listen [::]:80 ipv6only=on;
server_name xx.xx.xx.xxx;
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/myserver.crt;
ssl_certificate_key /etc/nginx/ssl/myserver.key;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/ubuntu/webapps/myproject/myproject;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/ubuntu/webapps/myproject/myproject/myproject.sock;
proxy_set_header X-Forwarded-Protocol $scheme;
}
if ($scheme = http){
return 301 https://xx.xx.xx.xxx$request_uri;
}
if ($http_host = pas-cash.com){
return 303 https://xx.xx.xx.xxx$request_uri;
}
}
之后我按照命令
重新启动了nginxdescription "Gunicorn application server handling myproject"
start on runlevel [6789]
stop on runlevel [!6789]
respawn
setuid ubuntu
setgid www-data
chdir /home/ubuntu/webapps/myproject/myproject
exec /home/ubuntu/webapps/myproject/venv/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/webapps/myproject/myproject/myproject.sock myproject.wsgi:application
重新启动后,应用程序运行良好,我找不到这个错误背后的具体原因,我用谷歌搜索了这个,但我得到了不同类型的答案,但没有什么适合我,你们可以请帮助我,为什么会发生这种情况,我的配置中是否有任何遗漏或者这种行为背后的常见/一般原因是什么。这对我很有帮助,在此先感谢。
答案 0 :(得分:2)
尝试从nginx配置中的proxy_pass中删除http://
:
server {
client_max_body_size 200M;
listen 80;
listen [::]:80 ipv6only=on;
server_name xx.xx.xx.xxx;
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/myserver.crt;
ssl_certificate_key /etc/nginx/ssl/myserver.key;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/ubuntu/webapps/myproject/myproject;
}
location / {
include proxy_params;
proxy_pass unix:/home/ubuntu/webapps/myproject/myproject/myproject.sock;
proxy_set_header X-Forwarded-Protocol $scheme;
}
if ($scheme = http){
return 301 https://xx.xx.xx.xxx$request_uri;
}
if ($http_host = pas-cash.com){
return 303 https://xx.xx.xx.xxx$request_uri;
}
}
原因是gunicorn
正在侦听unix套接字(--bind
参数)。然后nginx
应该将流量转发到此套接字。 http://
代表常规IP中的TCP套接字:PORT,这不是你的情况。
答案 1 :(得分:1)
这是“突然”引起的,不是因为 nginx 错误,而是因为 gunicorn 或您的应用程序的错误(代码错误、未安装软件包等)。不过,它应该相对容易记录和修复。
首先尝试从服务器 python manage.py runserver
运行您的应用,看看您是否遇到任何问题。 ... migrate
也是如此。生产不工作但本地工作的问题通常是因为缺少包或缺少迁移。在本地创建一个 requirements.txt 文件并将其安装到生产环境中。
如果错误仍然存在,请使用 gunicorn --log-file=- YourApp.wsgi:application
检查 gunicorn 日志。纠正所有这些错误后,运行
sudo systemctl status gunicorn.socket
sudo systemctl status gunicorn
并且您希望同时处于活动状态和运行状态。如果您开始收到 400 错误,这是一个好兆头,因为它现在是 Django 错误(通常是允许的主机)。转 debug=True 以查看 django 的确切错误。
记住每当对代码运行进行任何更改时
sudo systemctl daemon-reload
sudo systemctl restart gunicorn
仅供参考,如果以上都不起作用,那么您可以随时使用
检查您的 nginx 日志sudo tail -30 /var/log/nginx/error.log
答案 2 :(得分:0)
此特定问题有多种原因,就我而言,是因为未启用该服务。运行 sudo systemctl enable gunicorm.service
后修复它。