django-gunicorn-nginx:502 网关错误
Posted
技术标签:
【中文标题】django-gunicorn-nginx:502 网关错误【英文标题】:django-gunicorn-nginx: 502 bad gateway 【发布时间】:2012-05-28 20:41:02 【问题描述】:我正在尝试将我的 Web 应用程序发送到服务器,这是我第一次配置服务器。我正在按照本教程使用 django-gunicorn-nginx 设置http://ijcdigital.com/blog/django-gunicorn-and-nginx-setup/ 首先一切都很完美,我得到了 django 欢迎页面。然后我在 django 项目中加载了应用程序并设置了静态根目录,现在我得到 502 bad gateway 你可以在 http://qlimp.com
中查看gunicorn 和 supervisor 设置的所有内容都与该教程中所示的相同。但是我修改了一些nginx conf。这里是:
upstream app_server_djangoapp
server localhost:8001 fail_timeout=0;
server
listen 80;
server_name qlimp.com;
access_log /var/log/nginx/guni-access.log;
error_log /var/log/nginx/guni-error.log info;
keepalive_timeout 5;
location /
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename)
proxy_pass http://app_server_djangoapp;
break;
location /files/
autoindex on;
root /home/nirmal/qlimp/qlimp/files/;
这是我的媒体网址:
MEDIA_URL = '/files/'
Files 是我拥有所有静态文件的文件夹。我怎样才能让我的项目在服务器上工作?谁能指导我?
更新
Errors.log https://gist.github.com/2768425
谢谢!
【问题讨论】:
502 基本意思是,nginx无法连接upserver。 @vartec 为什么会这样?我在 conf 设置中有什么错误吗? @mk:我不知道为什么,你必须自己调试。看看你的日志。尝试查看localhost:8001 是否在本地等工作。 调试?你能告诉我步骤吗? @vartec gist.github.com/2768425 【参考方案1】:首先。不要在 nginx conf 中使用if
。这不好。真的,真的很可怕。请改用以下内容:
location /
try_files $uri @proxy;
location @proxy
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server_djangoapp;
请参阅:http://wiki.nginx.org/IfIsEvil 和 http://wiki.nginx.org/Pitfalls
现在,就调试而言。你的 gunicorn 工人正在启动,因为有一些致命的错误。尝试关闭 gunicorn。如果您使用的是主管:
sudo supervisorctl stop [gunicorn process name]
然后,从您的项目根目录运行:
python manage.py run_gunicorn -c path/to/gunicorn.conf
注意任何启动错误,或者如果它实际启动,请在浏览器中测试您的网站。如果您仍然没有获得任何有意义的信息,请尝试运行标准运行服务器
python manage.py runserver
同样,请注意任何错误,如果加载正常,请在浏览器中测试您的网站。我建议像在开发中一样在 localhost:8000 上进行测试。其中之一应该可以为您提供一些东西。
更新
您收到的错误是它无法连接到“ind=127.0.0.1”。然后,查看您正在运行的命令gunicorn_django -bind=127.0.0.1:8001
,很容易看出问题所在。您可以使用-b
或--bind
指定要绑定的IP 和端口。由于您只使用了一个-
,因此将IP 解释为ind=127.0.0.1
,这显然是不正确的。你需要使用:
gunicorn_django --bind=127.0.0.1:8001
或者
gunicorn_django -b 127.0.0.1:8001
【讨论】:
我已经按照你说的做了修改。然后我运行这个命令:sudo supervisorctl stop qlimp
。它显示unix:///var/run/supervisor.sock no such file
当我运行这个python manage.py runserver
它什么都没有显示,但是当我运行gunicorn_django -bind=127.0.0.1:8001
它显示gist.github.com/2769983
对于这个代码python manage.py run_gunicorn -c path/to/gunicorn.conf
它显示Unknown command: 'run_gunicorn'
run_gunicorn
仅在您将 gunicorn 添加到 INSTALLED_APPS
时才有效。不过,我想我看到了你的问题。查看更新。
是的,现在我进行了更改。然后python manage.py run_gunicorn -c path/to/gunicorn.conf
它显示gist.github.com/2770230但我安装了python映像库,它一次又一次地显示相同的错误【参考方案2】:
您需要正确理解指令。 “server_name”指令保存 IP 地址,“proxy_pass”将连接到托管服务器的端口。在你的情况下:
server_name 127.0.0.1;
proxy_pass http://127.0.0.1:8001;
这没有理由不工作,但如果它不工作,那么尝试“python manage.py runserver”命令以确保您的站点运行时没有错误,因为以防站点无法向 wsgi 提供数据.py 可能会显示相同的错误。
【讨论】:
【参考方案3】:增加keepalive_timeout。
server
listen 5000 default deferred;
client_max_body_size 4G;
keepalive_timeout 5;
server_name _;
location /
proxy_read_timeout 800;
proxy_pass http://localhost:9000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
break;
【讨论】:
【参考方案4】:尝试使用像 gevent 这样的 worker-class。 我在 python 3.7 中使用 gevent 时遇到了一些问题,最好使用 python 3.6。
Django,Python 3.6 示例:
pip install gevent
gunicorn my_app.wsgi --workers 2 --worker-class=gevent --bind 0.0.0.0:80 --timeout=90 --graceful-timeout=10
【讨论】:
gevent 在对 python 3.7 的支持方面落后了一段时间;稳定版本在 gevent 1.5.0 中赶上了 python 3.7 和 3.8。以上是关于django-gunicorn-nginx:502 网关错误的主要内容,如果未能解决你的问题,请参考以下文章