
나는 구글을 많이 검색했고 확실히 이 문제에 대한 많은 결과가 있습니다(serverfault.com에서도). 그러나 나는 그것으로 내 문제를 해결할 수 없었습니다.
내 설정
저는 WSL2에 Ubuntu 20을 설정했으며 이를 Ansible로 프로비저닝하려고 합니다. PHP-FPM-7.4로 Apache를 설정하려고 합니다.
아파치
아파치는 잘 작동하는 것 같습니다. test.html이 포함된 문서 루트가 있습니다. 해당 HTML 파일에 대한 직접 URL을 호출하면 원하는 내용이 표시됩니다.
호스트
참고: 읽기 쉽도록 모든 설명을 생략했습니다.
DirectoryIndex index.php index.html
<VirtualHost *:80>
ServerName paul.test
ServerAlias *.paul.test
<FilesMatch \.php$>
Require all granted
SetHandler proxy:fcgi://127.0.0.1:9000
</FilesMatch>
UseCanonicalName Off
VirtualDocumentRoot /var/www/hosts/%-4.0.%-3.0/%-5+
<Directory "/var/www">
AllowOverride All
Options -Indexes +FollowSymLinks
Require all granted
</Directory>
ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/var/www/hosts/%-4.0.%-3.0/%-5+"
</VirtualHost>
<VirtualHost *:443>
ServerName paul.test
ServerAlias *.paul.test
<FilesMatch \.php$>
Require all granted
SetHandler proxy:fcgi://127.0.0.1:9000
</FilesMatch>
UseCanonicalName Off
VirtualDocumentRoot /var/www/hosts/%-4.0.%-3.0/%-5+
SSLEngine on
SSLCipherSuite AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCompression off
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
<Directory "/var/www">
AllowOverride All
Options -Indexes +FollowSymLinks
Require all granted
</Directory>
ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/var/www/hosts/%-4.0.%-3.0/%-5+"
</VirtualHost>
PHP FPM
이제 문제는 PHP 파일을 호출할 때입니다. 그러면 "파일을 찾을 수 없습니다."라는 메시지가 표시됩니다. 웹 브라우저에서.
pool.d/www.conf
참고: 읽기 쉽도록 모든 설명을 생략했습니다.
[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 5
listen.allowed_clients = 127.0.0.1
오류 로그
PHP-FPM 오류 로그에는 정상적으로 실행되고 있다고 나와 있습니다.
[24-Dec-2020 12:16:06] NOTICE: fpm is running, pid 26532
[24-Dec-2020 12:16:06] NOTICE: ready to handle connections
[24-Dec-2020 12:16:06] NOTICE: systemd monitor interval set to 10000ms
Apache 오류 로그에 오류가 표시됩니다.
[Thu Dec 24 12:44:38.779511 2020] [proxy_fcgi:error] [pid 26424:tid 140510559713024] [client ::1:57178] AH01071: Got error 'Primary script unknown'
어떻게 수정/조사하나요?
우선 "파일을 찾을 수 없습니다."라는 오류 메시지가 나타납니다. 매우 불분명합니다. 누가 어떤 파일을 찾지 못했나요? 누가 이 오류를 발생시켰는지, 그리고 그것이 정확히 무엇을 의미하는지 설명하는 것은 나와 다른 사람들에게 앞으로 이 오류가 발생하는 데 도움이 될 것입니다.
지금까지 내 결론은 오류 메시지가 Apache에 의해 발생하고 있으며 이는 PHP-FPM 프로세스를 찾을 수 없다는 것을 의미한다는 것입니다. 그 맞습니까?
이 문제를 어떻게 더 자세히 조사하고 수정해야 합니까?
편집하다:Apache 및 PHP-FPM 설정을 추가합니다.
편집/중요사항
이 게시물을 개선하고 문제를 조사하는 동안 Apache 및 PHP-FPM의 기본 설정이 제대로 작동한다는 것을 알았습니다.
문제는 분명히 다음 명령문으로 인해 발생합니다.
ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/var/www/hosts/%-4.0.%-3.0/%-5+"
이 명령문은 이전 설정(Centos 사용)에서는 제대로 작동했지만 지금은 작동하지 않습니다. 문서 루트에 대한 정적 경로에 대해 이 문을 바꾸면 제대로 작동합니다.
더 자세히 조사해 보겠습니다. 이 문제를 해결하는 방법을 아는 사람이 있으면 알려주시기 바랍니다.
답변1
ProxyPassMatch
더 자세히 조사한 결과 내 진술이 오류를 일으켰다는 것을 알게 되었습니다 . 그러다가 전체 ProxyPassMatch 문을 사용해서는 안 된다는 StackOverflow의 게시물을 발견했습니다.
간단히 말해서 SetHandler proxy:fcgi://127.0.0.1:9000
(이미 내 vhost에 있었던) PHP가 작동하게 만듭니다.
답변2
이것이 "apache php-fpm 파일을 찾을 수 없음"을 검색했을 때 Google이 제공한 첫 번째 결과이므로 여기에 답변을 추가하고 싶습니다.
Apache 관련 문서 루트가 다음과 같은 경우다른PHP-FPM 관련 문서 루트에서
내 경우에는 Apache 관련 문서 루트가 이고 /data/.../wwwroot
, PHP-FPM 관련 문서 루트(컨테이너에서 실행)는 입니다 /var/www/html
.
수정 사항은 DOCUMENT_ROOT
및 를 조정하는 것이었 SCRIPT_FILENAME
습니다.ProxyFCGISetEnvIf
:
Define container_root "/var/www/html"
<FilesMatch "\.php$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://127.0.0.1:9000"
ProxyFCGISetEnvIf "true" DOCUMENT_ROOT "${container_root}"
ProxyFCGISetEnvIf "true" SCRIPT_FILENAME "%{HANDLER}${container_root}%{reqenv:SCRIPT_NAME}"
</If>
</FilesMatch>
UnDefine container_root
(다양한 변수 액세스 구문에 대한 참고 사항: 각 구문은 서로 다른 소스의 변수에 대한 것입니다 ${}
.Define
, 또는 -D
명령줄 인수를 사용하여; %{}
만약에Apache에서 정의한 변수; 그리고 %{reqenv:}
는함수 호출내부 환경 변수에 액세스합니다.)
섹션 끝에 다음 줄을 추가하여 이러한 변수를 디버깅할 수 있습니다 FilesMatch
.
Header always set X-HANDLER "expr=%{HANDLER}"
Header always set X-DOCUMENT_ROOT "expr=%{reqenv:DOCUMENT_ROOT}"
Header always set X-SCRIPT_FILENAME "expr=%{reqenv:SCRIPT_FILENAME}"
Header always set X-SCRIPT_NAME "expr=%{reqenv:SCRIPT_NAME}"
그러면 응답 헤더에 이러한 내용이 표시됩니다.