Potencial colisão de ID de sessão de pools PHP-FPM separados

Potencial colisão de ID de sessão de pools PHP-FPM separados

Estou executando um servidor com nginx 1.12.2 e PHP 7.0.27 no Debian 8.10, estou executando dois sites com pools PHP-FPM separados para cada aplicativo PHP separado que cada site executa. Cada pool PHP-FPM e, portanto, cada aplicativo PHP é executado sob seu próprio usuário, com o nginx sendo executado como www-data.

Às vezes (acho que são momentos de alta carga), recebo muitos erros do PHP sobre problemas ao ler e gravar os arquivos da sessão nas permissões, por exemplo:

2018/02/21 02:07:19 [error] 11723#11723: *804992 FastCGI sent in stderr: "PHP message: PHP Warning: Unknown: open(/var/lib/php/sessions/sess_<session id here>, O_RDWR) failed: Permission denied (13) in Unknown on line 0 PHP message: PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/sessions) in Unknown on line 0" while reading upstream, client: 34.242.193.225, server: example.org, request: "GET /somepage HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm-site-app.sock:", host: "example.org"

Pelo que sei, as permissões estão corretas, pois estou vendo sessões na pasta de ambos os usuários do PHP.

Se eu executar um ls -alF no nome do arquivo fornecido na mensagem de erro logo após ele aparecer no arquivo de log, o arquivo estará lá, mas será de propriedade do usuário do outro site (com conteúdo que sugere que é para uma sessão de o outro site), o que sugere que ambos os aplicativos executados em domínios separados geraram o mesmo ID de sessão e um consegue gravar seu arquivo com êxito, e o outro falha porque o arquivo pertence ao usuário do outro site. Pelo que entendi, as chances de ambos os sites gerarem o mesmo ID de sessão seriam praticamente impossíveis.

Embora eu ache que posso resolver os sintomas definindo caminhos de sessão separados para cada pool, não acho que isso resolveria o problema subjacente que pode estar causando outros problemas no servidor que ainda não percebi.

Responder1

Na verdade, este é um problema de software, não nginxou php-fpm, e se você estiver executando o mesmo software em dois processos, não será impossível causar colisões. Uma rápida olhada na documentação sugere que, embora haja detecção de colisão para um único aplicativo, dois processos separados em diferentes espaços de usuário não fariam isso. A solução mais simples seria configurar session.save_pathde forma diferente para cada pool.

informação relacionada