【问题标题】:nginx, django -- uwsgi does not see POST datanginx, django -- uwsgi 看不到 POST 数据
【发布时间】:2013-09-03 15:34:38
【问题描述】:

这是 .ini 文件:

module=myapp.wsgi:application
master=True
pidfile=/tmp/project-master.pid
socket=127.0.0.1:8000
vacuum=True
max-requests=5000
daemonize=/home/mercier/django/site/wsgi.log
buffer-size=327680
processes=16
listen=500
timeout=10
post-buffering=1

nginx 使用 uwsgi_pass 指令转发连接。

从 django 看不到任何发布数据 - request.POST 只是 {}。这是一个大问题......我该如何解决这个问题?在开发(runserver)中看到了post数据。

重要提示:nginx 和 wsgi 都以 200(OK)响应。我也尝试设置不同的后缓冲(在这里和那里找到),但没有区别......

django 1.4 uwsgi 1.9.15 nginx 1.2.1

编辑3: 现在我尝试使用 webob: (load request.environ) 客户端在发送 POST/PUT 正文时断开连接(预计多 39 个字节)

现在我手动尝试: print request.environ['wsgi.input'].read(39) -> 是一个空行...

Edit4:我没有尝试在网上找到的任何提示,我正在考虑尝试 fcgi 或将其部署在运行服务器上;(

Edit5:相关的 nginx.conf(启用站点)部分:

server {

        listen   80; 

        server_name  localhost;

        access_log  /var/log/nginx/localhost.access.log;


        location / {
                root   /var/www;
                index  index.html index.htm;
                proxy_set_header X-FORWARDED-FOR $remote_addr;

                include uwsgi_params;
                uwsgi_pass_request_body on;
                uwsgi_pass_request_headers on;
                uwsgi_pass 127.0.0.1:8000;



        }

uwsgi_params:

uwsgi_param     QUERY_STRING            $query_string;
uwsgi_param     REQUEST_METHOD          $request_method;
uwsgi_param     CONTENT_TYPE            $content_type;
uwsgi_param     CONTENT_LENGTH          $content_length;

uwsgi_param     REQUEST_URI             $request_uri;
uwsgi_param     PATH_INFO               $document_uri;
uwsgi_param     DOCUMENT_ROOT           $document_root;
uwsgi_param     SERVER_PROTOCOL         $server_protocol;
uwsgi_param     UWSGI_SCHEME            $scheme;

uwsgi_param     REMOTE_ADDR             $remote_addr;
uwsgi_param     REMOTE_PORT             $remote_port;
uwsgi_param     SERVER_PORT             $server_port;
uwsgi_param     SERVER_NAME             $server_name;
uwsgi_param     DOCUMENT_BODY           $request_body;

编辑6:

这是我正在使用的应用程序(模块=):

import os,sys
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "site.settings")
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__),
"../../")))
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__),
"../")))

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

【问题讨论】:

  • 注意:$request_body 是我解决这个问题的方法。

标签: python django nginx uwsgi


【解决方案1】:

x=request.body

这应该是 wsgi 运行的任何 django 应用程序的第一行。然后 POST DATA 工作。如果稍后使用,Django 必须立即读取请求正文。

但是,还是有这个问题: 无效的 uwsgi 请求(当前 strsize:16705)。跳过。

所以我很难在这个设置中使用 uwsgi。我通过使用 fcgi 解决了这个问题,它没有这样的限制。

理由:strsize 不可配置 -- http://comments.gmane.org/gmane.comp.python.wsgi.uwsgi.general/5712

编辑:Roberto 是对的——strsize 与请求的主体无关,即使在 uwsgi 中也可以使用。在旅行、夜间等期间调试问题并不总是一个好主意;) 但是,Django 必须立即读取正文请求,这是毫无疑问的。在执行任何其他操作之前必须阅读请求的正文。

【讨论】:

  • 不要这样做,您将整个身体(可能很大)作为单个 CGI var(大小有限)传递。传递请求正文没有什么神奇的,所以我想你做错了什么。正如我已经建议尝试删除 nginx 并仅使用 uWSGI 来查看问题所在
  • 我按照你的建议做了,但 uwsgi 仍然没有看到任何 POST 数据。它确实看到了内容长度,来自 nginx 的 content_length 也是如此,因为它是作为 uwsgi_param 显式传递的。正文(即 POST 数据)不是,所以唯一可能的解决方案是传递整个正文,对吗?
  • 但我能做错什么?我注意了网上的docs/tutorials/howtos中的内容... Ini在上面,nginx有一个相当标准的conf。 uwsgi_param 的最大大小是多少?你说它是有限的。
  • 顺便说一句,来自github.com/unbit/uwsgi-docs/blob/master/tutorials/… 的“基本测试”在发送 POST 数据时似乎正在工作。但是使用 django 的真实配置不会;/
  • 你是对的。 uWSGI 的变量受 16705 限制。现在这是个问题,否则无法读取发布数据。出了点问题,但似乎我找不到这个问题,尽管我想我几乎尝试了所有东西(原帖已更新)。
【解决方案2】:

尝试删除 nginx 看看问题出在哪里。以http模式运行uWSGI:

http-socket=127.0.0.1:8000

并连接到端口 8000

如果一切正常,请确保 nginx 正在传递 CONTENT_LENGTH 参数

最后粘贴你的 nginx 配置

【讨论】:

  • 查看我对帖子的最新编辑。 Django 是唯一的原因,但是,您的建议是不可或缺的。谢谢。
  • 对于 nginx 通过 uwsgi 协议 CONTENT_LENGTH uwsgi_param 传递 POST 正文是必不可少的。这不是很明显 - 谢谢。
猜你喜欢
  • 2013-03-30
  • 2014-05-31
  • 2017-08-07
  • 2019-03-03
  • 2017-05-02
  • 2011-10-10
  • 2011-11-25
  • 2017-04-12
  • 2012-01-06
相关资源
最近更新 更多