PHP 致命錯誤:無法開啟 /dev/urandom:使用手動建立的 PHP 呼叫 session_start() 時沒有此類檔案或目錄

PHP 致命錯誤:無法開啟 /dev/urandom:使用手動建立的 PHP 呼叫 session_start() 時沒有此類檔案或目錄

問題

我在 Ubuntu 14.04 中手動建立了 PHP8.4,因為作業系統不再支持,沒有可用的 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 內核,2GB DDR3 RAM
  • 作業系統:Ubuntu 14.04 lts,核心版本 3.10.0
  • 網路伺服器:Apache 2.4.7 與 php-fpm fastcgi
  • PHP版本:8.4.0-開發版
  • 建置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 檔案系統命名空間中運行。

透過檢查 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

這告訴我你不是專家。

診斷錯誤時首先要查看的地方是日誌檔。不僅僅是您的網站伺服器日誌。

/dev/urandom 產生二進位輸出,這可能會弄亂您的終端設定 - 運行更安全head /dev/urandom | cat -v

您確實檢查了權限 - 由於它們是 x666,因此所有權並不重要(除非您對 /dev 有奇怪的權限)。但偵錯該問題的下一步是嘗試直接從 PHP 腳本存取該檔案。您的 PHP 程式碼可以在 chroot 下運行,或在 apparmor 設定檔中運行,或在 systemd 檔案系統命名空間中運行。

升級平台。

相關內容