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

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를 얻습니다. 그냥 콘솔에서 제공되지 않습니다.



답변

“기본 스크립트를 알 수 없음”오류 메시지는 거의 항상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가 즉시 감지 할 수있는 문제를 확인하기 위해 적용하기 전에 실행해야합니다 .


답변

그것은 아니다 항상 (가) 있다는 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 위치 블록에서 절대 복제하지 마십시오 .


답변

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

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

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


답변

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


답변

“기본 스크립트를 알 수 없음”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 명의 사용자와 같을 필요는 없습니다.


답변

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

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


답변

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

단계 :

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

vim /etc/selinux/config set SELINUX to disabled