nginx pokazuje puste strony PHP

164

Skonfigurowałem serwer nginx z php5-fpm. Kiedy próbuję załadować witrynę, pojawia się pusta strona bez błędów. Strony HTML są obsługiwane dobrze, ale nie php. Próbowałem włączyć display_errors w php.ini, ale bez powodzenia. php5-fpm.log nie generuje żadnych błędów, podobnie jak 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;
    }
}

EDYTOWAĆ

oto mój dziennik błędów 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"
Mike Glaz
źródło
1
Najwyraźniej nginx nie wywołał php-fpm, czy sprawdziłeś dziennik błędów nginx?
adamsmith
Sprawdź moją aktualizację powyżej.
Mike Glaz
Błąd nginx connect() failed ... fastcgi://127.0.0.1:9000zaprzecza twojej konfiguracji nginx, przeładuj konf nginx?
adamsmith
Myślę, że to prawda.
Mike Glaz
2
Jestem naprawdę zaskoczony, że wydaje się, że dotyczy to tylko kilku tysięcy ludzi na planecie, ponieważ nawet domyślna konfiguracja nginx + php powoduje to.
Sliq

Odpowiedzi:

249

Dla porównania załączam mój locationblok do przechwytywania plików z .phprozszerzeniem:

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;
}

Sprawdź dokładnie /path/to/fastcgi-paramsi upewnij się, że jest obecny i czytelny dla użytkownika nginx.

Julian H. Lam
źródło
3
Twoje rozwiązanie było częścią tego. Druga część jest tutaj dzikoinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm
Mike Glaz
153
ostatnia linia z „SCRIPT_FILENAME”
załatwiła
3
dziękuję, ta ostatnia linia załatwiła sprawę (nie jest potrzebna, gdy używasz wersji 1.0 nginx, która jest dostarczana z Centos). Bardzo chciałbym zobaczyć dokumentację dotyczącą wszystkich tych ulepszeń.
Jorre
1
Nie ma za co, cieszę się, że po tych wszystkich latach nadal pomaga ludziom. Zwróć jednak uwagę na zaktualizowaną odpowiedź @ spacepile poniżej, która prawdopodobnie jest lepsza.
Julian H. Lam
2
Napotkałem ten sam problem i rozwiązaniem dla mnie było dodanie SCRIPT_FILENAME, jak opisano tutaj (bez ukośnika /). Ale co doprowadziło mnie do szału, to dlaczego właściwie muszę to zrobić? Mieliśmy kolejną instalację nginx (starszą niż 1.9) i tam ta linia nie była konieczna. Znalazłem ten nginx.com/resources/wiki/start/topics/examples/phpfcgi , a jeśli porównasz go z parametrami fastcgi_params, zobaczysz, że najprawdopodobniej nie jest to to samo, co wymieniona wersja online i zobaczysz, że NAZWA_PLIKU_SKRYPTU nie ma tam. Dlaczego tak jest? Idź figura ...
Daniel Dimitrov
342

zastąpić

include fastcgi_params;

z

include fastcgi.conf;

i usuń fastcgi_param SCRIPT_FILENAME ... w nginx.conf

spacepille
źródło
17
To naprawiło to dla mnie. Brak .confjednego dodatkowego parametru konfiguracyjnego w _params.
Malvineous
7
To (i oczywiście /etc/init.d/nginx restart) naprawiło to również dla mnie podczas testowania Debiana po nginxaktualizacji 10 września 2014 r.
severin
6
Naprawiło to również mnie po aktualizacji nginx do wersji 1.6.2 (aktualizacja z września 2014 r.). Uwielbiam aktualizacje, które losowo psują.
Mahn
30
Oto historia gry fastcgi_paramsvs fastcgi.conf: blog.martinfjordvald.com/2013/04/…
Levite
4
Ten kod nie działa - nie wiem dlaczego; Ten kod działa, nie wiem dlaczego. uratowałeś mi kilka godzin.
Alex
54

Miałem również ten problem i ostatecznie znalazłem tutaj rozwiązanie . Krótko mówiąc, musisz dodać następujący wiersz do pliku konfiguracyjnego nginx fastcgi (/ etc / nginx / fastcgi_params w Ubuntu 12.04)

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
Nieustanne Meiring
źródło
2
Dziękuję bardzo, to naprawiło to w Ubuntu 12.04 LTS.
Valentin Klinghammer
2
Naprawiono również dla mnie po aktualizacji Nginx 1.5.4 -> 1.7.4. Dziękuję bardzo!
trisweb
4
Pracował na Ubuntu 14.04.
rozkład jazdy
1
Naprawiono podczas aktualizacji z Debian Wheezy (7.8) do Jessie (8) iz Nginx 1.2.1-2.2 do 1.6.2-5. Ogromne dzięki.
William Turrell
1
Jak rozumiem, informuje fastcgi, gdzie są pliki, które ma służyć. PATH_TRANSLATED pobiera identyfikator URI żądania, a następnie „tłumaczy” go na miejsce, w którym rzeczywisty plik znajduje się na serwerze. Na przykład. PATH_TRANSLATED dla test.com/index.php może być /var/www/index.php
Constant Meiring
44

Wielu użytkowników wpada w ten wątek, spodziewając się znaleźć rozwiązanie dla pustych stron wyświetlanych podczas korzystania z nginx + php-fpm , a ja jestem jednym z nich. To jest podsumowanie tego, co zrobiłem po przeczytaniu wielu odpowiedzi tutaj oraz moich własnych dochodzeń (zaktualizowano do php7.2):

1) Otwórz /etc/php/7.2/fpm/pool.d/www.confi sprawdź wartość parametru listen.

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

2) Parametr listenpowinien być zgodny z fastcgi_passparametrem w pliku konfiguracyjnym witryny (tj /etc/nginx/sites-enabled/default.).

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

3) Sprawdź, czy plik faktycznie istnieje:

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

4) Jeśli nie istnieje, oznacza to, że php7.2-fpm nie działa, więc musisz go zrestartować:

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


W odniesieniu do locationsekcji w /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;
   }

Sprawdź, czy plik snippets/fastcgi-php.confistnieje w lokalizacji /etc/nginx/:

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

Ten plik zawiera listę definicji zmiennych wymaganych przez php7.2-fpm. Zmienne są definiowane bezpośrednio lub poprzez dołączenie oddzielnego pliku.

 include fastcgi.conf;

Ten plik znajduje się pod adresem /etc/nginx/fastcgi.confi wygląda następująco:

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

nginx zawiera dwa możliwe pliki parametrów: fastcgi_params i fastcgi.conf . Różnica między nimi to definicja zmiennej SCRIPT_FILENAME:

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

Krótko mówiąc, fastcgi.conf powinien zawsze działać. Jeśli z jakiegoś powodu używasz fastcgi_params , powinieneś zdefiniować 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;
}

Teraz przeładuj konfigurację nginx:

$ sudo nginx -s reload

I sprawdź, czy plik php jest wyświetlany poprawnie. Na przykład:

/var/www/html/test.php

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

Gdzie /var/www/htmljest ścieżka do katalogu głównego dokumentu.

Jeśli mimo wszystko nadal widzisz pusty plik, upewnij się, że php.inijest short_open_tagwłączony (jeśli testujesz stronę PHP z krótkimi tagami).

Diego Pino
źródło
1
Dzięki Diego! fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;Wreszcie załatwił sprawę.
niebezpieczeństwo89
Dołączenie fastcgi.conf pomogło naprawić to wszystko
Rytis Lukoševičius
1
niesamowita awaria! Brakowało mi konfiguracji SCRIPT_FILENAME, dzięki czemu działało
herval
1
kiedy dodałem SCRIPT_FILENAME do tej konfiguracji, znowu wszystko zawiodło z komunikatem „nie znaleziono pliku”
holms
A co z długą historią, dlaczego są dwie opcje, a jedna nie działa po wyjęciu z pudełka?
Ojciec chrzestny
24

Upewnij się, że masz to w / etc / nginx / fastcgi_params

fastcgi_param SCRIPT_FILENAME $ request_filename;

Kto wie, dlaczego jeszcze tego nie ma? Ilość czasu, którą musi to wspólnie zmarnować!

Tim
źródło
1
+1 Pozorna zaleta "fastcgi_param SCRIPT_FILENAME $ request_filename;" w przeciwieństwie do „$ document_root / $ fastcgi_script_name”, „$ request_filename” dostosowuje ścieżkę do dyrektywy „alias” Nginx. Zobacz: nginx.org/en/docs/http/ngx_http_core_module.html#variables , nginx.org/en/docs/http/ngx_http_core_module.html#alias i blog Martina Fjordvalda cytowany powyżej przez Levita ( blog.martinfjordvald.com/2013 / 04 /… ). W moim bloku lokalizacji rozwiązano problem z pustą stroną z php71-fpm i Nginx zainstalowanymi z Homebrew na El Capitan.
Slack Undertow
15

Napisałem krótki program w C, który zwraca zmienne środowiskowe przekazane z nginx do aplikacji fastCGI.

#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;
}

Zapisz to do pliku, np fcgi_debug.c

Aby skompilować go najpierw zainstalować gcci libfcgi-dev, a następnie uruchomić:

gcc -o fcgi_debug fcgi_debug.c -lfcgi

Aby go uruchomić, zainstaluj spawn-fcgi, a następnie uruchom:

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

Następnie zmień konfigurację nginx fcgi, aby wskazywała na program debugujący:

fastcgi_pass  127.0.0.1:3000;

Zrestartuj nginx, odśwież stronę i powinieneś zobaczyć wszystkie parametry, które pojawią się w przeglądarce, abyś mógł debugować! :-)

tu-Przywróć Monica-dor duh
źródło
1
Uwaga, potrzebujesz nagłówków i spawn-fcgi. W Debianie / Ubuntu możesz to zdobyć apt-get install spawn-fcgi libfcgi-dev.
pevik
8

Te wskazówki pomogły mi w instalacji Ubuntu 14.04 LTS,

Dodatkowo musiałem włączyć short_open_tagIN/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
CNSKnight
źródło
Naprawiono to przez DO droplet instalacji Ubuntu. Dzięki
Andrew
Zostało to naprawione po zainstalowaniu nginx 1.9.4
Ajeeb.KP
6

Dodaj to w /etc/nginx/conf.d/default.conf:

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
nomulex
źródło
2
Czy mógłbyś podać nieco więcej szczegółów na temat tego, na czym dokładnie polega problem OP i jak Twoja odpowiedź rozwiązuje problem OP?
wookie919
1
To rozwiązało ten sam problem na Ubuntu 15.04 z nginx 1.8.0 i php-fpm 5.6.4-4ubuntu6. Chciałbym wiedzieć, co to właściwie robi i dlaczego nie jest uwzględnione w domyślnym pliku konfiguracyjnym nginx, ale przynajmniej jestem szczęśliwy, że zakodowałem go teraz w pliku Dockerfile.
James Williams
/etc/nginx/fastcgi_paramsMyślę, że wpisanie wartości do pliku byłoby bardziej właściwe.
Arda
4

W przypadku, gdy ktoś ma ten problem, ale żadna z powyższych odpowiedzi nie rozwiązuje jego problemów, miałem ten sam problem i najtrudniej było go znaleźć, ponieważ moje pliki konfiguracyjne były poprawne, moje zadania ngnix i php-fpm działały dobrze, i żadne dzienniki błędów nie zawierały żadnych błędów.

Głupi błąd, ale nigdy nie sprawdziłem zmiennej Short Open Tag w moim pliku php.ini, która była ustawiona na short_open_tag = Off. Ponieważ moje pliki php były używane <?zamiast <?php, strony były puste. Krótki otwarty tag powinien być ustawiony naOnW moim przypadku .

Mam nadzieję, że to komuś pomoże.

McLovin
źródło
2

Przyczyną tego problemu jest to, że konfiguracje fastcgi w nginx nie działają zgodnie z wymaganiami, a na miejscu lub przetwarzaniu, odpowiadają one jako dane html. Istnieją dwa możliwe sposoby skonfigurowania nginx, aby uniknąć tego problemu.

  1. Metoda 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. Metoda 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;
    }

Obie metody będą działać poprawnie, możesz śmiało wziąć dowolną z nich. Wykonują prawie te same operacje, z niewielką różnicą.

Manish M Demblani
źródło
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;
}

Powodzenia

gounane
źródło
0

Żadna z powyższych odpowiedzi nie działała dla mnie - PHP poprawnie renderował wszystko oprócz stron, które opierały się na mysqli, dla których wysyłał pustą stronę z kodem odpowiedzi 200 i nie rzucał żadnych błędów. Ponieważ jestem na OS X, poprawka była prosta

sudo port install php56-mysql

a następnie ponowne uruchomienie PHP-FPM i nginx.

Migrowałem ze starszej konfiguracji Apache / PHP do nginx i nie zauważyłem niezgodności wersji w sterowniku dla php-mysqli php-fpm.

jczaplew
źródło
0

Miałem podobny problem, nginx przetwarzał stronę w połowie, a następnie się zatrzymywał. Żadne z proponowanych tutaj rozwiązań nie działało dla mnie. Naprawiłem to, zmieniając buforowanie nginx fastcgi:

fastcgi_max_temp_file_size 0;

fastcgi_buffer_size 4K;
fastcgi_buffers 64 4k;

Po zmianach mój locationblok wyglądał tak:

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;
}

Aby uzyskać szczegółowe informacje, zobacz https://www.namhuy.net/3120/fix-nginx-upstream-response-buffered-temporary-file-error.html

Mugoma J. Okomba
źródło
0

Jeśli pojawia się pusty ekran, może to być spowodowane 2 przyczynami:

  1. Przeglądarka blokująca wyświetlanie ramek. W niektórych przeglądarkach ramki są uważane za niebezpieczne. Aby temu zaradzić, możesz uruchomić bezramkową wersję phpPgAdmin przez

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

  2. Włączyłeś funkcję bezpieczeństwa w Nginx dla opcji X-Frame spróbuj ją wyłączyć.

Nahid Ali
źródło
0

To rozwiązało mój problem:

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;
}
Ruberandinda Patience
źródło
0

To jest mój vhost dla 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;
    }
}

Ostatnia linia odróżnia ją od pozostałych odpowiedzi.

Witek Bezgin
źródło
2
nie jest akceptowanym odpowiedź z ponad 200 głosami - pytanie ma 5 lat .. Ja osobiście nie widzę tę odpowiedź dodając wiele do pytania ..
treyBake
0

Miałem podobny błąd, ale w połączeniu z Nextcloud. Więc jeśli to nie zadziałało, spróbuj: Spójrz na podręcznik Nginx .

DeDenker
źródło