Error fatal de PHP: no se puede abrir /dev/urandom: no existe tal archivo o directorio al llamar a session_start() con PHP creado manualmente

Error fatal de PHP: no se puede abrir /dev/urandom: no existe tal archivo o directorio al llamar a session_start() con PHP creado manualmente

Problema

Construí PHP8.4 manualmente en Ubuntu 14.04 ya que el sistema operativo no es compatible y no hay ningún paquete ppa disponible. Probé que phpinfo()la página web mostraba información correcta mientras agregaba session_start()al principio del script, se produjo un error fatal:

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

Luego ejecuto el script head /dev/urandomen termial, puedo obtener una salida aleatoria, por lo tanto, el archivo existe. Al escribir ls -l /dev/urandomel permiso, crw-rw-rw-creo que otros usuarios deberían poder acceder a él.

Ambiente

  • Hardware del servidor:RK3288 armv7l cortex-A17 x4 núcleos con 2 GB de RAM DDR3
  • Sistema operativo:Ubuntu 14.04 lts con versión de kernel 3.10.0
  • Servidor web:Apache 2.4.7 con php-fpm fastcgi
  • Versión PHP:8.4.0-desarrollador
  • Configure el comando al compilar 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 los errores generados por la configuración se resolvieron antes de compilar PHP compilando manualmente todas las dependencias faltantes.

No sé por dónde empezar a verificar, por favor dé algunas sugerencias como qué archivo de configuración puede no estar configurado correctamente, qué información del sistema vale la pena verificar, cómo hacer que imprima más información de diagnóstico sobre /dev/urandom, etc. información requerida para resolver el problema, comente y mejoraré la descripción de mi pregunta.

solución

Gracias por @symcbean, mencionó:

Su código PHP se ejecutará en chroot, o dentro de un perfil de apparmor o en un espacio de nombres del sistema de archivos systemd.

Al verificar el archivo de configuración de php-fpm encontré que chrootestaba configurado. Al desarmar el parámetro, se mostró el acceso a los scripts php con el navegador web No input file specified.

Luego verifiqué mi configuración de Apache, intenté agregar

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

pero mi versión instalada de Apache parece no reconocer 'ProxyFCGISetEnvIf' y se genera el error 'Comando no válido'.

Finalmente reemplacé

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

con

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

ahora todos los problemas están resueltos.

En una palabra, si No such file or directoryocurre algún error en PHP, vale la pena verificar si lo ha configurado chrootpara PHP.

Respuesta1

Construí PHP8.4 manualmente en Ubuntu 14.04 ya que el sistema operativo no es compatible

Esta es una enorme señal de alerta. Mantener en funcionamiento un sistema operativo sin soporte requiere MUCHA habilidad y tiempo. ElsoloEl momento en que esto es remotamente justificable es seguir ejecutando software de misión crítica que no se puede actualizar. Cambiar la pila de software en un sistema operativo sin soporte es una receta para el desastre incluso para un experto y refuta la justificación.

Luego ejecuto el script head /dev/urandom en termial

Esto me dice que no eres un experto.

El primer lugar donde buscar al diagnosticar un error es en sus archivos de registro. Y no sólo los registros de su servidor web.

/dev/urandom produce una salida binaria que puede alterar la configuración de su terminal; es más seguro ejecutarlo head /dev/urandom | cat -v.

Verificaste los permisos y, dado que son x666, la propiedad no importa (a menos que tengas permisos extraños en/dev). Pero el siguiente paso para depurar el problema sería intentar acceder al archivo directamente desde un script PHP. Su código PHP se ejecutará en chroot, o dentro de un perfil de apparmor o en un espacio de nombres del sistema de archivos systemd.

Actualiza la plataforma.

información relacionada