将JSON从Nginx传递给Gunicorn

时间:2015-06-07 07:07:54

标签: python django nginx gunicorn

我使用nginx作为使用gunicorn的Django应用程序的代理服务器。 Django应用绑定到http://127.0.0.1:8000。这是来自etc / nginx / sites-enabled / parkitbackend的我的nginx设置:

server {

    server_name AA.BB.CC.DD;

    access_log off;

    location /static/ {
        autoindex on;
        alias /home/zihe/parkitbackend/parkitbackend/common-static/;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
    }
}

我正在使用python请求模块:

requests.post("http://AA.BB.CC.DD/dashboard/checkin/", data=unicode(json.dumps(payload), "utf8"))

将JSON对象发布到名为dashboard的django应用程序中,我在dashboard / views.py中有一个名为 checkin 的函数来处理JSON对象。

我没有收到运行JSON发布脚本的任何错误。但是,Nginx似乎无法将请求传递给在127.0.0.1:8000绑定的gunicorn。我应该怎么做才能使用Nginx将JSON传递给我的django应用程序?谢谢!

附加说明: 我非常确定JSON发布代码和我的django应用程序正常工作,因为我通过将Django app绑定到http://AA.BB.CC.DD:8000来测试它并在python中运行此代码:

requests.post("http://AA.BB.CC.DD:8000/dashboard/checkin/", data=unicode(json.dumps(payload), "utf8"))

我的django app按预期收到了JSON。

1 个答案:

答案 0 :(得分:0)

我检查了位于/ var / log / nginx /的error.log。事实证明我发送的JSON太大而且发出了这个错误:

[error] 3450#0: *9 client intended to send too large body: 1243811 bytes, client: 127.0.0.1, server: _, request: "POST /dashboard/checkin/ HTTP/1.1", host: "127.0.0.1"

阅读此链接后:http://gunicorn-docs.readthedocs.org/en/19.3/deploy.html#nginx-configuration

我缩小了JSON的大小并修改了etc / nginx / sites-enabled / parkitbackend,如下所示:

upstream app_server {
    server 127.0.0.1:8000;
}

server {
    listen AA.BB.CC.DD:80;
    server_name = _;

    location / {
        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;
    }

    location /static/ {
        autoindex on;
        alias /home/username/parkitbackend/parkitbackend/common-static/;
    }

}

并在/etc/nginx/nginx.conf中替换了这一行:

include /etc/nginx/sites-enabled/*;

用这个:

include /etc/nginx/sites-enabled/parkitbackend;

问题解决了。