Respostas estranhas ao PHP-FPM do Apache com Proxy enablereuse = on

3

Ao ativar <Proxy ... enablereuse=on max=10> , começo a receber respostas estranhas. Ao atualizar a página atual, a solicitação principal carrega respostas diferentes; como uma página em branco, respostas destinadas a um cliente separado ou uma resposta 404 de um arquivo CSS na página solicitada.

A remoção de enablereuse corrige as respostas estranhas, mas impede solicitações simultâneas do mesmo usuário, o que significa que cada solicitação é veiculada individualmente.

Por exemplo: abrindo duas guias do navegador para duas URLs diferentes no mesmo domínio vhost, se a primeira página solicitada levar 5 segundos para ser carregada, ela não carregará a segunda guia até que a primeira seja concluída.

Estou tentando impedir isso, permitindo que o mesmo cliente realize várias solicitações simultaneamente, de maneira não bloqueante simultânea.

Ambiente do servidor

CentOS 6.10 x64
php 5.6.37 Remi
Apache 2.4.33 IUS

Configuração do evento MPM

<IfModule mpm_event_module>
    ServerLimit              100
    StartServers             4
    ThreadLimit              64
    MaxRequestWorkers        100
    MinSpareThreads          25
    MaxSpareThreads          75
    ThreadsPerChild          25
    MaxConnectionsPerChild   1000
    ListenBacklog       511
</IfModule>

Virtual Host Config (1 de 4 - todos idênticos, exceto endereço IP, UDS e ServerName)

<VirtualHost 192.168.1.71:443>
    ServerName example.com:443
    DocumentRoot /home/example/example.com
    <IfModule mod_ssl.c>
        SSLEngine on
        SSLCertificateFile /etc/httpd/ssl/certs/example.crt
        SSLCertificateKeyFile /etc/httpd/ssl/private/example.key
        SSLCertificateChainfile /etc/httpd/ssl/certs/example.ca-bundle
        <IfModule mod_setenvif.c>
            SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
        </IfModule>
        <IfModule mod_headers.c>
            Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
        </IfModule>
    </IfModule>
    <Directory "/home/example/example.com">
        AllowOverride All
        Require all granted
    </Directory>
    <IfModule mod_proxy_fcgi.c>
        <FilesMatch \.php$>
            <If "-f %{REQUEST_FILENAME}">
                SetHandler "proxy:unix:/var/run/example.sock|fcgi://127.0.0.1/"
            </If>
        </FilesMatch>
        <Proxy "fcgi://127.0.0.1" enablereuse=on max=10>
            ProxySet timeout=7200
        </Proxy>
    </IfModule>
</VirtualHost>

Configuração do pool PHP-FPM (1 de 4 todos idênticos, exceto o UDS)

[example_com]
user = example
group = example
listen = /var/run/example.sock
listen.owner = example
listen.group = apache
listen.mode = 0660

pm = dynamic
pm.max_children = 20
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 20
pm.max_requests = 1000

security.limit_extensions = .php

Eu tentei usar um proxy TCP em oposição ao UDS devido a outras postagens comentando sobre problemas com o UDS não suportados, mas o problema persiste:

<IfModule mod_proxy_fcgi.c>
    <FilesMatch \.php$>
        <If "-f %{REQUEST_FILENAME}">
            SetHandler "proxy:fcgi://127.0.0.1:9000/"
        </If>
    </FilesMatch>
    <Proxy "fcgi://127.0.0.1:9000" enablereuse=on max=10>
        ProxySet timeout=7200
    </Proxy>
</IfModule>

Também tentei alterar a configuração do PHP-FPM com um conjunto de pm para dynamic , ondemand e static com alterações de processo apropriadas.

Eu determinei que a restrição de solicitações simultâneas foi devido a sessões PHP e um bloqueio que é imposto em sessões baseadas em sistema de arquivos. No entanto, a questão não corresponde às respostas estranhas que recebi.

    
por fyrye 04.11.2018 / 01:39

1 resposta

0

Da documentação do Apache 2.4: Ative a reutilização de conexão para um backend do FCGI como o PHP-FPM

Tenha em mente que o PHP-FPM (no momento da escrita, fevereiro de 2018) usa um modelo prefork, ou seja, cada um de seus processos de trabalho pode manipular uma conexão no momento. Por padrão o mod_proxy (configurado com enablereuse = on) permite um pool de conexões ThreadsPerChild para o backend de cada processo httpd ao usar um mpm thread (como worker ou event), então os seguintes casos de uso devem ser levados em conta:

Under HTTP/1.1 load it will likely cause the creation of up to MaxRequestWorkers connections to the FCGI backend.
Under HTTP/2 load, due to how mod_http2 is implemented, there are additional h2 worker threads that may force the creation of other backend connections. The overall count of connections in the pools may raise to more than MaxRequestWorkers.

O número máximo de processos de trabalho do PHP-FPM precisa ser configurado sabiamente, uma vez que há a chance de que todos eles acabem "ocupados" no manuseio de conexões persistentes ociosas, sem espaço para que novos sejam estabelecidos, e o fim a experiência do usuário será uma pilha de tempos limite de solicitações HTTP.

Então, minha menção não usa enablereuse com mod_proxy_fcgi + php-fpm.

    
por 09.11.2018 / 15:54