내 설정

내 설정

나는 구글을 많이 검색했고 확실히 이 문제에 대한 많은 결과가 있습니다(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}"

그러면 응답 헤더에 이러한 내용이 표시됩니다.

관련 정보