PHP 치명적인 오류: /dev/urandom을 열 수 없습니다: 수동으로 빌드된 PHP로 session_start()를 호출할 때 해당 파일이나 디렉터리가 없습니다.

PHP 치명적인 오류: /dev/urandom을 열 수 없습니다: 수동으로 빌드된 PHP로 session_start()를 호출할 때 해당 파일이나 디렉터리가 없습니다.

문제

사용 가능한 ppa 패키지가 없어 OS가 지원되지 않기 때문에 Ubuntu 14.04에서 수동으로 PHP8.4를 빌드했습니다. 스크립트 헤드에 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 포함)
  • 운영 시스템:커널 버전 3.10.0이 포함된 Ubuntu 14.04 lts
  • 웹 서버:php-fpm fastcgi가 포함된 Apache 2.4.7
  • 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를 실행하거나 의류 프로필 또는 시스템 파일 시스템 네임스페이스에서 실행됩니다.

내가 찾은 php-fpm의 conf 파일을 확인하면 chroot설정되었습니다. 매개변수 설정을 해제하면 웹 브라우저에서 PHP 스크립트에 액세스할 수 있습니다 No input file specified.

그런 다음 아파치 구성을 확인하고 추가하려고했습니다.

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에서 오류가 발생하면 PHP에 대해 설정했는지 확인하는 것이 좋습니다 chroot.

답변1

OS가 지원되지 않기 때문에 Ubuntu 14.04에서 수동으로 PHP8.4를 빌드했습니다.

이것은 엄청난 위험 신호입니다. 지원되지 않는 운영 체제를 계속 실행하려면 많은 기술과 시간이 필요합니다. 그만큼오직이것이 원격으로 정당화될 수 있는 때는 업그레이드할 수 없는 미션 크리티컬 소프트웨어를 계속 실행하는 것입니다. 지원이 중단된 운영 체제에서 소프트웨어 스택을 변경하는 것은 전문가에게도 재앙을 초래하는 일이며 정당화 조건을 반박합니다.

그런 다음 터미널에서 스크립트 헤드 /dev/urandom을 실행합니다.

이것은 당신이 전문가가 아니라는 것을 말해줍니다.

오류를 진단할 때 가장 먼저 살펴보아야 할 곳은 로그 파일입니다. 웹서버 로그뿐만이 아닙니다.

/dev/urandom은 터미널 설정을 망칠 수 있는 바이너리 출력을 생성합니다. 실행하는 것이 더 안전합니다 head /dev/urandom | cat -v.

권한을 확인했습니다. x666이므로 소유권은 중요하지 않습니다(/dev에 이상한 권한이 없는 한). 그러나 문제 디버깅의 다음 단계는 PHP 스크립트에서 직접 파일에 액세스하는 것입니다. PHP 코드는 chroot를 실행하거나 의류 프로필 또는 systemd 파일 시스템 네임스페이스에서 실행됩니다.

플랫폼을 업그레이드하세요.

관련 정보