問題
我在 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 directory
PHP出現任何錯誤,需要檢查一下你是否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 檔案系統命名空間中運行。
升級平台。