programing

"FastCGI sent in stderr: 업스트림에서 응답 헤더를 읽는 동안 기본 스크립트를 알 수 없음"을 디버깅하고 실제 오류 메시지를 찾는 방법은 무엇입니까?

css3 2023. 7. 24. 22:44

"FastCGI sent in stderr: 업스트림에서 응답 헤더를 읽는 동안 기본 스크립트를 알 수 없음"을 디버깅하고 실제 오류 메시지를 찾는 방법은 무엇입니까?

SO에는 이 오류 코드를 언급하는 많은 기사가 있습니다.

FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream...

그것은 아마도 이 오류 메시지가 다소 쓸모가 없다는 것을 의미합니다.

메시지는 FastCGI 핸들러가 어떤 이유로 전송된 것을 좋아하지 않는다는 것을 알려줍니다.문제는 때때로 우리는 그 이유가 무엇인지 전혀 모른다는 것입니다.

그래서 저는 이 오류 코드를 어떻게 디버깅할 것인가에 대한 질문을 다시 한 번 말씀드리겠습니다.

phpinfo.php 파일만 있는 매우 간단한 사이트가 있는 상황을 생각해 보십시오.또한 다음과 같이 매우 간단한 nginx 구성이 있습니다.

server {
    server_name testsite.local;

    root /var/local/mysite/;

    location / {
        index index.html index.htm index.php;
    }

    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass  fastcgi_backend;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

스크립트로 전송된 fastcgi_params가 정확히 무엇인지 출력/로그하려면 어떻게 해야 합니까?

실제 오류 메시지는 어떻게 볼 수 있습니까?저의 경우, 저는 php-fpm을 사용하고 있습니다.로그에 이 오류에 대한 정보가 없습니다.로그는 이 오류에 대한 행을 추가하지 않습니다.php-fpm에 대한 자세한 모드가 있습니까?

/var/log/php-fpm/error.log
/var/log/php-fpm/www-error.log

나는 이것을 php-fpm.conf 파일에 설정하려고 했습니다.

log_level = notice

그리고 이것은 php-fpm.d/www.conf 파일에 있습니다.

catch_workers_output = yes

질문에 대한 답변:

  1. php-fpm.d/www.conf 파일:

access.log 항목을 설정합니다.

access.log = /var/log/$pool.access.log
  1. php-fpm 서비스를 다시 시작합니다.

  2. 당신의 페이지에 접근을 시도합니다.

  3. cat /var/log/www.access.log의 경우 다음과 같은 액세스 로그가 표시됩니다.

- - 10/Nov/2016:19:02:11 +0000 "GET /app.php" 404 - - 10/Nov/2016:19:02:37 +0000 "GET /app.php" 404

"기본 스크립트를 알 수 없음" 문제를 해결하려면:

  • 정확한 php 파일 이름 없이 "GET /"가 표시되면 nginx conf 문제입니다.

  • 404와 함께 "GET /app.php"가 표시되면 nginx가 스크립트 파일 이름을 올바르게 전달하고 있지만 php-fpm이 이 파일에 액세스하지 못했다는 것을 의미합니다(사용자 "php-fpm:php-fpm"이 사용자의 파일에 액세스하지 못해 3시간 동안 갇혔습니다).

제 대답이 도움이 되길 바랍니다.

php worker에 의해 요청이 처리되므로 php worker를 추적하여 이유를 알 수 있습니다.

요청을 처리하는 작업자를 쉽게 찾을 수 있도록 php-fpm의 conf 파일에서 작업자를 한 명만 설정합니다.

pm.max_children = 1
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 1

workpid로 $ps -aef | grep -v grep | grep php

root     28879     1  0 Apr12 ?        00:00:02 php-fpm: master process (/etc/php-fpm.conf)
www      28880 28879  0 Apr12 ?        00:00:24 php-fpm: pool www

그런 다음 작업 프로세스를 추적합니다.$ sudo strace -p 28880와 같은 .

strace: Process 28880 attached
accept(10,

{sa_family=AF_UNIX}, [112->2]) = 4
poll([{fd=4, events=POLLIN}], 1, 5000)  = 1 ([{fd=4, revents=POLLIN}])
times({tms_utime=1388, tms_stime=1099, tms_cutime=0, tms_cstime=0}) = 1336709044
read(4, "\1\1\0\1\0\10\0\0", 8)         = 8
read(4, "\0\1\0\0\0\0\0\0", 8)          = 8
read(4, "\1\4\0\1\4U\3\0", 8)           = 8
read(4, "\17DSCRIPT_FILENAME/data/HQ/SC_Edu"..., 1112) = 1112
read(4, "\1\4\0\1\0\0\0\0", 8)          = 8
lstat("/data/www/public/st/mn/dst.php", 0x7ffce98d7170) = -1 ENOENT (No such file or directory)
stat("/data/www/public/st/mn", 0x7ffce98d9580) = -1 ENOENT (No such file or directory)
stat("/data/www/public/st", 0x7ffce98d9580) = -1 ENOENT (No such file or directory)
stat("/data/www/public", {st_mode=S_IFDIR|0774, st_size=4096, ...}) = 0
...

추적 출력에서 스크립트 파일을 표시합니다./data/www/public/st/mn/dst.php종료하지 않음

Nginx의 fastcgi_pass로 인한 문제가 올바르지 않습니다.

다음을 확인할 수 있습니다.

열기: 파일열:/etc/php-fpm.conf(systemctl status php-fpm그것을 찾기 위해) 그리고 찾기 위해pid =의 경로 =와 비교해야 할 입니다.listen =일렬 종대로/etc/php-fpm.d/www.conf두 경로가 동일한 위치에 있습니다.

예:

pid = /run/php-fpm/php-fpm.pid

listen = /run/php-fpm/php-fpm.sock;

길 ㅠㅠㅠㅠlisten = /var/run/php-fpm/php-fpm.sock; 저는 바다니습꿨으로 바꿨어요./run/php-fpm/php-fpm.sock;그런 다음 php-fpm을 다시 시작하면 잘 실행됩니다.

저는 .php-fpm/www.conf

사용자 이름 및 그룹으로 값 변경 _wwwe.g

user = aqib
group = _www

의 경우,이 php-fpm에 때문에 이 합니다.$document_root,어느 것이/etc/nginx/html

설정별

 location ~ \.php$ {
        root /var/www/html;
        fastcgi_index   index.php;
        ...
    }

이제 PHP-FPM이 파일을 올바르게 찾을 수 있습니다.

MacOS 사용자의 경우, 내 상황처럼 누군가가 마주쳤을 경우:

저는 다음과 함께 php 서비스를 시작했습니다.

sudo brew start php72

"sudo" 권한을 사용했기 때문에 다릅니다.나는 sudo 없이 php 서비스를 중지하고 시작해야 했습니다.

sudo brew stop php72
brew start php72

희망은 누군가에게 도움이 됩니다.

루트의 위치와 그 아래에 있는 파일의 존재를 확인해 보세요, 루트 경로 TYPO 때문에 이 오류를 만났습니다.

저(Oracle Linux 7)의 경우 php-fpm이 파일에 액세스하지 못하게 하는 것은 SELinux였습니다.Red Hat과 Centos 사용자는 동일한 것을 찾을 수 있습니다.

주행 중인

sestatus

SELinux의 상태를 보여줍니다. SELinux가 켜져 있어 문제가 발생했습니다.저는 다른 제안된 수정 사항을 모두 시도하고 구현했지만 오류가 계속 발생했습니다.

SELinux를 허용 모드로 설정하여 해결했습니다.

/etc/selinux/config

# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

나머지 최소 구성: /etc/nginx/nginx.conf:

user  apache;
worker_processes  1;

events {
}
http {

        include mime.types;
        server {
                listen 80;
                server_name 111.222.111.222; #your ip address
                root /sites/demo;

                index index.php index.html;

                location ~ \.php$ {
                        # pass to php-fpm
                        include fastcgi.conf;
                        include fastcgi_params;
                        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
                }

        }
}

참고: php-fpm에서 사용하는 apache로 사용자를 변경했습니다.

/etc/sys-fpm.d/www.conf:

 The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;                            a specific port;
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
;listen = 127.0.0.1:9000
listen = /run/php-fpm/php-fpm.sock

; Set listen(2) backlog.
; Default Value: 511
;listen.backlog = 511

; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server.
; Default Values: user and group are set as the running user
;                 mode is set to 0660
listen.owner = apache
listen.group = apache
listen.mode = 0660

참고: listen.owner 및 listen.group을 apache로 설정합니다.

내 파일 및 폴더에 대한 사용 권한은 다음과 같습니다. /filename(root:sysdrwxrx-x) /filename/filename(root:sysdrwrwxr-x) /filename/index.filename(root:s.rw.rw .r..)

ps -aux | grep -E "php|nginx"를 보면 모든 php-fpm 풀 프로세스와 nginx worker 프로세스가 사용자 apache로 실행되고 있음을 알 수 있습니다.

소켓 파일 /run/php-fpm/php-fpm.sock에 대한 사용 권한을 살펴보면 apache:apache 및 srw-rw---가 소유하고 있음을 알 수 있습니다.

저의 경우에도 처음에는 코드의 수백만 가지 문제와 싸우기 시작했지만, 그 다음에는 전 세계적으로 큰 그림을 보았습니다.문제는 잘못된 버전의 PHP에 있었습니다.결국, 저는 다른 PHP 버전을 하나씩 시도해 보았습니다.

fastcgi_pass unix:/run/php/php7.3-fpm.sock

fastcgi_pass unix:/run/php/php5.3-fpm.sock

그리고 나서 문자 그대로 수백만 줄의 코드를 다시 개발하고 변경하지 않고도 작동했습니다.약간 바보같고 모든 것이라는 것을 알지만, 새로운 PHP 버전은 더 오래된 스타일과 오래된 PHP 방식으로 개발된다면 모든 것을 망칩니다.가장 최신 버전의 PHP를 실행하는 것보다 작동시키는 것이 더 중요했습니다.

언급URL : https://stackoverflow.com/questions/35261922/how-to-debug-fastcgi-sent-in-stderr-primary-script-unknown-while-reading-respo