Erro fatal do PHP: Não é possível abrir /dev/urandom: Esse arquivo ou diretório não existe ao chamar session_start() com PHP construído manualmente

Erro fatal do PHP: Não é possível abrir /dev/urandom: Esse arquivo ou diretório não existe ao chamar session_start() com PHP construído manualmente

Problema

Eu construí o PHP8.4 manualmente no Ubuntu 14.04, pois o sistema operacional não tem suporte e nenhum pacote ppa disponível. Testei se a phpinfo()página da web mostrou informações corretas ao adicionar session_start()no início do script, ocorreu um erro fatal:

Fatal error: Uncaught Random\RandomException: Cannot open /dev/urandom: No such file or directory in /xxx.php

Então eu executo o script head /dev/urandomno terminal, posso obter uma saída aleatória, portanto o arquivo existe. Ao digitar ls -l /dev/urandoma permissão, crw-rw-rw-ela deve ser acessível por outros usuários, eu acho.

Ambiente

  • Hardware do servidor:RK3288 armv7l cortex-A17 x4 núcleos com 2 GB de RAM DDR3
  • Sistema operacional:Ubuntu 14.04 lts com kernel versão 3.10.0
  • Servidor web:Apache 2.4.7 com php-fpm fastcgi
  • Versão PHP:8.4.0-desenvolvimento
  • Configure o comando ao construir o php:
'./configure' '--prefix=/usr/local/php/' '--enable-debug' \
  '--enable-fpm' '--with-config-file-path=/usr/local/php/etc/' \ 
  '--enable-json' '--enable-mbregex' '--enable-mbregex-backtrack' \
  '--disable-opcache' '--with-curl' '--with-freetype' \
  '--enable-gd' '--with-jpeg' '--with-gettext' '--with-kerberos' \
  '--with-libdir=lib64' '--with-libxml' '--with-mysqli' \
  '--with-openssl' '--with-pdo-mysql' '--with-pdo-sqlite' \
  '--with-pear' '--with-mhash' '--with-ldap-sasl' '--with-xsl' \
  '--with-zlib' '--with-zip' '-with-bz2' '--with-iconv' \
  '--enable-pdo' '--enable-ftp' '--enable-bcmath' '--enable-mbstring' \
  '--disable-pcntl' '--enable-shmop' '--enable-soap' \
  '--enable-sockets' '--enable-xml' '--enable-sysvsem' '--enable-cli' \
  '--enable-intl' '--enable-calendar' '--enable-static' \
  '--enable-mysqlnd' 'OPENSSL_CFLAGS=-I/usr/local/openssl/include' \
  'OPENSSL_LIBS=-L/usr/local/openssl/lib -lssl -lcrypto' \
  'JPEG_CFLAGS=-I/usr/lib/arm-linux-gnueabihf/' \
  'JPEG_LIBS=-L/usr/lib/arm-linux-gnueabihf/ -ljpeg' \
  'FREETYPE2_CFLAGS=-I/usr/include/freetype2' \
  'FREETYPE2_LIBS=-L/usr/lib/arm-linux-gnueabihf/ -lfreetype' \
  'ICU_CFLAGS=-I/usr/include/arm-linux-gnueabihf/' \
  'ICU_LIBS=-L/usr/lib/arm-linux-gnueabihf/ -licui18n \
  -licuuc -licudata -licuio -licule -liculx -licutu' \
  'ONIG_CFLAGS=-I/usr/include' 'ONIG_LIBS=-L/usr/lib -lonig' \
  'LIBZIP_CFLAGS=-I/usr/local/include/' \
  'LIBZIP_LIBS=-L/usr/local/lib/ -lzip'

Todos os erros gerados pelo configure foram resolvidos antes de compilar o PHP, compilando manualmente todas as dependências ausentes.

Não sei por onde começar a verificar, por favor, dê algumas dicas como qual arquivo de configuração pode não estar configurado corretamente, quais informações do sistema vale a pena verificar, como fazer com que ele imprima mais informações de diagnóstico sobre /dev/urandom etc. informações necessárias para resolver o problema, comente e melhorarei a descrição da minha pergunta.

Solução

Obrigado por @symcbean, ele mencionou:

Seu código PHP está executando chroot, ou dentro de um perfil apparmor ou em um namespace do sistema de arquivos systemd.

Ao verificar o arquivo conf do php-fpm, descobri chrootque estava configurado. Ao desabilitar o parâmetro, os scripts php de acesso com o navegador da web mostraram No input file specified.

Então verifiquei minha configuração do apache, tentei adicionar

ProxyFCGISetEnvIf "true" PHP_ADMIN_VALUE "open_basedir=..."

mas minha versão instalada do Apache parece não reconhecer 'ProxyFCGISetEnvIf' com o erro 'Comando inválido' gerado.

Finalmente eu substituí

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/

com

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/path/to/webroot/$1

agora todos os problemas estão resolvidos.

Em um mundo, caso ocorra algum No such file or directoryerro no PHP, vale verificar se você configurou chrootpara PHP.

Responder1

Eu construí o PHP8.4 manualmente no Ubuntu 14.04 porque o sistema operacional está sem suporte

Esta é uma enorme bandeira vermelha. Manter um sistema operacional sem suporte em execução requer muita habilidade e tempo. OapenasO momento em que isso é remotamente justificável é continuar executando software de missão crítica que não pode ser atualizado. Alterar a pilha de software em um sistema operacional sem suporte é uma receita para o desastre, mesmo para um especialista, e refuta o predicado de justificativa.

Então eu executo o script head /dev/urandom no terminal

Isso me diz que você não é um especialista.

O primeiro lugar a procurar ao diagnosticar um erro são os arquivos de log. E não apenas os logs do seu servidor web.

/dev/urandom produz uma saída binária que pode atrapalhar as configurações do seu terminal - é mais seguro executar head /dev/urandom | cat -v.

Você verificou as permissões - e como elas são x666, a propriedade não importa (a menos que você tenha permissões estranhas em/dev). Mas o próximo passo para depurar o problema seria tentar acessar o arquivo diretamente de um script PHP. Seu código PHP está executando chroot, ou dentro de um perfil apparmor ou em um namespace do sistema de arquivos systemd.

Atualize a plataforma.

informação relacionada