Dois sites PHP-FPM separados parecem estar usando o mesmo código?

4

Eu tenho dois sites com duas codebases, mas quando mudo uma base de código, vejo a mudança em ambos.

Eu tenho dois check-out do mesmo website. Eles são configurados para usar o PHP-FPM através do Apache2 com FastCGI. Os checkouts estão em:

/var/www/site1
/var/www/site2

As configurações do Apache são assim:

<VirtualHost *:80>
    ServerName site1.myserver.com
    DocumentRoot /var/www/site1
    <IfModule mod_fastcgi.c>
        AddHandler php5-fcgi-handler .php
        Action php5-fcgi-handler /php5-fcgi-uri
        Alias /php5-fcgi-uri fcgi-application
        FastCgiExternalServer fcgi-application -socket /var/run/site1-fpm.sock -pass-header Authorization -idle-timeout 30000 -flush
    </IfModule>
</VirtualHost>

<VirtualHost *:80>
    ServerName site2.myserver.com
    DocumentRoot /var/www/site2
    <IfModule mod_fastcgi.c>
        AddHandler php5-fcgi-handler .php
        Action php5-fcgi-handler /php5-fcgi-uri
        Alias /php5-fcgi-uri fcgi-application
        FastCgiExternalServer fcgi-application -socket /var/run/site2-fpm.sock -pass-header Authorization -idle-timeout 30000 -flush
    </IfModule>
</VirtualHost>

As configurações do pool do FPM se parecem com estas:

[site1]
user = site1-user
group = site1-group
listen = /var/run/site1-fpm.sock
listen.owner = www-data
listen.group = www-data
chdir = /
pm = ondemand
pm.max_children = 5
pm.max_requests = 500 ;default to unlimited

[site2]
user = site2-user
group = site2-group
listen = /var/run/site2-fpm.sock
listen.owner = www-data
listen.group = www-data
chdir = /
pm = ondemand
pm.max_children = 5
pm.max_requests = 500 ;default to unlimited

Eu não estou usando o recurso chroot do FPM (até onde eu posso dizer).

Quando eu mudo o código para site1 e reinicio o PHP-FPM e visito site1 e site2, então eu vejo a mudança em ambos os sites.

Se eu reiniciar o PHP-FPM e visitar primeiro o site2 (o site inalterado), seguido por site1, então não vejo a alteração em nenhum dos sites.

O que há de errado com minhas configurações? Eu vejo processos PHP-FPM separados executando para site1 e site2 sob o mestre principal do FPM.

    
por Sander Marechal 13.07.2015 / 12:44

1 resposta

10

Quando vejo problemas semelhantes em nossos ambientes, parece que isso ocorre devido à maneira como o OpCache (por padrão) compartilha um único cache entre todos os usuários em um ambiente de hospedagem compartilhada. Um bug foi enviado (e você pode, e deve, ir votar para informar aos mantenedores como importante, isso pode ser para o seu caso de uso), embora nenhum compromisso tenha sido feito na entrega de uma correção.

TL; DR: Por padrão, quando o OpCache está habilitado, o cache usado para armazenar códigos de bytes compilados é compartilhado entre todos os usuários. Em um ambiente onde a hospedagem é compartilhada entre vários sites / usuários, isso pode resultar em um site pegando a saída em cache de scripts php de outro site ou, se a segurança específica as configurações são ativadas até mesmo gerando erros .

If you plan on using PHP-FPM with PHP 5.5+'s built in opcache, please read the blog post below before you actually do that. Turns out that the opcode cache can be read by any user on the server. This means that if there are say, 10 separate users, with their own vhosts and directories, and you configure one PHP-FPM pool per user, each user can still see what scripts are cached and their locations. Since they have read access to the cache they could potentially view all this data.

This is obviously a massive security concern, and even if no one exploits this, there is still a chance of scripts being read by the wrong user when generating a page, so websites could possibly be displaying the wrong data / info if there are multiple index.php scripts in the cache.

Embora nenhuma correção tenha sido lançada oficialmente, se você estiver usando o cPanel, este wiki tem uma maneira documentada de configurar o php-fpm pools a serem criados e protegidos por usuário e se você seguir as instruções abaixo, bem como as OBSERVAÇÕES IMPORTANTES na parte inferior desta resposta, deve ser capaz de obter a funcionalidade que você deseja sem erros

Essa postagem também documenta como você pode configurar isso manualmente por site / por usuário (embora eu possa apostar que isso pode se tornar tedioso se você estiver hospedando muitos sites). Se você não estiver usando o cPanel, pode ser necessário modificar os scripts para especificar seus caminhos individuais e nomes de usuários, em vez das variáveis que estão sendo usadas pelo mecanismo de configuração do cPanel.

NOTAS IMPORTANTES

Durante os testes e pesquisas adicionais, deparei-me com este artigo, que fornece alguns esclarecimentos que podem ser relevantes para o seu caso específico. situação:

  1. É necessário certificar-se de que o parâmetro opcache.use_cwd esteja definido como true para a configuração do OpCache do seu aplicativo - ele é definido como false por padrão e deixá-lo definido como padrão provavelmente causará colisões se você estiver hospedando mais de uma aplicação PHP no seu sistema:

First of all, probably in each typical project you will have to ensure that the opcache.use_cwd option is set to true. Enabling this setting means that the OpCache engine will look at the full file paths to distinguish between files with the same names. Setting it to false will lead to collisions between files with the same base name.

  1. Se você estiver executando um aplicativo desenvolvido pelo Zend Framework ou outra estrutura semelhante que faça uso de anotações, você TAMBÉM precisará garantir que as diretivas opcache.load_comments e opcache.save_comments estejam definidas como true . Você deve verificar essa sugestão com sua documentação de aplicativo / estrutura, pois a maioria já atualizou seus documentos com instruções específicas sobre como ativar o uso do OpCache adequadamente para seus sistemas:

There is also a setting that is important in tools and frameworks that make use of annotations. If you use Doctrine, Zend Framework 2 or PHP Unit, remember to set the opcache.load_comments and opcache.save_comments settings to true. In result, the documentation comments from your files will also be included in the precompiled code generated by OpCache. This setting will allow you to work with annotations without any disruptions.

If your project is based on a specific framework or a web application, it’s always a good idea to check the documentation for any guidelines regarding the OpCache configuration

NOTAS IMPORTANTES

Espero que isso tenha ajudado - e se você estiver usando o cPanel, deixe um comentário para nos informar como você lidou com essa parte da configuração!

    
por 13.07.2015 / 12:47