빈 PHP 페이지를 보여주는 nginx


164

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"

1
분명히 php-fpm은 nginx에 의해 호출되지 않았습니다. nginx의 오류 로그를 확인 했습니까?
adamsmith

위의 업데이트를 확인하십시오.
Mike Glaz

nginx 오류가 connect() failed ... fastcgi://127.0.0.1:9000nginx conf와 모순됩니다. nginx conf를 다시로드 하시겠습니까?
adamsmith

나는 이것이 옳다고 생각합니다.
Mike Glaz

2
기본 nginx + php 구성 조차도이 일을 일으키기 때문에 이것이 지구상의 수천 명의 사람들에게만 영향을 미치는 것 같습니다.
Sliq

답변:


249

참고로, 확장명을 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 사용자가 읽고 읽을 수 있는지 확인하십시오.


3
귀하의 솔루션은 그 일부였습니다. 다른 부분은 여기 wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm
Mike Glaz

153
'SCRIPT_FILENAME'와 마지막 줄은 나에게 :) 감사의 속임수를 썼는지
스테인 Leenknegt에게

3
마지막 줄은 트릭을 수행했습니다 (Centos와 함께 제공되는 1.0 버전의 nginx를 사용할 때는 필요하지 않습니다). 이 모든 개선 사항에 대한 설명서를보고 싶습니다.
Jorre

1
여러분은이 세월이 지난 후에도 사람들에게 여전히 도움이된다는 것을 알게되어 기쁩니다. 그러나 @spacepile의 업데이트 된 답변은 아래에 나와 있습니다.
Julian H. Lam

2
나는 같은 문제에 부딪 쳤고 해결책은 여기에 설명 된대로 슬래시 /없이 SCRIPT_FILENAME을 추가하는 것이 었습니다. 그러나 나를 미치게 한 것은 실제로 이것을 해야하는 이유는 무엇입니까? 우리는 다른 nginx 설치 (1.9 이전)를 가지고 있었고이 줄은 필요하지 않았습니다. 이 nginx.com/resources/wiki/start/topics/examples/phpfcgi를 찾았 으며 fastcgi_params 와 비교하면 나열된 온라인 버전과 동일하지 않을 수 있으며 SCRIPT_FILENAME이 표시됩니다. 거기에 없습니다. 왜 그래? Go go ...
Daniel Dimitrov

342

바꾸다

include fastcgi_params;

include fastcgi.conf;

nginx.conf에서 fastcgi_param SCRIPT_FILENAME ... 제거


17
이것은 나를 위해 그것을 고쳤다. 에서 .conf하나의 추가 구성 매개 변수가 누락되었습니다 _params.
Malvineous

7
이것은 (그리고 물론 /etc/init.d/nginx restart) nginx2014 년 9 월 10 일에 업그레이드 한 후 데비안 테스팅에서 나를 위해
고쳤습니다

6
이것은 nginx를 1.6.2 (2014 년 9 월 업데이트)로 업데이트 한 후에도 수정되었습니다. 무작위로 문제를 해결하는 업데이트를 좋아해야합니다.
Mahn

30
다음은 fastcgi_paramsvs. 의 배경 이야기입니다 fastcgi.conf: blog.martinfjordvald.com/2013/04/…
Levite

4
이 코드는 작동하지 않습니다. 이유를 모르겠습니다. 이 코드는 작동하지만 이유를 모르겠습니다. 당신은 몇 시간을 저를 구했습니다.
알렉스

54

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

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
대단히 감사합니다. 이는 Ubuntu 12.04 LTS에서 수정되었습니다.
Valentin Klinghammer

2
nginx 1.5.4-> 1.7.4를 업그레이드 한 후에도 수정되었습니다. 정말 고맙습니다!
trisweb

4
우분투 14.04에서 작업했습니다.
timetofly

1
Debian Wheezy (7.8)에서 Jessie (8)로, Nginx 1.2.1-2.2에서 1.6.2-5로 업그레이드 할 때 수정되었습니다. 대단히 감사합니다.
William Turrell

1
내가 이해하는 것처럼, 그것은 파일이 어디에 있어야하는지 fastcgi에게 알려줍니다. PATH_TRANSLATED는 요청 URI를 가져 와서 실제 파일이 서버에있는 위치로 "번역"합니다. 예 : test.com/index.php의 PATH_TRANSLATED는
/var/www/index.php

44

많은 사용자 가이 스레드에 빠져 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 페이지를 테스트하는 경우)를 활성화.


1
고마워 디에고! fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;마침내 트릭을 했어.
danger89

는 fastcgi.conf 모두를 해결하는 데 도움이 포함
Rytis Lukoševičius

1
굉장한 고장! SCRIPT_FILENAME 설정이 누락되어 작동합니다
herval

1
SCRIPT_FILENAME을 해당 구성에 추가하면 "파일을 찾을 수 없음"으로 다시 실패했습니다.
holms

긴 이야기는 어떻습니까? 왜 두 개의 포함이 있고 하나는 즉시 작동하지 않습니까?
대부

24

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

fastcgi_param SCRIPT_FILENAME $ request_filename;

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


1
+1 "fastcgi_param SCRIPT_FILENAME $ request_filename;"의 장점 "$ document_root / $ fastcgi_script_name"과 달리 "$ request_filename"은 Nginx의 "alias"지시문에 대한 경로를 조정합니다. nginx.org/en/docs/http/ngx_http_core_module.html#variables , nginx.org/en/docs/http/ngx_http_core_module.html#alias 및 위의 Levit가 인용 한 Martin Fjordvald의 블로그 ( blog.martinfjordvald.com/2013)를 참조하십시오. / 04 /… ). 내 위치 차단에서 El Capitan에 Homebrew와 함께 설치된 php71-fpm 및 Nginx의 빈 페이지 문제가 해결되었습니다.
슬랙 언더 토우

15

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를 다시 시작하고 페이지를 새로 고치면 디버깅 할 수 있도록 모든 매개 변수가 브라우저에 나타납니다! :-)


1
헤더와 spawn-fcgi가 필요합니다. 데비안 / 우분투에서는 다음으로 구할 수 있습니다 apt-get install spawn-fcgi libfcgi-dev.
pevik

8

이 힌트는 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

이것은 DO droplet Ubuntu 설치로 해결되었습니다. 감사합니다
Andrew

이 nginx를 1.9.4 설치 한 후 저를 위해 수정되었습니다
Ajeeb.KP

6

이것을 다음에 추가하십시오 /etc/nginx/conf.d/default.conf:

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
OP의 문제가 정확히 무엇인지, 답변이 OP의 문제를 어떻게 해결하는지에 대해 좀 더 자세히 설명해 주시겠습니까?
wookie919

1
이것은 nginx 1.8.0 및 php-fpm 5.6.4-4ubuntu6가있는 Ubuntu 15.04에서 동일한 문제를 해결했습니다. 나는 이것이 실제로 무엇을하고 있으며 그것이 왜 기본 nginx 설정 파일에 포함되어 있지 않은지 알고 싶지만 적어도 Dockerfile에 코드화 한 것이 기쁘다.
제임스 윌리엄스

/etc/nginx/fastcgi_params파일에 값을 넣는 것이 더 적절하다고 생각합니다.
Arda

4

누구 든지이 문제가 있지만 위의 답변으로 문제를 해결할 수없는 경우 동일한 문제가 발생하여 구성 파일이 정확하고 ngnix 및 php-fpm 작업이 제대로 실행되어 추적하기가 가장 어려웠습니다. 오류 로그를 통해 오류가 발생하지 않았습니다.

벙어리 실수이지만로 설정된 php.ini 파일에서 Short Open Tag 변수를 확인하지 않았습니다 short_open_tag = Off. 내 PHP 파일 <?대신을 사용하고 있었기 때문에 <?php페이지가 공백으로 표시되었습니다. Short Open Tag가로 설정되어 있어야합니다.On필자의 경우 .

이것이 누군가를 돕기를 바랍니다.


2

이 문제가 발생하는 이유는 nginx의 fastcgi 구성이 필요에 따라 작동하지 않고 제자리에 있거나 처리하기 때문에 html 데이터로 응답하기 때문입니다. 이 문제를 피하기 위해 nginx를 구성 할 수있는 두 가지 방법이 있습니다.

  1. 방법 1 :

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # With php5-fpm:
                fastcgi_pass unix:/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi.conf;
        }
  2. 방법 2 :

    location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            include snippets/fastcgi-php.conf;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            include fastcgi_params;
    }

두 가지 방법 모두 제대로 작동하면 계속 진행할 수 있습니다. 그들은 거의 동일한 차이점을 거의 동일한 작업을 수행합니다.


1
location ~ [^/]\.php(/|$) {
         fastcgi_pass unix:/PATH_TO_YOUR_PHPFPM_SOCKET_FILE/php7.0-fpm.sock;
         include fastcgi_params;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}

행운을 빕니다


0

위의 답변 중 어느 것도 나를 위해 효과가 없었습니다 .PHP는 mysqli에 의존하는 페이지를 제외하고 200 응답 코드가있는 빈 페이지를 보내고 오류가 발생하지 않는 모든 것을 올바르게 렌더링했습니다. 내가 OS X에있을 때, 수정은 단순히

sudo port install php56-mysql

PHP-FPM과 nginx를 다시 시작합니다.

이전 Apache / PHP 설정에서 nginx로 마이그레이션하는 동안 php-mysql및 의 드라이버 버전이 일치하지 않는 것으로 나타났습니다 php-fpm.


0

나는 비슷한 문제가 있었다. nginx는 페이지를 반쯤 처리하고 멈추었다. 여기에 제안 된 해결책 중 어느 것도 나를 위해 일하지 않았습니다. nginx fastcgi 버퍼링을 변경하여 수정했습니다.

fastcgi_max_temp_file_size 0;

fastcgi_buffer_size 4K;
fastcgi_buffers 64 4k;

변경 후 내 location블록은 다음과 같습니다.

location ~ \.php$ {
    try_files $uri /index.php =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_max_temp_file_size 0;
    fastcgi_buffer_size 4K;
    fastcgi_buffers 64 4k;
    include fastcgi_params;
}

자세한 내용은 https://www.namhuy.net/3120/fix-nginx-upstream-response-buffered-temporary-file-error.html을 참조 하십시오.


0

빈 화면이 표시되면 다음 두 가지 이유 때문일 수 있습니다.

  1. 브라우저가 프레임 표시를 차단합니다. 일부 브라우저에서는 프레임이 안전하지 않은 것으로 간주됩니다. 이를 극복하기 위해 phpPgAdmin의 프레임리스 버전을

    http://-your-domain-name-/intro.php

  2. X-Frame-Options 용 Nginx에서 보안 기능을 활성화 했습니다. 비활성화하십시오.


0

이것은 내 문제를 해결했습니다.

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include snippets/fastcgi-php.conf;
    # With php5-fpm:
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
}

0

이것은 UBUNTU 18.04 + apache + php7.2에 대한 나의 호스트입니다.

server {
    listen 80;
    server_name test.test;
    root /var/www/html/{DIR_NAME}/public;
    location / {
        try_files $uri /index.php?$args;
    }
location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    }
}

마지막 줄은 다른 답변과 다릅니다.


2
200 개 이상의 투표로 허용 된 답변이 있습니다. 질문은 5 살입니다 .. 개인적으로이 답변이 질문에 많이 추가되는 것을
보지 못합니다

0

비슷한 오류가 있었지만 Nextcloud와 함께 사용했습니다. 이 방법으로 문제가 해결되지 않으면 Nginx 매뉴얼을 살펴보십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.