stderr로 전송 된 Nginx 1 FastCGI :“기본 스크립트를 알 수 없음”


81

Nginx를 처음 사용했지만 Apache 및 Linux에 익숙합니다. 기존 프로젝트를 사용하고 있는데 index.php를 보려고 할 때 404 파일을 찾을 수 없습니다.

access.log 항목은 다음과 같습니다.

2013/06/19 16:23:23 [error] 2216#0: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.ordercloud.lh"

다음은 사이트에서 사용 가능한 파일입니다.

server {
    set $host_path "/home/willem/git/console/www";
    access_log  /www/logs/console-access.log  main;

    server_name  console.ordercloud;
    root   $host_path/htdocs;
    set $yii_bootstrap "index.php";

    charset utf-8;

    location / {
        index  index.html $yii_bootstrap;
        try_files $uri $uri/ /$yii_bootstrap?$args;
    }

    location ~ ^/(protected|framework|themes/\w+/views) {
        deny  all;
    }

    #avoid processing of calls to unexisting static files by yii
    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
        try_files $uri =404;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php {
        fastcgi_split_path_info  ^(.+\.php)(.*)$;

        #let yii catch the calls to unexising PHP files
        set $fsn /$yii_bootstrap;
        if (-f $document_root$fastcgi_script_name){
            set $fsn $fastcgi_script_name;
        }

        fastcgi_pass   127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fsn;

        #PATH_INFO and PATH_TRANSLATED can be omitted, but RFC 3875 specifies them for CGI
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fsn;
    }

    location ~ /\.ht {
        deny  all;
    }
}

내 / home / willem / git / console은 www-data : www-data (PHP 등을 실행하는 웹 사용자)가 소유하고 있으며 좌절로부터 777 권한을 부여했습니다 ...

가장 좋은 추측은 구성에 문제가 있다고 생각하지만 알아낼 수는 없습니다 ...

업데이트 그래서 나는 그것을 /var/www/더 기본 구성으로 옮기고 사용했습니다.

server {
    #listen   80; ## listen for ipv4; this line is default and implied
    #listen   [::]:80 default ipv6only=on; ## listen for ipv6

    root /var/www/;
    index index.html index.htm;

    # Make site accessible from http://localhost/
    server_name console.ordercloud;

    location / {
        root           /var/www/console/frontend/www/;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www;
            include        fastcgi_params;
    }

    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
            try_files $uri =404;
        }

    location /doc/ {
        alias /usr/share/doc/;
        autoindex on;
        allow 127.0.0.1;
        deny all;
    }

}

또한 전화 localhost/console/frontend/www/index.php하면 500 PHP를 얻습니다. 그냥 콘솔에서 제공되지 않습니다.


또 다른 가능한 원인 : php-fpm을 사용하는 경우, /etc/php-fpm.d/www.conf에 설정된 사용자에게 스크립트를 실행할 권한이 있는지 확인하십시오. 나는 그것이 아파치 기본값이라고 생각합니다.
Dave

SElinux가 활성화 된 또 다른 원인은 SElinux config를 확인하고 비활성화하십시오.
CK.Nguyen

방금 호스트 구성을 FCGId (가상 서버 소유자로 실행)에서 FPM (가상 서버 소유자로 실행)으로 전환했습니다.
PhP

답변:


92

"기본 스크립트를 알 수 없음"오류 메시지는 거의 항상SCRIPT_FILENAME nginx fastcgi_param지시문 에 잘못 설정된 것과 관련이 있습니다 (또는 잘못된 권한은 다른 답변 참조).

if먼저 게시 한 구성에서를 사용하고 있습니다. 잘하면 지금 은 악 하고 종종 문제를 일으킨다 사실을 잘 알고 있어야합니다 .

root위치 블록 내 에서 지시문을 설정하는 것은 좋지 않습니다. 물론 작동합니다.

다음과 같은 것을 시도해 볼 수 있습니다.

server {
    location / {
        location ~* \.php$ {
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass 127.0.0.1:9000;
            try_files $uri @yii =404;
        }
    }
    location @yii {
        fastcgi_param SCRIPT_FILENAME $document_root$yii_bootstrap;
    }
}

위 구성은 테스트되지 않았습니다. nginx -tnginx가 즉시 감지 할 수있는 문제를 확인하기 위해 적용하기 전에 실행해야합니다 .


1
이것은 나를 위해 그것을 해결합니다. 나는 당신이 $ document_root 접두사를 사용해야한다는 것을 몰랐다. 루트를 기반으로 자동으로 그렇게했다고 가정했다.
b01

3
root내부 위치 설정의 나쁜 습관에 대한 자세한 정보는 어디에서 얻을 수 있습니까 ?
Dan Dascalescu

15
주요 Nginx에 담기 : 변수가 잘못 될 수있는 방법을 정확히 이해하지 못하는 사람들을 위해 http다음과 같은 섹션 log_format scripts '$document_root$fastcgi_script_name > $request';(또는 당신이 무엇을 SCRIPT_FILENAME에 공급하고), 당신을에 server: access_log /var/log/nginx/scripts.log scripts. 새로 고침 한 스크립트 로그를 다시 읽어보세요.;)
igorsantos07


3
yii_bootstrap은 무엇입니까?
사랑

43

그것은 아니다 항상 (가) 있다는 SCRIPT_FILENAME잘못된 것입니다. PHP가 잘못된 user / group으로 실행 중일
수도 있습니다 .

이 예에 특정 맥 OS X 내 경험에 설정에 가장 골칫거리 (데비안은 비교가 쉽다) - 난 그냥 사용, 7.0 PHP 5.6에서 업그레이드 한 사제 와 우수한 josegonzalez 패키지를.

문제는 구성 파일의 새 사본이 작성되었다는 것입니다.

기본 구성 파일은입니다 /usr/local/etc/php/7.0/php-fpm.conf. 그러나 전체 하위 디렉토리가 포함 된 끝에있는 수영장 정의 섹션을 참고하십시오 .

include=/usr/local/etc/php/7.0/php-fpm.d/*.conf

에서 php-fpm.d있다 www.conf파일. 기본적으로 이것은 다음과 같습니다.

user = _www
group = _www

OS X에서는 다음과 같이 변경해야 할 수도 있습니다.

user = [your username]
group = staff

(이것은 ls -lhdocument_root 와 일치 해야합니다)

불행히도이 변경 없이는 올바른 위치에서 파일을 찾더라도 Nginx 오류 로그에 여전히 표시 됩니다 .

"Primary script unknown" while reading response header from upstream

현재 실행중인 것을 확인하십시오.

ps aux | grep 'php-fpm'

또는 더 깨끗하게 :

ps aux | grep -v root | grep php-fpm | cut -d\  -f1 | sort | uniq

스크립트 파일 이름이 올바른지 확인하는 방법 :

(다른 답변에서 igorsantos07에서 도난당한)

http메인 블록에 추가 /usr/local/etc/nginx/nginx.conf:

log_format scripts '$document_root$fastcgi_script_name > $request';

(첫 번째 비트는 현재 사용중인 것이어야하므로 올바른지 확인할 수 있습니다.)

그리고 사이트 server블록 에서 방금 정의한 로그를 사용하려면 다음을 수행하십시오 .

access_log /var/log/nginx/scripts.log scripts;

올바른 경우 example.com/phpinfo.php를 요청하면 다음과 같은 결과가 나타납니다.

/path/to/docroot/phpinfo.php > GET /phpinfo.php

기존 구성을 단순화 할 수 있습니까?

location ~ \.php {인터넷 어딘가에서 복사 / 붙여 넣기 한 블록 을 사용하고 있습니까? 대부분의 패키지를 사용하면 더 빠르고 깨끗하게 할 수 있습니다. 예를 들어 OS X에서는 이제 다음이 필요합니다.

location ~ \.php {
    fastcgi_pass 127.0.0.1:9000;
    include snippets/fastcgi-php.conf;

    # any site specific settings, e.g. environment variables
}

fastcgi_split_path_info, try_files 및 fastcgi_index (기본값은 index.php)와 같은 것들이 /usr/local/etc/nginx/snippets/fastcgi-php.conf있습니다.

즉 차례로 포함 /usr/local/etc/nginx/fastcgi.conf목록 인 fastcgi_param중요한 SCRIPT_FILENAME을 포함하여 설정.

rootPHP 위치 블록에서 절대 복제하지 마십시오 .


2
아주 좋아요! 그게 나야! 힘내 친구 야!
rollsappletree

감사. 나를 위해 fpm / nginx docker 컨테이너를 실행하면 이러한 폴더에 액세스하는 데 권한 문제가있었습니다.
Tek

@Fleshgrinder의 답변이 잘못 되었고 당신의 말이 맞습니다! 내 경우는, 참이었다 에만 의 소유권 보정하는 문제 /etc/php/7.0/php-fpm.d/www.conf파일을. 건배, 친구. :) 더 많은 사람들이 유랑 인기가 계속 증가함에 따라이 문제를보기 시작할 수 있습니다.
user392778

/usr/local/etc/nginx/snippets/fastcgi-php.conf내 맥에서 아무것도 찾을 수 없습니다 ..하지만 내가 찾은/usr/local/etc/nginx/fastcgi.conf
abbood

좋은 것 !! 몇 시간 동안 어려움을 겪고
fonini

7

그래, 고군분투 한 하루 후에 내가 찾은 3 가지

  1. 어떤 이유로 든 포트 9000에서 이미 실행 중이므로 9001로 변경했습니다.
  2. 내 기본 사이트가 새 사이트를 가로 채고 있었는데 다시 한 번 왜 안되는지 이해가되지 않지만 링크를 해제했습니다.
  3. Nginx는 사이트에서 사용 가능한 사이트에 대해 sym 링크를 자동으로 수행하지 않습니다.

이것이 누군가에게 어려움을 덜어주기를 바랍니다!


안녕하세요 @ we0, 설정과 동일한 문제에 직면했습니다. 포트 3001에서 다른 앱을 실행하고 있으므로 포트 3002에서 내 PHP 앱을 호스팅해야합니다. 내 원래 게시물을 볼 수 있습니다 : stackoverflow.com/questions/33229867/…stackoverflow.com/questions/33409539/… 또 다른 하나는 stackoverflow.com/questions/33519989/… 입니다. 당신은 어떤 아이디어가 있습니까?
Manish Sapkal

3
사이트에서 사용 가능한 사이트로의 심볼릭 링크를 자동으로 만드는 것은 바람직하지 않습니다. 서버에서 '켜져있는'사이트와 '꺼져있는'사이트를 제어 할 수 있도록 심볼릭 링크를 만드는 것은 사용자의 책임입니다.
Erathiel

6

최신 nginx (v1.8)와 동일한 문제가 있습니다. 최신 버전 snippets/fastcgi-php.conf;대신을 사용 하는 것이 좋습니다 fastcgi.conf. 따라서 include fastcgi.conf자습서에서 복사 / 붙여 넣기 를 Primary script unknown하면 로그에 오류 가 발생할 수 있습니다 .


4

"기본 스크립트를 알 수 없음"SELinux 보안 컨텍스트로 인해 발생합니다 .

클라이언트는 응답을 얻을

파일을 찾을 수 없습니다.

nginx error.log에는 다음과 같은 오류 메시지가 있습니다

* 19 FastCGI가 stderr로 전송 : 업스트림에서 응답 헤더를 읽는 동안 "기본 스크립트를 알 수 없음"

따라서 웹 루트 폴더의 보안 컨텍스트 유형을 httpd_sys_content_t로 변경하십시오.

chcon -R -t httpd_sys_content_t /var/www/show




nginx / php-fpm 설정을위한 3 명의 사용자가 있습니다

/etc/nginx/nginx.conf

user nobody nobody;  ### `user-1`, this is the user run nginx woker process
...
include servers/*.conf;

/etc/nginx/conf.d/www.conf

location ~ \.php$ {
#   fastcgi_pass 127.0.0.1:9000;  # tcp socket
    fastcgi_pass unix:/var/run/php-fpm/fpm-www.sock;  # unix socket
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

/etc/php-fpm.d/www.conf

[www]
user = apache  ### `user-2`, this is the user run php-fpm pool process
group = apache

;listen = 127.0.0.1:9000  # tcp socket
listen = /var/run/php-fpm/fpm-www.sock  # unix socket

listen.onwer = nobody  ### `user-3`, this is the user for unix socket, like /var/run/php-fpm/fpm-www.sock
listen.group = nobody  # for tcp socket, these lines can be commented
listen.mode = 0660

user-1과 user-2가 같을 필요는 없습니다.

유닉스 소켓의 경우, nginx fastcgi_pass가 유닉스 소켓에 대한 읽기 / 쓰기 권한을 가져야 하므로 user-1은 user-3과 동일 해야합니다.

그렇지 않으면 nginx에 502 Bad Gateway 가 표시되고 nginx error.log에 다음 오류 메시지가 표시됩니다.

* 36 유닉스에 연결하는 동안 unix : /var/run/php-fpm/fpm-www.sock에 connect () 실패 (13 : 권한 거부)

웹 루트 폴더의 사용자 / 그룹 (/ var / www / show)은이 3 명의 사용자와 같을 필요는 없습니다.


2

나는 또한이 문제를 가지고 있었고, 나는 선을 교환하여 해결 include fastcgi_params하고 fastcgi_param SCRIPT_FILENAME ....

실제로 nginx는 각 FastCGI 매개 변수의 마지막 값을 설정하므로 fastcgi_params에 포함 된 기본값 뒤에 값을 넣어야합니다.


1

CentOS7.3 시스템에서 SELINUX를 닫아서이 문제를 해결했습니다.

단계 :

  • exec setenforce 0
  • U는 또한 설정 파일을 수정해야합니다

vim /etc/selinux/config set SELINUX to disabled


0

귀하의 질문에 동일한 오류 메시지를 찾고 있지만 apache + php-fpm (nginx 없음)을 사용하고 있습니다. 나에게 문제는 잘못된 장소에서 슬래시였습니다. 많은 설치 제안에는 다음과 같은 형식의 줄이 포함됩니다.

SetHandler "proxy:unix:/path/to/file.socket|fcgi://localhost/:9000"

포트 번호 뒤에 마지막 슬래시를 배치하면 다음과 같습니다.

SetHandler "proxy:unix:/path/to/file.socket|fcgi://localhost:9000/"

문제는 저에게 사라졌습니다. 어쩌면 당신은 비슷한 것을 할 수 있습니다


0

나는 같은 질문을 만났지만 다른 방법은 질문을 해결하는 데 도움이되지 않았습니다!

: 나는 그것을 해결, 나는 키가 있다는 것을 알게 리눅스 사용자 권한 문제로 이어질 : FastCGI를 열려진 전송 : "알 수없는 기본 스크립트를"

PHP-FPM 기본 user : group은 apache : apache이므로 코드 디렉토리는 someBody : someBody입니다. 따라서 사용자 권한을 변경해야합니다!

이 질문을 해결하기 위해 블로그를 작성하면 다음 블로그를 볼 수 있습니다.

[Nginx FastCGI가 stderr로 전송 : "기본 스크립트를 알 수 없음"] [1]`[1] : http://geekhades.blogspot.com/2017/06/nginx-fastcgi-sent-in-stderr-primary.html


0

원격 사이트를 복제했으며 기존 wp-config.php에 원격 서버 데이터베이스 정보가 있습니다.

로컬 데이터베이스 정보와 함께 로컬 워드 프레스 구성을 설정 하여이 문제를 해결했습니다.


0

나는 위에서 모든 것을했고, 2 시간을 잃어 버렸다. 마침내 나는했다 :

sudo service php7.0-fpm restart

그리고 비올라가 효과가있었습니다!

Btw, 나는 링크에서 https://symfony.com/doc/3.4/setup/web_server_configuration.html 에서 nginx conf를 사용하여 새로운 symfony 3.4 프로젝트를 설정했습니다.

새로운 교향곡 프로젝트를 시작한 것은 다섯 번째였으며이 "기본 스크립트 미지"가 발생하고 있다고 믿을 수 없었습니다.


0

php-fpm 양말 파일의 권한을 확인하십시오. 어떻게 액세스 할 수 없었습니다.

chmod 755 /usr/local/var/run/php-fpm.sock

그런 다음 nginx를 다시 시작하십시오.


0

나는이 이상한 메시지에 아주 오랫동안 갇혀있었습니다. 모든 것이 잠시 동안 작동 한 다음 갑자기 작동이 멈 췄기 때문에 원인에 대해 잘 모르겠습니다.

Lightsail에서 Bitnami / Nginx와 함께 MediaWiki가 규정 한 위키 URL을 단축했습니다.

많은 게시물을 검색하고 읽으면 가능한 모든 시나리오를 요약 한 것으로 보이며 모두 시도했습니다.

  • nginx는 괜찮습니다. 루트 폴더 PHP가 작동 중입니다. 하위 폴더가 아닙니다.
  • nginx가 아닌 404 + 맨 문자열 "파일을 찾을 수 없음"으로 발생한 오류
  • root서버에 추가 , 작동하지 않았다
  • 폴더 및 php-fpm / nginx의 권한을 확인하십시오. 문제가 없습니다. 루트 및 하위 폴더가 동일합니다
  • 오류 코드 해석을 위해 PHP-fpm 매뉴얼을 확인하십시오.
  • php-fpm 액세스 로그를 켜고 요청 URI가 올바른 것을 발견했지만 404가 반환됩니다.
  • PHP-FPM에 대한 자세한 / 디버그 모드를 켜려고 시도했지만 작동하지 않았습니다. 오류 로그 파일이 항상 비어 있습니다.

루트 폴더의 PHP가 작동되고 하위 폴더가 아니었다 때문에 그래서, 최후의 수단을 시도했다, 이외의 다른 그들 사이의 유일한 주요 차이점은 root루트 사용되는 폴더 $request_filename및 하위 폴더 위치를 사용 $document_root하고 $fastcgi_script_name, 그래서 루트 폴더 것들에 맞게 하위 폴더의 위치 설정을 변경했습니다.

그런 다음 효과가있었습니다 ... 여전히 효과가 있었는지 잘 모르겠습니다 . php-fpm 액세스 로그를 확인할 때 동일한 URI가 표시되므로 하나는 404이고 다른 하나는 200입니다.

여기에 이미지 설명을 입력하십시오

유일한 차이점은 구성이었습니다. 그들은 동일한 출력을 생성하기 때문에 결과가 다르게 나오는 이유를 모르겠습니다.

어쨌든 나는 여기에 2 센트를 게시하기로 결정했습니다. 이것이 도움이되기를 바랍니다.

추신 : PHP가 더 나은 오류 메시지와 자세한 모드를 제공하기를 정말로 바랍니다. 이것은 문제를 분리 할 수 ​​없으며 자세한 출력 및 디버그 정보를 볼 수있는 방법이 없기 때문에 좌절됩니다.


-1

PHP 위치에 루트 지시문을 추가하십시오.

location ~ \.php {
      root /home/willem/git/console/www;
      ...
}

1
root지시어는 기본적 으로 설정해야하며 블록 server내에 사용해서는 안됩니다 location(프로 가 아니고 구성에서 매우 특수한 nginx 버그를 피하려는 경우가 아니라면).
Fleshgrinder

1
@Fleshgrinder 서버 당 하나의 루트는 모범 사례가 아닙니다.
Garet Claborn


@Fleshgrinder 그것은 당신이 연결 한 섹션이 말하는 것이 아닙니다. 이 섹션의 모범 사례 rootlocation블록 내부의 지시문을 보여줍니다 .
ishigoya

@ishigoya 다시 링크를 방문하십시오, root여러 location블록 내부 의 여러 지시문 은 분명히 나쁜 제목 아래에 있습니다.
Fleshgrinder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.