PHP 致命的エラー: 手動でビルドされた PHP で session_start() を呼び出すと、/dev/urandom を開けません: そのようなファイルまたはディレクトリはありません

PHP 致命的エラー: 手動でビルドされた PHP で session_start() を呼び出すと、/dev/urandom を開けません: そのようなファイルまたはディレクトリはありません

問題

OS がサポート対象外で PPA パッケージも利用できないため、Ubuntu 14.04 で PHP8.4 を手動でビルドしました。スクリプトの先頭にphpinfo()追加しながら Web ページに正しい情報が表示されるかテストしたところ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
  • Webサーバー:Apache 2.4.7 と php-fpm fastcgi
  • PHPバージョン:8.4.0-開発版
  • PHP をビルドするときの configure コマンド:
'./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'

configure によって出力されたすべてのエラーは、PHP をコンパイルする前に、不足しているすべての依存関係を手動でコンパイルすることで解決されました。

どこから確認を始めればよいかわかりません。どの設定ファイルが正しく設定されていない可能性があるか、どのシステム情報を確認する価値があるか、/dev/urandom に関する診断情報をさらに印刷するにはどうすればよいかなど、ヒントを教えてください。問題を解決するためにさらに情報が必要な場合は、コメントしてください。質問の説明を改善します。

ソリューション

@symcbean さん、ありがとうございます。彼は次のように言っています:

PHP コードは chroot で実行されているか、apparmor プロファイル内または systemd ファイルシステム名前空間内で実行されています。

php-fpm の conf ファイルを確認すると、 がchroot設定されていました。パラメータの設定を解除すると、Web ブラウザーで php スクリプトにアクセスすると が表示されましたNo input file specified

それから私はApacheの設定を確認し、追加しようとしました

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

しかし、私がインストールしたバージョンの Apache は 'ProxyFCGISetEnvIf' を認識しないようで、'Invalid command' エラーがスローされます。

最終的に交換しました

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

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

今、すべての問題は解決しました。

一言でPHP でエラーが発生した場合はNo such file or directory、PHP に設定されているかどうかを確認する価値がありますchroot

答え1

OSがサポート外なので、Ubuntu 14.04でPHP8.4を手動でビルドしました

これは大きな危険信号です。サポート対象外のオペレーティングシステムを稼働させ続けるには、膨大なスキルと時間が必要です。のみこれが少しでも正当化されるのは、アップグレードできないミッションクリティカルなソフトウェアを実行し続ける場合です。サポート対象外のオペレーティング システムでソフトウェア スタックを変更することは、専門家にとっても災難を招く原因となり、正当化の前提を否定します。

次にターミナルでスクリプトhead /dev/urandomを実行します。

これはあなたが専門家ではないことを示しています。

エラーを診断するときに最初に確認する場所はログ ファイルです。Web サーバーのログだけではありません。

head /dev/urandom | cat -v/dev/urandom はバイナリ出力を生成するため、端末の設定が台無しになる可能性があります。を実行する方が安全です。

権限を確認しました。x666 なので所有権は問題になりません (/dev に奇妙な権限がない限り)。ただし、問題をデバッグする次のステップは、PHP スクリプトから直接ファイルにアクセスしてみることです。PHP コードは chroot で実行されているか、apparmor プロファイル内または systemd ファイルシステム名前空間内にあります。

プラットフォームをアップグレードします。

関連情報