Фатальная ошибка PHP: Невозможно открыть /dev/urandom: Нет такого файла или каталога при вызове session_start() с вручную собранным PHP

Фатальная ошибка PHP: Невозможно открыть /dev/urandom: Нет такого файла или каталога при вызове session_start() с вручную собранным PHP

Проблема

Я вручную собрал PHP8.4 в Ubuntu 14.04, так как эта ОС больше не поддерживается, а пакет ppa недоступен. Я проверил, чтобы 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 ядра с 2 ГБ оперативной памяти DDR3
  • Операционная система:Ubuntu 14.04 lts с версией ядра 3.10.0
  • Веб сервер:Apache 2.4.7 с php-fpm fastcgi
  • 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 путем ручной компиляции всех отсутствующих зависимостей.

Я не знаю, с чего начать проверку. Пожалуйста, дайте несколько советов, например, какой файл конфигурации может быть неправильно настроен, какую системную информацию стоит проверить, как заставить его выводить больше диагностической информации о /dev/urandom и т. д. Если для решения проблемы требуется дополнительная информация, пожалуйста, оставьте комментарий, и я улучшу описание своего вопроса.

Решение

Спасибо @symcbean, он упомянул:

Ваш PHP-код должен работать в chroot-окружении, внутри профиля apparmor или в пространстве имен файловой системы systemd.

Проверив файл conf php-fpm, я обнаружил, 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 directoryв PHP возникает какая-либо ошибка, стоит проверить, установлены ли у вас настройки chrootдля PHP.

решение1

Я вручную собрал PHP8.4 в Ubuntu 14.04, так как эта ОС больше не поддерживается

Это огромный красный флаг. Поддержание операционной системы, которая не поддерживается, в рабочем состоянии требует МНОГО навыков и времени.тольковремя, когда это хотя бы отдаленно оправдано, — это продолжение работы критически важного программного обеспечения, которое нельзя обновить. Изменение программного стека в операционной системе, которая не поддерживается, — это рецепт катастрофы даже для эксперта и опровергает предикат оправдания.

Затем я запускаю скрипт head /dev/urandom в терминале

Это говорит мне о том, что вы не эксперт.

Первое место, куда следует заглянуть при диагностике ошибки, — это ваши файлы журналов. И не только журналы вашего веб-сервера.

/dev/urandom создает двоичный вывод, который может испортить настройки вашего терминала — безопаснее запустить head /dev/urandom | cat -v.

Вы проверили разрешения - и поскольку они x666, владелец не имеет значения (если только у вас нет странных разрешений на /dev). Но следующим шагом в отладке проблемы будет попытка получить доступ к файлу напрямую из PHP-скрипта. Ваш PHP-код должен работать в chroot, или в профиле apparmor, или в пространстве имен файловой системы systemd.

Обновите платформу.

Связанный контент