uWSGI为什么不尊重“--http-keepalive”标志?
问题描述:
我在使用以下命令泊坞窗容器中运行ubuntu:16.04
安装uWSGI:uWSGI为什么不尊重“--http-keepalive”标志?
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 -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-socket
切换到简单--http
来使keepalive工作。据uWSGI文档:
如果你的Web服务器不支持uwsgi协议,但是能讲上游HTTP代理,或者如果您使用的是像Webfaction或Heroku的服务来托管您的应用程序,你可以使用
http-socket
。如果您打算仅通过uWSGI将应用展示给世界,请使用http
选项,因为路由器/代理/负载均衡器将成为您的屏蔽。
在我的特殊情况下,还需要加载http
插件。