Назад | Перейти на главную страницу

Невозможно получить Nginx / Apache + FastCGI + PHP-FPM + HTTP / 1.0 для использования Keep-Alive

По независящей от меня причине (приложение, которое не может быть изменено) мне нужно получить сервер, который обрабатывает 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», но пока без везения.

Есть ли шанс, что кто-нибудь когда-либо сталкивался с этим и нашел решение этой проблемы?

Спасибо!