PHP 致命错误:无法打开 /dev/urandom:使用手动构建的 PHP 调用 session_start() 时没有此文件或目录

PHP 致命错误:无法打开 /dev/urandom:使用手动构建的 PHP 调用 session_start() 时没有此文件或目录

问题

由于操作系统不再支持且没有可用的 ppa 包,因此我在 Ubuntu 14.04 中手动构建了 PHP8.4。我测试了phpinfo()网页是否显示正确信息,但session_start()在脚本开头添加时,发生了致命错误:

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

然后我在终端中运行脚本head /dev/urandom,我可以获得随机输出,因此文件存在。输入ls -l /dev/urandom权限时crw-rw-rw-,我认为其他用户应该可以访问它。

环境

  • 服务器硬件:RK3288 armv7l cortex-A17 x4 内核,配备 2GB DDR3 RAM
  • 操作系统:Ubuntu 14.04 lts,内核版本 3.10.0
  • 网络服务器:带有 php-fpm fastcgi 的 Apache 2.4.7
  • PHP 版本:8.4.0-dev
  • 构建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'

通过手动编译所有缺失的依赖项,在编译 PHP 之前解决了 configure 输出的所有错误。

我不知道从哪里开始检查,请给出一些提示,例如哪个配置文件可能未正确设置,哪些系统信息值得检查,如何使其打印有关 /dev/urandom 的更多诊断信息等。如果解决问题需要更多信息,请发表评论,我会改进我的问题描述。

解决方案

感谢@symcbean,他提到:

您的 PHP 代码正在 chroot 中运行,或者在 apparmor 配置文件中运行,或者在 systemd 文件系统命名空间中运行。

检查php-fpm的conf文件后发现chroot已经设置了。取消该参数后,用浏览器访问php脚本时显示No input file specified

然后我检查了我的 apache 配置,我尝试添加

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

但是我安装的 apache 版本似乎无法识别“ProxyFCGISetEnvIf”,并抛出“无效命令”错误。

最后我换了

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

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

现在所有问题都解决了。

一句话,如果No such file or directoryPHP 出现任何错误,则值得检查是否已chroot对 PHP 进行设置。

答案1

由于操作系统不再支持,我在 Ubuntu 14.04 中手动构建了 PHP8.4

这是一个巨大的危险信号。保持不受支持的操作系统运行需要大量的技能和时间。仅有的最合理的情况是继续运行无法升级的关键任务软件。即使对于专家来说,在不受支持的操作系统上更改软件堆栈也会导致灾难,这驳斥了合理性断言。

然后我在终端中运行脚本 head /dev/urandom

这表明你不是专家。

诊断错误时首先要查看的是日志文件。而不仅仅是 Web 服务器日志。

/dev/urandom 产生二进制输出,这可能会弄乱您的终端设置 - 运行起来更安全head /dev/urandom | cat -v

您确实检查了权限 - 因为它们是 x666,所以所有权无关紧要(除非您对 /dev 有奇怪的权限)。但调试问题的下一步是尝试直接从 PHP 脚本访问该文件。您的 PHP 代码正在 chroot 中运行,或者在 apparmor 配置文件中运行,或者在 systemd 文件系统命名空间中运行。

升级平台。

相关内容