Hoje eu atualizei meu servidor web do Debian Buster para Bullseye e foi de fato uma atualização bastante simples. Tudo parecia funcionar até que tentei acessar alguns sites WordPress no servidor. No começo, recebi algum erro sobre um módulo MySQL ausente. A mensagem de erro que recebi do PHPMyAdmin me deu uma pista melhor: dizia que estava faltando o módulo mysqli.
Então eu instalei apt install php7.4-mysqli
e isso de fato fez meus sites WordPress funcionarem novamente.
O único problema agora é que não consigo atualizar o Wordpress. Toda vez que tento atualizar o WordPress, recebo um erro:
Eu suspeito que preciso instalar o suphp. Mas antes de eu fazer, alguém pode confirmar que este é realmente o caso? Ou preciso fazer outra coisa após a atualização do Buster para o Bullseye?
EDIT: Demorei um pouco para descobrir o que realmente estava acontecendo. Agora eu sei, não tenho idéia de como resolver o problema.
A mensagem de erro que o WP está dando, na verdade está incorreta. Como se vê, é capaz de descompactar a atualização muito bem na pasta apropriada. Mas é quando ele verifica se os arquivos foram realmente descompactados, que dá errado. O problema está neste pedaço de código em update-core.php :
foreach ( $roots as $root ) {
if ( $wp_filesystem->exists( $from . $root . 'readme.html' )
&& $wp_filesystem->exists( $from . $root . 'wp-includes/version.php' )
) {
$distro = $root;
break;
}
}
if ( ! $distro ) {
$wp_filesystem->delete( $from, true );
return new WP_Error( 'insane_distro', __( 'The update could not be unpacked.' ) );
}
O que ele faz aqui é simplesmente verificar se existem dois arquivos na pasta para a qual acabou de descompactar o arquivo zip. Isso falha. E o motivo é o seguinte:
Eu uso o método FTP para instalar atualizações. Então, quando eu digo para atualizar, ele primeiro descobre a pasta para a qual deve baixar o arquivo zip. Esta pasta é armazenada em $working_dir e é usada a partir desse momento para o resto do processo de atualização. O verdadeiro caminho no servidor é, /domains/domainname.com/htdocs/wp-content/upgrade/
mas como os usuários de FTP estão em chroot, o WP encontra e armazena /htdocs/wp-content/upgrade/
. O arquivo de atualização é baixado para esta pasta e, em seguida, descompactado.
Em seguida, ele faz a verificação acima. E isso falha porque tenta encontrar um arquivo /htdocs/wp-content/upgrade/
enquanto o local verdadeiro é /domains/domainname.com/htdocs/wp-content/upgrade/
.
Eu entendo por que ele baixa o pacote muito bem (já que os usuários de FTP estão em chroot). Mas não entendo por que não falha ao descompactar depois, mas falha ao verificar a existência dos arquivos ...
Eu verifiquei todas as configurações do php e não consigo encontrar nada diferente com as configurações de antes da atualização do Debian…
Demorei um pouco para descobrir exatamente o que estava acontecendo, mas na verdade é um problema com o WordPress. Bullseye instala a versão 1.0.49 do PureFTPd onde no Buster v1.0.47 foi instalado. De acordo com o changelog do PureFTPd aqui , globbing foi removido do comando NLST na v1.0.48 (o que faz sentido já que na verdade não é permitido de acordo com o RFC).
Os desenvolvedores do WordPress estão cientes do problema e corrigiram a função exist(). O patch está disponível aqui ; aplicá-lo é uma das duas maneiras de atualizar o WordPress se você estiver usando o PureFTPd versão 1.0.48 ou superior e estiver travado com a atualização via FTP.
Você também pode substituir a função em /wp-admin/includes/class-wp-filesystem-ftpext.php (ou /wp-admin/includes/class-wp-filesystem-ftpsockets.php se estiver usando FTPSockets) com o a seguir (que na verdade é minha própria implementação da função):
O WordPress 6.0 terá a nova função por padrão.