2016-12-03 19 views
3

Я установил uWSGI в контейнер Docker работает ubuntu:16.04, используя следующие команды:Почему 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 привело к следующему выходу:

# 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 вместо немедленного закрытия соединения?

ответ

0

Я, наконец, смог получить постоянную работу, переключившись с --http-socket на просто --http. Согласно uWSGI документации:

Если ваш веб-сервер не поддерживает протокол uwsgi но умеют говорить на вышестоящую HTTP прокси, или если вы используете услугу, как Webfaction или Heroku для размещения вашего приложения, вы можете использовать http-socket. Если вы планируете открывать свое приложение в мире только с помощью uWSGI, используйте вместо этого параметр http, так как маршрутизатор/прокси-сервер-балансир будет вашим щитом.

В моем конкретном случае необходимо было загрузить плагин http.