【问题标题】:Why isn't uWSGI respecting the "--http-keepalive" flag?为什么 uWSGI 不尊重“--http-keepalive”标志?
【发布时间】:2020-10-05 23:48:47
【问题描述】:

我使用以下命令将 uWSGI 安装在运行 ubuntu:16.04 的 Docker 容器中:

apt-get update
apt-get install -y build-essential python-dev python-pip
pip install uwsgi

然后我创建了一个静态文件:

cd /root
mkdir static
dd if=/dev/zero bs=1 count=1024 of=static/data

...最后使用以下命令启动 uWSGI:

uwsgi \
    --buffer-size 32768 \
    --http-socket 0.0.0.0:80 \
    --processes 4 \
    --http-timeout 60 \
    --http-keepalive \
    --static-map2=/static=./

我能够毫无问题地访问静态文件。然而,尽管传递了--http-keepalive 选项,使用 cURL 发出多个请求会导致以下输出:

# curl -v 'http://myserver/static/data' -o /dev/null 'http://myserver/static/data' -o /dev/null
*   Trying 192.168.1.101...
...
> GET /static/data HTTP/1.1
> Host: 192.168.1.101:8100
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Length: 1024
< Last-Modified: Sat, 03 Dec 2016 22:06:49 GMT
< 
{ [1024 bytes data]
100  1024  100  1024    0     0   577k      0 --:--:-- --:--:-- --:--:-- 1000k
* Connection #0 to host 192.168.1.101 left intact
* Found bundle for host 192.168.1.101: 0x563fbc855630 [can pipeline]
* Connection 0 seems to be dead!
* Closing connection 0
...

特别感兴趣的是这行:

* Connection 0 seems to be dead!

WireShark 证实了这一点:

如您所见,有两个完全独立的 TCP 连接。第一个被 uWSGI 关闭(包 #10 - [FIN, ACK])。

我做错了什么?为什么 uWSGI 不尊重 --http-keepalive 标志而不是立即关闭连接?

【问题讨论】:

    标签: http uwsgi keep-alive


    【解决方案1】:

    我终于能够通过从--http-socket 切换到简单的--http 来让keepalive 工作。根据 uWSGI 文档:

    如果您的 Web 服务器不支持 uwsgi 协议但能够与上游 HTTP 代理通信,或者如果您使用 Webfaction 或 Heroku 等服务来托管您的应用程序,您可以使用 http-socket。如果您打算仅使用 uWSGI 向世界公开您的应用程序,请改用 http 选项,因为路由器/代理/负载平衡器将成为您的盾牌。

    在我的特殊情况下,还需要加载 http 插件。

    【讨论】:

    • http 插件?需要额外安装?你能显示有效的uwsgi 命令吗?只是用http替换http-socket?
    【解决方案2】:

    就我而言,我遇到了来自 aws ALB / ELB 的随机 502 响应。 我通过 .ini 文件提供了配置,例如:

    http-keepalive = true
    

    但经过几个小时的调试,我在 Wireshark 中看到了类似的画面——每次响应后,连接都被服务器关闭,因此忽略了 keep-alive 选项

    在https://github.com/unbit/uwsgi/issues/2018 中,讨论指出它应该是一个整数(https://uwsgi-docs.readthedocs.io/en/latest/Options.html#http-keepalive),但不幸的是找不到确切的信息,它是否代表套接字生命周期的秒数,或者它可能是简单的“1”。在此更改之后 - 随机 502 消失了,uwsgi 开始以预期模式工作。

    希望它对某人也有帮助。

    【讨论】:

    • 您完全正确——我们必须将 --http-keepalive 的值从 true 更改为 1,然后我们的 502 问题就消失了。我们能够通过在更改前后对应用程序进行负载测试来证明这一点。
    猜你喜欢
    • 2019-11-03
    • 2021-05-24
    • 2013-10-17
    • 2015-03-14
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    相关资源
    最近更新 更多