【问题标题】:uwsgi invalid request block sizeuwsgi 无效请求块大小
【发布时间】:2013-03-30 11:31:45
【问题描述】:

我正在以皇帝模式运行 uwsgi

uwsgi --emperor /path/to/vassals/ --buffer-size=32768

得到这个错误

invalid request block size: 21327 (max 4096)...skip

怎么办??我也试过 -b 32768

【问题讨论】:

  • 缓冲区大小显然仍然是默认值(4096),请确保您使用的是正确的实例。你也可以写“-b 32k”。还要确保此选项(缓冲区大小)尚未在某些配置文件中设置。
  • 没有配置文件。还是不行:(
  • uwsgi-docs.readthedocs.org/en/latest/ThingsToKnow.html你正在尝试使用http协议连接到一个uwsgi套接字,除此之外指定给皇帝的选项没有被继承,它只是一个进程管理器
  • @zakinster 出于某种原因,k 的值格式对我不起作用。必须提供完整号码。找不到任何关于您可以在此处使用的格式的指针。

标签: uwsgi


【解决方案1】:

我在学习一些教程时也遇到了同样的问题。 问题是我设置了选项socket = 0.0.0.0:8000 而不是http = 0.0.0.0:8000socket 选项旨在与某些第三方路由器(例如 nginx)一起使用,而当设置 http 选项时,uwsgi 可以接受传入的 HTTP 请求并自行路由它们。

【讨论】:

  • 我想对此发表评论:uwsgi 有“http”、“http-socket”和“socket”选项。我想调用 cgi python 脚本; “套接字”就是答案。
  • 在 Nginx 配置文件中我们可能想使用这个:include /etc/nginx/uwsgi_params; uwsgi_pass django_upstream;
  • 这不是正确的解决方案。如果我们想要 unix 套接字怎么办?
  • @Farsheed,我刚刚描述了为什么 OP 会看到这个错误。如何修复它完全取决于您。它可能是socket = /tmp/myapp.sockhttp = 0.0.0.0:8000 或其他任何取决于您的需要。
  • 虽然这个答案在某些情况下可以解决问题,但我认为一般情况下的正确答案是下面@Farsheed 提供的答案。
【解决方案2】:

正确的解决方法是不要切换到 HTTP 协议。您只需要在 uWSGI 设置中增加缓冲区大小即可。

buffer-size=32768

或在命令行模式下:

-b 32768

引用官方文档:

默认情况下,uWSGI 为每个请求的头部分配一个非常小的缓冲区(4096 字节)。如果您开始在日志中收到“无效的请求块大小”,这可能意味着您需要更大的缓冲区。使用缓冲区大小选项增加它(最多 65535)。

如果您在日志中收到“21573”作为请求块大小,这可能意味着您正在使用 HTTP 协议与使用 uwsgi 协议的实例通信。不要这样做。

从这里:https://uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html

【讨论】:

  • 有时你不得不使用http协议,因为unix套接字只能在本地机器上使用。考虑一种情况,当你有许多机器和一个单独的平衡器时——你必须在这里使用http-socket
  • @Palasaty 或 IP 套接字和uwsgi 协议,那么您也可能会遇到与 OP 相同的错误
  • @Palasaty,无论如何,修复缓冲区大小都会解决问题!
  • 当使用 nginx 作为反向代理时,我必须使用http-socket。其他任何东西都会给出“502 Bad Gateway”,即使缓冲区大小增加。
  • 至于引用的文档“如果您在日志中收到“21573”作为请求块大小,这可能意味着您正在使用 HTTP 协议与使用 uwsgi 协议的实例交谈。不要做这个。”很明显,这个建议是错误的......另外,@Kartic 用户已经尝试使用“-b”选项......
【解决方案3】:

我可以在 uwsgi 中添加 --protocol=http 来修复它

【讨论】:

  • 如何在 uWSGI 设置 ini 文件中进行设置?我的配置适用于您的建议,但只能在命令行中使用。
  • @HenryLynx,只需将protocol=http 添加到您的.ini 文件中
【解决方案4】:

我在尝试在 nginx 下运行它时遇到了同样的问题,并且正在关注 文档here。需要注意的是,一旦你切换到 nginx,你必须确保你没有试图访问由 --socket 参数指定的端口上的应用程序,而是 nginx.conf 中的“监听”端口。尽管您的问题描述不同,但标题与我遇到的问题完全匹配。

【讨论】:

  • 是的,我遇到了同样的事情。换句话说,当我在本地卷曲端口时出现错误,而我可以成功导航到我的“nginx.conf”中指定的 wsgi 反向代理的“位置”,因为 wsgi 服务器的协议在我选择的套接字是 wsgi 而不是 http
【解决方案5】:

当 uWSGI 服务器使用uwsgi 协议并且尝试通过http 协议通过curl 或网络浏览器直接访问它时会显示此错误。如果可以,请尝试将您的 uWSGI 服务器配置为使用http 协议,以便您可以通过 Web 浏览器或 curl 访问它。

如果您不能(或不想)更改它,您可以在本地或远程 uWSGI 服务器前使用反向代理(例如nginx),请参阅https://uwsgi-docs.readthedocs.org/en/latest/Nginx.html

如果觉得工作量太大,试试uwsgi-toolspython包:

$ pip install uwsgi-tools

$ uwsgi_curl 10.0.0.1:3030

如果您需要通过网络浏览器等访问您的应用程序,还有一个简单的反向代理服务器uwsgi_proxy。查看更多扩展答案https://stackoverflow.com/a/32893520/179581

【讨论】:

    【解决方案6】:

    正如文档的另一条评论中指出的那样:

    如果您在日志中收到“21573”作为请求块大小,这可能意味着您正在使用 HTTP 协议与使用 uwsgi 协议的实例通信。不要这样做。

    如果你使用的是 Nginx,如果你有这个配置(或类似奇怪的东西)就会发生这种情况:

    proxy_pass http://unix:/path/to/socket.sock
    

    这是在向 uWSGI 发送 HTTP(这让人很不爽)。相反,使用:

    uwsgi_pass unix:/path/to/socket.sock;
    

    【讨论】:

      【解决方案7】:

      我有同样的问题; 所以我做到了... 看看使用 UWSGI + DJANGO + NGINX + REACT +

      1 - 纳米 /etc/uwsgi/sites/app_plataform.ini [uwsgi]

      DJANGO_SETTINGS_MODULE = app_plataform.settings 环境 = DJANGO_SETTINGS_MODULE settings.configure()

      chdir = /home/app_plataform 主页 = /root/app_plataform 模块 = prometheus_plataform.wsgi:应用程序

      master = true processes = 33 buffer-size=32768

      socket = /home/app_plataform/app_plataform.sock chmod-socket = 777 真空 = 真

      2 - 对 nginx 进行性能升级...用户 www-data;

      worker_processes 自动; worker_processes 4; pid /run/nginx.pid;包括/etc/nginx/modules-enabled/*.conf;

      事件 { worker_connections 4092;多接受; }

      http { ##升级配置

      client_body_buffer_size 16K; client_header_buffer_size 16k; client_max_body_size 32m; #large_client_header_buffers 2 1k;

      client_body_timeout 12; client_header_timeout 12; keepalive_timeout 15;发送超时 10; access_log off;

      ###基本设置##

      发送文件; tcp_nopush 开启; tcp_nodelay 开启; #keepalive_timeout 65; types_hash_max_size 2048; server_tokens 关闭;

      server_names_hash_bucket_size 64; # server_name_in_redirect off;

      包括/etc/nginx/mime.types;默认类型 应用程序/八位字节流;

      ## # SSL 设置##

      ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 删除 SSLv3,参考:POODLE ssl_prefer_server_ciphers 开启;

      ## # 日志记录设置##

      access_log /var/log/nginx/access.log;错误日志 /var/log/nginx/error.log;

      ###Gzip设置##

      gzip 开启; gzip_comp_level 2; gzip_min_length 1000; gzip_proxied
      过期的无缓存无存储私有身份验证; gzip_types 文本/纯文本 应用程序/x-javascript 文本/xml 文本/css 应用程序/xml; gzip_vary 开;

      #gzip_proxied 任意; #gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; #gzip_types 文本/纯文本/css 应用程序/json 应用程序/javascript 文本/xml 应用程序/xml 应用程序/xml+rss 文本/javascript;

      ## # 虚拟主机配置 ##

      包括 /etc/nginx/conf.d/.conf;包括 /etc/nginx/sites-enabled/; }

      3 - 然后...重新启动服务或 reebot 服务器...

      systemctl 重启 uwsgi & systemctl 重启 nginx

      【讨论】:

        猜你喜欢
        • 2015-04-25
        • 2017-01-18
        • 2016-02-05
        • 2015-12-29
        • 2022-12-18
        • 2019-06-16
        • 1970-01-01
        • 1970-01-01
        • 2018-12-13
        相关资源
        最近更新 更多