문제
사용 가능한 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 directory
PHP에서 오류가 발생하면 PHP에 대해 설정했는지 확인하는 것이 좋습니다 chroot
.
답변1
OS가 지원되지 않기 때문에 Ubuntu 14.04에서 수동으로 PHP8.4를 빌드했습니다.
이것은 엄청난 위험 신호입니다. 지원되지 않는 운영 체제를 계속 실행하려면 많은 기술과 시간이 필요합니다. 그만큼오직이것이 원격으로 정당화될 수 있는 때는 업그레이드할 수 없는 미션 크리티컬 소프트웨어를 계속 실행하는 것입니다. 지원이 중단된 운영 체제에서 소프트웨어 스택을 변경하는 것은 전문가에게도 재앙을 초래하는 일이며 정당화 조건을 반박합니다.
그런 다음 터미널에서 스크립트 헤드 /dev/urandom을 실행합니다.
이것은 당신이 전문가가 아니라는 것을 말해줍니다.
오류를 진단할 때 가장 먼저 살펴보아야 할 곳은 로그 파일입니다. 웹서버 로그뿐만이 아닙니다.
/dev/urandom은 터미널 설정을 망칠 수 있는 바이너리 출력을 생성합니다. 실행하는 것이 더 안전합니다 head /dev/urandom | cat -v
.
권한을 확인했습니다. x666이므로 소유권은 중요하지 않습니다(/dev에 이상한 권한이 없는 한). 그러나 문제 디버깅의 다음 단계는 PHP 스크립트에서 직접 파일에 액세스하는 것입니다. PHP 코드는 chroot를 실행하거나 의류 프로필 또는 systemd 파일 시스템 네임스페이스에서 실행됩니다.
플랫폼을 업그레이드하세요.