nginx menampilkan halaman PHP kosong

164

Saya telah menyiapkan server nginx dengan php5-fpm. Ketika saya mencoba memuat situs saya mendapatkan halaman kosong tanpa kesalahan. Halaman html disajikan dengan baik tetapi bukan php. Saya mencoba menyalakan display_errors di php.ini tetapi tidak berhasil. php5-fpm.log tidak menghasilkan kesalahan dan juga 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;
    }
}

EDIT

inilah log kesalahan nginx saya:

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
sumber
1
Rupanya php-fpm tidak dipanggil oleh nginx, sudahkah Anda memeriksa log kesalahan nginx?
adamsmith
Periksa pembaruan saya di atas.
Mike Glaz
Kesalahan nginx connect() failed ... fastcgi://127.0.0.1:9000bertentangan dengan nginx conf Anda, muat ulang nginx conf?
adamsmith
Saya pikir ini benar.
Mike Glaz
2
Saya benar-benar terkejut bahwa ini tampaknya hanya mempengaruhi beberapa ribu orang di planet ini, karena bahkan konfigurasi default nginx + php menyebabkan hal ini.
Sliq

Jawaban:

250

Sebagai referensi, saya melampirkan locationblokir saya untuk menangkap file dengan .phpekstensi:

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

Periksa ulang /path/to/fastcgi-params, dan pastikan itu ada dan dapat dibaca oleh pengguna nginx.

Julian H. Lam
sumber
3
solusi Anda adalah bagian dari itu. Bagian lainnya ada di sini di wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm
Mike Glaz
154
baris terakhir dengan 'SCRIPT_FILENAME' membantu saya :) terima kasih
Stijn Leenknegt
3
terima kasih, baris terakhir berhasil (tidak diperlukan saat menggunakan versi 1.0 nginx yang dikirimkan bersama Centos). Saya ingin melihat dokumentasi seputar semua peningkatan ini.
Jorre
1
Terima kasih, senang mengetahui ini masih membantu orang setelah bertahun-tahun. Namun, harap perhatikan jawaban terupdate @ spacepile di bawah ini, yang mungkin lebih baik.
Julian H. Lam
2
Saya mengalami masalah yang sama dan solusi bagi saya adalah menambahkan SCRIPT_FILENAME seperti yang dijelaskan di sini (tanpa garis miring /). Tapi apa yang membuatku gila adalah mengapa aku benar-benar perlu melakukan ini? Kami memiliki instalasi nginx lain (lebih tua dari 1,9) dan di sana baris ini tidak diperlukan. Saya menemukan ini nginx.com/resources/wiki/start/topics/examples/phpfcgi , dan jika Anda membandingkannya dengan fastcgi_params Anda, Anda akan melihat bahwa kemungkinan besar itu tidak sama dengan versi online yang terdaftar dan Anda akan melihat bahwa SCRIPT_FILENAME tidak ada di sana. Kenapa begitu? Go figure ...
Daniel Dimitrov
342

menggantikan

include fastcgi_params;

dengan

include fastcgi.conf;

dan hapus fastcgi_param SCRIPT_FILENAME ... di nginx.conf

spacepille
sumber
17
Ini memperbaikinya untuk saya. Ada .confsatu parameter konfigurasi tambahan yang hilang _params.
Malvineous
7
Ini (dan, tentu saja, /etc/init.d/nginx restart) juga memperbaikinya untuk saya di Pengujian Debian setelah nginxpeningkatan pada 10 September 2014.
severin
6
Ini memperbaikinya bagi saya juga setelah memperbarui nginx ke 1.6.2 (pembaruan September 2014). Harus menyukai pembaruan yang memecahkan banyak hal secara acak.
Mahn
30
Inilah latar belakang fastcgi_paramsvs fastcgi.conf: blog.martinfjordvald.com/2013/04/…
Levite
4
Kode ini tidak berfungsi - saya tidak tahu mengapa; Kode ini berfungsi, saya tidak tahu mengapa. Anda menyelamatkan saya beberapa jam.
Alex
54

Juga memiliki masalah ini dan akhirnya menemukan solusinya di sini . Singkatnya, Anda perlu menambahkan baris berikut ke file konfigurasi nginx fastcgi Anda (/ etc / nginx / fastcgi_params di Ubuntu 12.04)

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
Meiring Konstan
sumber
2
Terima kasih banyak, ini memperbaikinya di Ubuntu 12.04 LTS.
Valentin Klinghammer
2
Tetap untuk saya juga setelah memutakhirkan nginx 1.5.4 -> 1.7.4. Terima kasih banyak!
trisweb
4
Bekerja di Ubuntu 14.04.
tepat waktu
1
Diperbaiki ketika memutakhirkan dari Debian Wheezy (7.8) ke Jessie (8) dan dari Nginx 1.2.1-2.2 ke 1.6.2-5. Terima kasih banyak.
William Turrell
1
Seperti yang saya mengerti, ini memberitahu fastcgi di mana file-file itu perlu dilayani. PATH_TRANSLATED menerima permintaan URI, dan kemudian "menerjemahkannya" ke tempat file aktual berada di server. Misalnya. PATH_TRANSLATED untuk test.com/index.php mungkin /var/www/index.php
Constant Meiring
44

Banyak pengguna yang berada di utas ini berharap menemukan solusi untuk halaman kosong yang ditampilkan saat menggunakan nginx + php-fpm , saya menjadi salah satunya. Ini adalah rekap dari apa yang akhirnya saya lakukan setelah membaca banyak jawaban di sini ditambah penyelidikan saya sendiri (diperbarui ke php7.2):

1) Buka /etc/php/7.2/fpm/pool.d/www.confdan periksa nilai parameter listen.

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

2) Parameter listenharus sesuai dengan fastcgi_passparameter dalam file konfigurasi situs Anda (i, e:) /etc/nginx/sites-enabled/default.

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

3) Periksa file yang sebenarnya ada:

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

4) Jika tidak ada itu berarti php7.2-fpm tidak berjalan, jadi Anda perlu me-restart itu:

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


Berkenaan dengan locationbagian dalam /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;
   }

Periksa file snippets/fastcgi-php.confada di lokasi /etc/nginx/:

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

File ini berisi daftar definisi variabel yang diperlukan oleh php7.2-fpm. Variabel didefinisikan secara langsung atau melalui penyertaan file yang terpisah.

 include fastcgi.conf;

File ini terletak di /etc/nginx/fastcgi.confdan sepertinya:

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

nginx mencakup dua file parameter yang mungkin: fastcgi_params dan fastcgi.conf . Perbedaan antara keduanya adalah definisi variabel SCRIPT_FILENAME:

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

Untuk mempersingkat cerita, fastcgi.conf harus selalu berfungsi. Jika karena alasan tertentu Anda mengatur menggunakan fastcgi_params , Anda harus mendefinisikan 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;
}

Sekarang memuat ulang konfigurasi nginx:

$ sudo nginx -s reload

Dan periksa file php ditampilkan dengan benar. Misalnya:

/var/www/html/test.php

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

Di mana /var/www/htmlpath ke root dokumen.

Jika terlepas dari semua itu, Anda masih melihat file kosong, pastikan Anda php.initelah short_open_tagmengaktifkannya (jika Anda menguji halaman PHP dengan tag pendek).

Diego Pino
sumber
1
Diego terima kasih! fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;Akhirnya berhasil.
hazard89
Sertakan fastcgi.conf membantu memperbaiki semuanya
Rytis Lukoševičius
1
kerusakan luar biasa! Saya melewatkan konfigurasi SCRIPT_FILENAME, ini membuatnya berfungsi
herval
1
ketika saya telah menambahkan SCRIPT_FILENAME ke konfigurasi itu, sekali lagi semuanya gagal dengan "file tidak ditemukan"
holms
Bagaimana dengan ceritanya yang panjang, mengapa ada dua termasuk dan satu tidak berhasil?
The Godfather
24

Pastikan Anda memilikinya di / etc / nginx / fastcgi_params

fastcgi_param SCRIPT_FILENAME $ request_filename;

Siapa yang tahu mengapa ini belum ada? Jumlah waktu yang harus dihabiskan bersama ini!

Tim
sumber
1
+1 Kelihatannya keuntungan dari "fastcgi_param SCRIPT_FILENAME $ request_filename;" tidak seperti "$ document_root / $ fastcgi_script_name", "$ request_filename" mengadaptasi jalur ke arahan "alias" Nginx. Lihat: nginx.org/en/docs/http/ngx_http_core_module.html#variables , nginx.org/en/docs/http/ngx_http_core_module.html#alias , dan blog Martin Fjordvald dikutip oleh Levit di atas ( blog.martinfjorddid.com / 04 / ... ). Di blok lokasi saya, ini menyelesaikan masalah halaman kosong dengan php71-fpm dan Nginx diinstal dengan Homebrew di El Capitan.
Slack Undertow
15

Saya menulis program C pendek yang mengembalikan variabel lingkungan yang dilewatkan dari nginx ke aplikasi 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;
}

Simpan ini ke file, mis fcgi_debug.c

Untuk mengkompilasinya, instal terlebih dahulu gccdan libfcgi-dev, kemudian jalankan:

gcc -o fcgi_debug fcgi_debug.c -lfcgi

Untuk menjalankannya, instal spawn-fcgi, lalu jalankan:

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

Kemudian, ubah konfigurasi nginx fcgi Anda untuk menunjuk ke program debug:

fastcgi_pass  127.0.0.1:3000;

Mulai ulang nginx, segarkan halaman, dan Anda akan melihat semua parameter muncul di browser Anda untuk Anda debug! :-)

tu-Reinstate Monica-dor duh
sumber
1
Catatan, Anda perlu tajuk dan spawn-fcgi. Di Debian / Ubuntu Anda bisa mendapatkannya apt-get install spawn-fcgi libfcgi-dev.
pevik
8

Petunjuk ini membantu saya menginstal Ubuntu 14.04 LTS saya,

Selain itu saya harus menyalakan 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
sumber
Ini diperbaiki oleh DO droplet Ubuntu instal. Terima kasih
Andrew
Ini diperbaiki untuk saya setelah menginstal nginx
1.9.4
6

Tambahkan ini di /etc/nginx/conf.d/default.conf:

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
nomulex
sumber
2
Bisakah Anda memberikan sedikit lebih detail tentang apa sebenarnya masalah OP dan bagaimana jawaban Anda memecahkan masalah OP?
wookie919
1
Ini memecahkan masalah yang sama bagi saya di Ubuntu 15.04 dengan nginx 1.8.0 dan php-fpm 5.6.4-4ubuntu6. Saya ingin tahu apa yang sebenarnya dilakukan dan mengapa tidak disertakan dengan file konfigurasi nginx default, tapi saya setidaknya senang bahwa sekarang saya sudah mengkodifikasinya di Dockerfile.
James Williams
Menempatkan nilai dalam /etc/nginx/fastcgi_paramsfile akan lebih tepat menurut saya.
Arda
4

Jika ada yang mengalami masalah ini tetapi tidak ada jawaban di atas yang menyelesaikan masalah mereka, saya mengalami masalah yang sama dan mengalami kesulitan melacaknya karena file konfigurasi saya benar, pekerjaan ngnix dan php-fpm saya berjalan dengan baik, dan tidak ada kesalahan yang datang melalui log kesalahan apa pun.

Kesalahan bodoh tapi saya tidak pernah memeriksa variabel Tag Buka Pendek di file php.ini saya yang diatur ke short_open_tag = Off. Karena file php saya menggunakan <?bukan <?php, halaman muncul kosong. Tag Terbuka Pendek seharusnya sudah diatur Ondalam kasus saya.

Semoga ini bisa membantu seseorang.

McLovin
sumber
2

Alasan masalah ini terjadi adalah karena konfigurasi fastcgi di nginx tidak berfungsi seperti yang disyaratkan dan di tempat atau pemrosesan, mereka merespons sebagai data html. Ada dua cara yang memungkinkan Anda dapat mengkonfigurasi nginx Anda untuk menghindari masalah ini.

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

Kedua metode akan bekerja dengan baik, Anda dapat melanjutkan dan mengambil salah satu dari mereka. Mereka hampir melakukan operasi yang sama dengan sedikit perbedaan.

Manish M Demblani
sumber
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;
}

Semoga berhasil

Gounane
sumber
0

Tidak ada jawaban di atas yang berfungsi untuk saya - PHP dengan benar merender semuanya kecuali halaman yang mengandalkan mysqli, yang mengirimkan halaman kosong dengan 200 kode respons dan tidak melontarkan kesalahan apa pun. Karena saya menggunakan OS X, perbaikannya sederhana

sudo port install php56-mysql

diikuti oleh restart PHP-FPM dan nginx.

Saya bermigrasi dari pengaturan Apache / PHP yang lebih lama ke nginx, dan gagal melihat ketidakcocokan versi pada driver untuk php-mysqldan php-fpm.

jczaplew
sumber
0

Saya memiliki masalah yang sama, nginx sedang memproses setengah halaman kemudian berhenti. Tidak ada solusi yang disarankan di sini yang berfungsi untuk saya. Saya memperbaikinya dengan mengubah buffering nginx fastcgi:

fastcgi_max_temp_file_size 0;

fastcgi_buffer_size 4K;
fastcgi_buffers 64 4k;

Setelah perubahan, locationblok saya terlihat seperti:

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

Untuk perinciannya, lihat https://www.namhuy.net/3120/fix-nginx-upstream-response-buffered-tentara-file-error.html

Mugoma J. Okomba
sumber
0

Jika Anda mendapatkan layar kosong, itu mungkin karena 2 alasan:

  1. Browser memblokir Frames agar tidak ditampilkan. Di beberapa browser, frame dianggap tidak aman. Untuk mengatasinya, Anda dapat meluncurkan versi tanpa bingkai dari phpPgAdmin

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

  2. Anda telah mengaktifkan fitur keamanan di Nginx untuk X-Frame-Options, coba nonaktifkan.

Nahid Ali
sumber
0

Ini menyelesaikan masalah saya:

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 Sabar
sumber
0

Ini adalah vhost saya untuk 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;
    }
}

Baris terakhir membuatnya berbeda dari jawaban lainnya.

Witek Bezgin
sumber
2
ada jawaban yang diterima dengan 200+ suara - pertanyaannya adalah 5 tahun .. Saya pribadi tidak melihat jawaban ini menambah banyak pertanyaan ..
treyBake
0

Saya memiliki kesalahan yang sama, tetapi dalam kombinasi dengan Nextcloud. Jadi jika ini tidak berhasil, coba: Lihat manual Nginx .

DeDenker
sumber