По независящей от меня причине (приложение, которое не может быть изменено) мне нужно получить сервер, который обрабатывает HTTP-запросы для страниц PHP через FastCGI, чтобы выполнить «Connection: Keep-alive» (отправленное указанным клиентом) с запросом также объявлен как «HTTP / 1.0».
Это отлично подходит для статического контента, для обычного прокси-контента и т. Д. (Значение - если вы используете:
curl -0v http://server/static.html
вы получите «Connection: close», как и ожидалось, но если вы также явно запросите, чтобы соединение оставалось активным, например:
curl -H "Connection: keep-alive" -0v http://server/static.html
пока static.html находится либо локально на сервере, либо на другом сервере, проксируемом веб-сервером (например, proxy_pass в Nginx)).
Однако, как только вы добавите серверную часть PHP через FastCGI и получите доступ http: //server/file.php, кажется, что все ответы будут иметь вид «Соединение: закрыто», что бы вы ни пытались ... и это поведение похоже на последние стабильные Nginx и Apache 2.4.
Обратите внимание, однако, что Apache, обслуживающий PHP под mod_php, НЕ вызывает этой проблемы; Я бы использовал это, но мне действительно нужна производительность, и, к сожалению, PHP этого приложения использует небезопасные библиотеки, поэтому не может использовать MPM Apache на основе потоков.
То, что я уже пробовал в Nginx на основе различных документов в Интернете, не помогло:
fastcgi_keep_conn on;
(в блоке PHP location {})
upstream fastcgi_backend {
server 127.0.0.1:9000;
keepalive 8;
}
(внутри блока http {})
Я обнюхал запрос FastCGI и увидел, что он отправляет SERVER_PROTOCOL 1.0 по сети, поэтому я отредактировал / etc / nginx / fastcgi_params и изменил:
fastcgi_param SERVER_PROTOCOL $server_protocol;
кому:
fastcgi_param SERVER_PROTOCOL HTTP/1.1;
видел обновление в сниффере, но безрезультатно; Все запросы по-прежнему возвращаются как «Соединение: закрыть», несмотря ни на что.
Я даже пытался повозиться с самим исходным кодом Nginx (который является для меня приемлемым решением, если другого решения не существует) в разных местах (не очень понимая этого :)), чтобы заставить его «подумать», что запрос был «1.1», но пока без везения.
Есть ли шанс, что кто-нибудь когда-либо сталкивался с этим и нашел решение этой проблемы?
Спасибо!