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

时间:2016-12-03 23:16:17

标签: http uwsgi keep-alive

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

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证实了这一点:

enter image description here

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

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

2 个答案:

答案 0 :(得分:3)

我终于可以通过从--http-socket切换到简单--http来保持活跃。根据uWSGI文档:

  

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

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

答案 1 :(得分:1)

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

fmod

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

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

希望对某人也有帮助。