[nginx] 빈 PHP 페이지를 보여주는 nginx

php5-fpm으로 nginx 서버를 설정했습니다. 사이트를로드하려고하면 오류없이 빈 페이지가 나타납니다. HTML 페이지는 훌륭하지만 PHP는 제공되지 않습니다. php.ini에서 display_errors를 켜려고했지만 운이 없습니다. php5-fpm.log에서 오류가 발생하지 않으며 nginx도 아닙니다.

nginx.conf

server {
    listen 80;
    root /home/mike/www/606club;
    index index.php index.html;
    server_name mikeglaz.com www.mikeglaz.com;
    error_log /var/log/nginx/error.log;
    location ~ \.php$ {
            #fastcgi_pass 127.0.0.1:9000;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
    }
}

편집하다

내 nginx 오류 로그는 다음과 같습니다.

2013/03/15 03:52:55 [error] 1020#0: *55 open() "/home/mike/www/606club/robots.txt" failed (2: No such file or directory), client: 199.30.20.40, server: mikeglaz.com, request: "GET /robots.txt HTTP/1.1", host: "mikeglaz.com"



답변

참고로, 확장명을 location가진 파일을 잡기 위해 블록을 첨부 하고 .php있습니다.

location ~ \.php$ {
    include /path/to/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
}

를 다시 확인 /path/to/fastcgi-params하고 nginx 사용자가 읽고 읽을 수 있는지 확인하십시오.


답변

바꾸다

include fastcgi_params;

include fastcgi.conf;

nginx.conf에서 fastcgi_param SCRIPT_FILENAME … 제거


답변

또한이 문제를했고 마침내 해결책을 발견 여기에 . 요컨대, nginx fastcgi 설정 파일 (우분투 12.04의 / etc / nginx / fastcgi_params)에 다음 줄을 추가해야합니다

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;


답변

많은 사용자 가이 스레드에 빠져 nginx + php-fpm 을 사용하는 동안 빈 페이지가 표시되는 솔루션을 찾을 것으로 기대 합니다. 이것은 여기에 많은 답변과 내 자신의 조사 (php7.2로 업데이트 됨)를 읽은 후에 한 일을 요약 한 것입니다.

1) /etc/php/7.2/fpm/pool.d/www.conf파라미터 값을 열고 확인합니다 listen.

listen = /var/run/php/php7.2-fpm.sock

2) 매개 변수 listenfastcgi_pass사이트 구성 파일의 매개 변수 와 일치해야 합니다 (i, e 🙂 /etc/nginx/sites-enabled/default.

fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;

3) 파일이 실제로 존재하는지 확인하십시오.

$ file /var/run/php/php7.2-fpm.sock
/var/run/php/php7.2-fpm.sock: socket

4) 존재하지 않으면 php7.2-fpm 이 실행되고 있지 않다는 것을 의미 하므로 다시 시작해야합니다.

$ sudo /etc/init.d/php7.2-fpm restart
[ ok ] Restarting php7.2-fpm (via systemctl): php7.2-fpm.service.

location섹션 과 관련하여 /etc/nginx/sites-enabled/default:

   # pass PHP scripts to FastCGI server
   #
   location ~ \.php$ {
      include snippets/fastcgi-php.conf;

      # With php-fpm (or other unix sockets):
      fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
   }

파일 snippets/fastcgi-php.conf이 위치에 있는지 확인하십시오 /etc/nginx/.

$ file /etc/nginx/snippets/fastcgi-php.conf
/etc/nginx/snippets/fastcgi-php.conf: ASCII text

이 파일에는 php7.2-fpm에 필요한 변수 정의 목록이 포함되어 있습니다. 변수는 직접 또는 분리 된 파일의 포함을 통해 정의됩니다.

 include fastcgi.conf;

이 파일은 다음 위치에 /etc/nginx/fastcgi.conf있으며 다음과 같습니다.

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
...
fastcgi_param  REDIRECT_STATUS    200;

nginx 에는 두 개의 가능한 매개 변수 파일 인 fastcgi_paramsfastcgi.conf가 포함되어 있습니다. 둘의 차이점은 변수의 정의입니다 SCRIPT_FILENAME.

$ diff fastcgi_params fastcgi.conf
1a2
> fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

긴 이야기를 짧게하려면 fastcgi.conf 가 항상 작동해야합니다. 어떤 이유로 든 설정이 fastcgi_params를 사용 하는 경우 다음을 정의해야합니다 SCRIPT_FILENAME.

location ~ \.php$ {
  include snippets/fastcgi-php.conf;

  # With php-fpm (or other unix sockets):
  fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;

  fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
}

이제 nginx 구성을 다시로드하십시오.

$ sudo nginx -s reload

그리고 PHP 파일이 올바르게 표시되는지 확인하십시오. 예를 들어 :

/var/www/html/test.php

<pre><?php var_export($_SERVER)?></pre>

/var/www/html문서 루트의 경로는 어디에 있습니까 ?

여전히 빈 파일을보고있는 그 모든에도 불구하고, 확인 경우가 php.ini있다 short_open_tag(당신이 짧은 태그와 PHP 페이지를 테스트하는 경우)를 활성화.


답변

/ etc / nginx / fastcgi_params에 있는지 확인하십시오.

fastcgi_param SCRIPT_FILENAME $ request_filename;

왜 이것이 없는지 누가 알겠습니까? 이것이 총체적으로 낭비되어야하는 시간!


답변

nginx에서 fastCGI 응용 프로그램으로 전달 된 환경 변수를 반환하는 짧은 C 프로그램을 작성했습니다.

#include <stdlib.h>
#include <fcgi_stdio.h>
extern char **environ;

int main(int argc, char **argv) {
    char *envvar;
    int i;

    int count = 0;
    while(FCGI_Accept() >= 0) {
        printf("Content-type: text/html\n\n"
               "<html><head><title>FastCGI Call Debug Tool</title></head>\n"
               "<body><h1>FastCGI Call Debugging Tool</h1>\n"
               "<p>Request number %d running on host <i>%s</i></p>\n"
               "<h2>Environment Variables</h2><p>\n",
              ++count, getenv("SERVER_NAME"));
        i = 0;
        envvar = environ[i];
        while (envvar != NULL) {
                printf("%s<br/>",envvar);
                envvar = environ[++i];
        }
        printf("</p></body></html>\n");
    }
    return 0;
}

예를 들어 파일에 저장하십시오. fcgi_debug.c

설치 첫째, 그것을 컴파일하려면 gcc하고 libfcgi-dev, 다음 실행 :

gcc -o fcgi_debug fcgi_debug.c -lfcgi

실행하려면을 설치 spawn-fcgi한 후 다음을 실행하십시오.

spawn-fcgi -p 3000 -f /path/to/fcgi_debug

그런 다음 디버그 프로그램을 가리 키도록 nginx fcgi 구성을 변경하십시오.

fastcgi_pass  127.0.0.1:3000;

nginx를 다시 시작하고 페이지를 새로 고치면 디버깅 할 수 있도록 모든 매개 변수가 브라우저에 나타납니다! 🙂


답변

이 힌트는 Ubuntu 14.04 LTS 설치에 도움이되었습니다.

또한 전원을 켜야 short_open_tag했습니다/etc/php5/fpm/php.ini

$ sudo kate /etc/php5/fpm/php.ini

short_open_tag = On

$ sudo service php5-fpm restart
$ sudo service nginx reload