boş PHP sayfalarını gösteren nginx


164

Ben php5-fpm ile bir nginx sunucusu kurduk. Siteyi yüklemeye çalıştığımda hatasız boş bir sayfa alıyorum. Html sayfaları iyi hizmet ama php değil. Ben php.ini display_errors açmayı denedim ama hayır şans. php5-fpm.log herhangi bir hata üretmiyor ve ikisi de nginx değil.

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

DÜZENLE

İşte benim nginx hata günlüğü:

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
Görünüşe göre php-fpm nginx tarafından çağrılmadı, nginx hata günlüğünü kontrol ettiniz mi?
adamsmith

Yukarıdaki güncellememi kontrol et.
Mike Glaz

Nginx hatası connect() failed ... fastcgi://127.0.0.1:9000nginx conf ile çelişiyor, nginx conf yeniden?
adamsmith

Bence bu doğru.
Mike Glaz

2
Varsayılan nginx + php config bile bu şeye neden olduğu için, bunun sadece gezegendeki binlerce insanı etkilediğine gerçekten şaşırdım.
Sliq

Yanıtlar:


250

Referans olarak, uzantı locationile dosyaları yakalamak için bloğumu .phpekliyorum:

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

İki kez kontrol edin /path/to/fastcgi-paramsve nginx kullanıcısı tarafından mevcut ve okunabilir olduğundan emin olun.


3
sizin çözümünüz bunun bir parçasıydı. Diğer kısım burada wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm
Mike Glaz

154
'SCRIPT_FILENAME' ile son satır benim için hile yaptı :) teşekkürler
Stijn Leenknegt

3
teşekkür ederim, bu son satır hile yaptı (Centos ile birlikte gelen nginx'in 1.0 sürümünü kullanırken gerekli değildir). Tüm bu gelişmelerin etrafındaki belgeleri görmek isterim.
Jorre

1
Hoş geldiniz, bunca yıldan sonra hala insanlara yardım ettiğini bilmekten memnunum. Ancak, lütfen @ spacepile'nin güncellenmiş cevabını not edin, bu muhtemelen daha iyidir.
Julian H. Lam

2
Ben de aynı sorunla karşılaştı ve benim için çözüm burada açıklandığı gibi (eğik çizgi / olmadan) SCRIPT_FILENAME eklemek oldu. Ama beni çıldırtan şey neden bunu yapmam gerektiğiydi? Başka bir nginx kurulumumuz vardı (1.9'dan daha eski) ve orada bu hat gerekli değildi. Bu nginx.com/resources/wiki/start/topics/examples/phpfcgi buldum ve fastcgi_params ile karşılaştırırsanız, büyük olasılıkla listelenen çevrimiçi sürümle aynı olmadığını göreceksiniz ve SCRIPT_FILENAME orada değil. Nedenmiş? Git şekil ...
Daniel Dimitrov

342

değiştirmek

include fastcgi_params;

ile

include fastcgi.conf;

ve nginx.conf dosyasında fastcgi_param SCRIPT_FILENAME ... öğesini kaldırın


17
Bu benim için düzeltildi. .confEksik parametre ekstra bir yapılandırmaya sahip _params.
Malvineous

7
Bu (ve tabii ki /etc/init.d/nginx restart) nginx10 Eylül 2014'teki bir yükseltmeden sonra benim için Debian Testinde de düzeltildi .
severin

6
Bu, nginx'i 1.6.2'ye (Eylül 2014 güncellemesi) güncelledikten sonra da benim için düzeltti. İşleri rastgele bozan güncellemeleri sevmeliyim.
Mahn

30
fastcgi_paramsVs vs arka planında fastcgi.conf: blog.martinfjordvald.com/2013/04/…
Levite

4
Bu kod çalışmıyor - neden bilmiyorum; Bu kod çalışıyor, neden bilmiyorum. beni birkaç saat kurtardın.
Alex

54

Ayrıca bu sorunu vardı ve sonunda çözümü burada buldu . Kısacası, nginx fastcgi yapılandırma dosyanıza aşağıdaki satırı eklemeniz gerekir (Ubuntu 12.04'te / etc / nginx / fastcgi_params)

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
Çok teşekkür ederim, bu Ubuntu 12.04 LTS'de düzeltildi.
Valentin Klinghammer

2
Nginx 1.5.4 -> 1.7.4'ü yükselttikten sonra benim için de düzeltildi. Çok teşekkür ederim!
trisweb

4
Ubuntu 14.04 üzerinde çalıştı.
timetofly

1
Debian Wheezy'den (7.8) Jessie'ye (8) ve Nginx 1.2.1-2.2'den 1.6.2-5'e yükseltme yaparken düzeltildi. Çok teşekkürler.
William Turrell

1
Anladığım kadarıyla fastcgi'ye dosyaların nerede sunulması gerektiğini söyler. PATH_TRANSLATED istek URI'sini alır ve daha sonra bunu gerçek dosyanın sunucuda olduğu yere "çevirir". Örneğin. Test.com/index.php için PATH_TRANSLATED /var/www/index.php olabilir
Constant Meiring

44

Birçok kullanıcı nginx + php-fpm kullanırken boş sayfalar için görüntülenen bir çözüm bulmayı beklerken bu iş parçacığına düşüyor , ben de bunlardan biri. Bu, cevapların çoğunu ve kendi araştırmalarımı (php7.2'ye güncellendi) okuduktan sonra ne yaptığımın bir özeti:

1) /etc/php/7.2/fpm/pool.d/www.confParametrenin değerini açın ve kontrol edin listen.

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

2) Parametre , site yapılandırma dosyanızdaki (i, e listen:) fastcgi_passparametreyle eşleşmelidir /etc/nginx/sites-enabled/default.

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

3) Dosyanın gerçekten var olup olmadığını kontrol edin:

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

4) Eğer mevcut değilse, php7.2-fpm çalışmıyor demektir, bu yüzden yeniden başlatmanız gerekir:

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


Aşağıdaki locationbölümle ilgili olarak /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;
   }

Dosyanın snippets/fastcgi-php.confkonumda olduğunu kontrol edin /etc/nginx/:

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

Bu dosya php7.2-fpm için gereken değişken tanımlarının bir listesini içerir. Değişkenler doğrudan veya ayrı bir dosyanın dahil edilmesi yoluyla tanımlanır.

 include fastcgi.conf;

Bu dosya şurada bulunur /etc/nginx/fastcgi.confve şuna benzer:

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

nginx iki olası parametre dosyası içerir: fastcgi_params ve fastcgi.conf . Her ikisi arasındaki fark, değişkenin tanımıdır SCRIPT_FILENAME:

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

Kısa bir hikaye yapmak için fastcgi.conf her zaman çalışmalıdır. Herhangi bir nedenden dolayı ayarladığınız fastcgi_params kullanıyorsanız , şunları tanımlamanız gerekir 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;
}

Şimdi nginx yapılandırmasını yeniden yükleyin:

$ sudo nginx -s reload

Ve bir php dosyasının doğru görüntülendiğini kontrol edin. Örneğin:

/var/www/html/test.php

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

/var/www/htmlBelge köküne giden yol nerede .

Tüm bunlara rağmen, hala boş bir dosya görüyorsanız php.ini, short_open_tagetkinleştirdiğinizden emin olun (kısa etiketleri olan bir PHP sayfasını test ediyorsanız).


1
Teşekkürler Diego! fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;Sonunda hile yaptı.
danger89

Dahil fastcgi.conf hepsini düzeltmek için yardımcı oldu
Rytis Lukoševičius

1
harika arıza! SCRIPT_FILENAME yapılandırmasını kaçırıyordum, bu işe
yaradı

1
Bu yapılandırmaya
SCRIPT_FILENAME

Uzun hikaye ne olacak, neden iki tane içerme var ve biri kutudan çıkmıyor?
babası

24

Bunu / etc / nginx / fastcgi_params'da bulduğunuzdan emin olun

fastcgi_param SCRIPT_FILENAME $ istek_dosya adı;

Bunun neden orada olmadığını kim bilebilir? Bunun topluca harcanması gereken süre!


1
+1 "fastcgi_param SCRIPT_FILENAME $ request_filename;" "$ document_root / $ fastcgi_script_name" ifadesinin aksine, "$ request_filename", yolu Nginx'in "takma ad" yönergesine uyarlar. Bkz: nginx.org/en/docs/http/ngx_http_core_module.html#variables , nginx.org/en/docs/http/ngx_http_core_module.html#alias ve Martin Fjordvald'ın yukarıda Levit tarafından alıntılanan blogu ( blog.martinfjordvald.com13) / 04 /… ). Konum bloğumda, php71-fpm ve Nginx'in El Capitan'da Homebrew ile yüklendiği boş sayfa sorununu çözdü.
Slack Undertow

15

Nginx'ten fastCGI uygulamasına geçen ortam değişkenlerini döndüren kısa bir C programı yazdım.

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

Bunu bir dosyaya kaydedin, örn. fcgi_debug.c

Derlemek için önce yükleyin gccve libfcgi-devçalıştırın:

gcc -o fcgi_debug fcgi_debug.c -lfcgi

Çalıştırmak için yükleyin spawn-fcgive çalıştırın:

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

Ardından, nginx fcgi yapılandırmanızı hata ayıklama programına işaret edecek şekilde değiştirin:

fastcgi_pass  127.0.0.1:3000;

Nginx'i yeniden başlatın, sayfayı yenileyin ve hata ayıklamanız için tarayıcınızda tüm parametreleri görmelisiniz! :-)


1
Unutmayın, üstbilgilere ve spawn-fcgi'ye ihtiyacınız var. Debian / Ubuntu'da bunu alabilirsiniz apt-get install spawn-fcgi libfcgi-dev.
pevik

8

Bu ipuçları Ubuntu 14.04 LTS kurulumumda bana yardımcı oldu,

Ayrıca ben açmak için gerekli 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

Bu DO damlacık Ubuntu kurulumu ile düzeltildi. Teşekkürler
Andrew

Bu, nginx 1.9.4
Ajeeb.KP'yi

6

Bunu şuraya ekle /etc/nginx/conf.d/default.conf:

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
Lütfen OP'nin probleminin tam olarak ne olduğu ve cevabınızın OP'nin problemini nasıl çözdüğü hakkında biraz daha ayrıntılı bilgi verir misiniz?
wookie919

1
Bu benim için aynı sorunu nginx 1.8.0 ve php-fpm 5.6.4-4ubuntu6 ile Ubuntu 15.04'te çözdü. Bunun gerçekte ne yaptığını ve neden varsayılan nginx yapılandırma dosyasına dahil olmadığını bilmek isterim, ancak en azından şimdi bir Dockerfile'da kodladığım için mutluyum.
James Williams

Değeri /etc/nginx/fastcgi_paramsdosyaya koymak daha uygun olacağını düşünüyorum.
Arda

4

Herkes bu sorunu yaşıyor ama yukarıdaki cevapların hiçbiri kendi sorunlarını çözmek durumunda, ben aynı sorunu yaşıyorum ve benim yapılandırma dosyaları doğru, ngnix ve php-fpm işlerim düzgün çalışıyordu beri takip zor zaman vardı ve herhangi bir hata günlüğünden gelen hata oluşmadı.

Aptal hata ama asla ayarlanmış benim php.ini dosyasında Kısa Açık Etiket değişkeni kontrol etmedi short_open_tag = Off. Php dosyalarım <?yerine kullandığından <?php, sayfaları boş görünüyordu. OnBenim durumumda Kısa Açık Etiket ayarlanmış olmalıdır .

Umarım bu birine yardımcı olur.


2

Bu sorunun oluşmasının nedeni, nginx'teki fastcgi yapılandırmasının gerektiği gibi çalışmadığı ve yerinde veya işlenmediği için html verisi olarak yanıt vermesidir. Bu sorunu önlemek için nginx'inizi yapılandırmanın iki olası yolu vardır.

  1. Yöntem 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. Yöntem 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;
    }

Her iki yöntem de düzgün çalışır, devam edebilir ve bunlardan herhangi birini alabilirsiniz. Neredeyse aynı işlemleri çok az farkla gerçekleştiriyorlar.


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

İyi şanslar


0

Yukarıdaki cevapların hiçbiri benim için işe yaramadı - PHP, 200 yanıt koduyla boş bir sayfa gönderdiği ve herhangi bir hata atmadığı mysqli'ye dayanan sayfalar dışında her şeyi düzgün bir şekilde oluşturuyordu. OS X'te olduğum için, düzeltme basitti

sudo port install php56-mysql

ardından PHP-FPM ve nginx yeniden başlatıldı.

Ben nginx için eski bir Apache / PHP kurulumundan göç ve sürücüsünün sürüm uyuşmazlığı fark edemedi edildi php-mysqlve php-fpm.


0

Benzer bir sorun yaşadım, nginx bir sayfayı yarıya indirip durdu. Burada önerilen çözümlerin hiçbiri benim için çalışmıyor. Ben nginx fastcgi tamponlama değiştirerek düzeltildi:

fastcgi_max_temp_file_size 0;

fastcgi_buffer_size 4K;
fastcgi_buffers 64 4k;

Değişikliklerden sonra bloğum şöyle locationgörünüyordu:

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

Ayrıntılar için bkz. Https://www.namhuy.net/3120/fix-nginx-upstream-response-buffered-temporary-file-error.html


0

Boş bir ekran alıyorsanız, bunun 2 nedeni olabilir:

  1. Çerçevelerin görüntülenmesini engelleyen tarayıcı. Bazı tarayıcılarda çerçeveler güvensiz olarak kabul edilir. Bunun üstesinden gelmek için phpPgAdmin'in çerçevesiz sürümünü başlatabilirsiniz.

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

  2. X-Frame-Options için Nginx'te bir güvenlik özelliğini etkinleştirdiniz. Devre dışı bırakmayı deneyin.


0

Bu sorunumu çözdü:

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

Bu UBUNTU 18.04 + apache + php7.2 için benim hayaletim

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

Son satır diğer cevaplardan farklı kılar.


2
200+ oy ile kabul edilen bir cevap var - soru 5 yaşında .. Ben şahsen bu cevabı soruya çok şey ekleyerek görmüyorum ..
treyBake

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.