Проблема
Я вручную собрал 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.
Обновите платформу.