uWSGI为什么不尊重“ --http-keepalive”标志?

Nat*_*man 6 http keep-alive uwsgi

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

apt-get update
apt-get install -y build-essential python-dev python-pip
pip install uwsgi
Run Code Online (Sandbox Code Playgroud)

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

cd /root
mkdir static
dd if=/dev/zero bs=1 count=1024 of=static/data
Run Code Online (Sandbox Code Playgroud)

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

uwsgi \
    --buffer-size 32768 \
    --http-socket 0.0.0.0:80 \
    --processes 4 \
    --http-timeout 60 \
    --http-keepalive \
    --static-map2=/static=./
Run Code Online (Sandbox Code Playgroud)

我能够毫无问题地访问静态文件。但是,尽管传递了该--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
...
Run Code Online (Sandbox Code Playgroud)

该行特别受关注:

* Connection 0 seems to be dead!
Run Code Online (Sandbox Code Playgroud)

WireShark确认了这一点:

在此处输入图片说明

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

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

Gle*_*leb 7

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

http-keepalive = true
Run Code Online (Sandbox Code Playgroud)

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

uWSGI#2018中,讨论指出它应该是一个整数(文档在这里),但不幸的是无法找到关于它是否代表套接字生命周期的秒数的确切信息,或者它可能是简单的“1”。在此更改之后 - 随机 502 消失,uwsgi 开始以预期模式工作。

希望它对某人也有帮助。


Nat*_*man 4

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

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

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