nginx แสดงหน้า PHP ว่างเปล่า


164

ฉันตั้งค่าเซิร์ฟเวอร์ nginx ด้วย php5-fpm เมื่อฉันพยายามโหลดเว็บไซต์ฉันได้รับหน้าว่างโดยไม่มีข้อผิดพลาด หน้า Html ให้บริการที่ดี แต่ไม่ใช่ php ฉันพยายามเปิด display_errors ใน php.ini แต่ไม่มีโชค 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:9000ขัดแย้งกับ nginx conf ของคุณ, โหลด nginx conf อีกครั้ง?
adamsmith

ฉันคิดว่ามันถูกต้อง
Mike Glaz

2
ฉันประหลาดใจจริง ๆ ที่ว่าสิ่งนี้ดูเหมือนจะส่งผลกระทบต่อคนหลายพันคนบนโลกใบนี้เท่านั้นแม้กระทั่งการกำหนดค่าเริ่มต้น nginx + php ที่ทำให้เกิดสิ่งนี้
Sliq

คำตอบ:


250

สำหรับการอ้างอิงฉันกำลังแนบ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

154
บรรทัดสุดท้ายที่มี 'SCRIPT_FILENAME' ได้หลอกลวงสำหรับฉัน :) ขอบคุณ
Stijn Leenknegt

3
ขอบคุณบรรทัดสุดท้ายทำเคล็ดลับ (ไม่จำเป็นเมื่อใช้ nginx เวอร์ชัน 1.0 ที่มาพร้อมกับ Centos) ฉันชอบที่จะดูเอกสารเกี่ยวกับการปรับปรุงทั้งหมดนี้
Jorre

1
ยินดีต้อนรับคุณดีใจที่รู้ว่ามันยังคงช่วยเหลือผู้คนหลังจากหลายปีที่ผ่านมา อย่างไรก็ตามโปรดทราบว่าคำตอบที่อัปเดตของ @ spacepile ด้านล่างซึ่งน่าจะดีกว่า
Julian H. Lam

2
ฉันพบปัญหาเดียวกันและวิธีแก้ปัญหาสำหรับฉันคือเพิ่ม SCRIPT_FILENAME ตามที่อธิบายไว้ที่นี่ (ไม่มีเครื่องหมายทับ /) แต่สิ่งที่ทำให้ฉันเป็นบ้าคือเหตุผลที่ฉันต้องทำสิ่งนี้จริง ๆ ? เรามีการติดตั้ง nginx อื่น (เก่ากว่า 1.9) และมีบรรทัดนี้ไม่จำเป็น ฉันพบnginx.com/resources/wiki/start/topics/examples/phpfcgiนี้และถ้าคุณเปรียบเทียบกับ fastcgi_params คุณจะเห็นว่ามันอาจจะไม่เหมือนกับเวอร์ชั่นออนไลน์ที่ระบุไว้และคุณจะเห็น SCRIPT_FILENAME ไม่ได้อยู่ที่นั่น ทำไมเป็นอย่างนั้น? ไปคิด ...
แดเนียลดิมิทรอฟ

342

แทนที่

include fastcgi_params;

กับ

include fastcgi.conf;

และลบ fastcgi_param SCRIPT_FILENAME ... ใน nginx.conf


17
สิ่งนี้แก้ไขได้สำหรับฉัน มีการกำหนดค่าพารามิเตอร์พิเศษหนึ่งหายไปจาก.conf _params
Malvineous

7
(และแน่นอน/etc/init.d/nginx restart) นี้ยังแก้ไขให้กับฉันในการทดสอบ Debian หลังจากnginxอัปเกรดเมื่อวันที่ 10 กันยายน 2014
Severin

6
สิ่งนี้แก้ไขให้ฉันเช่นกันหลังจากอัปเดต nginx เป็น 1.6.2 (อัปเดตกันยายน 2557) ต้องปรับปรุงความรักที่ทำลายสิ่งต่าง ๆ แบบสุ่ม
Mahn

30
นี่คือ backstory ของfastcgi_paramsvs fastcgi.conf: blog.martinfjordvald.com/2013/04/…
Levite

4
รหัสนี้ใช้งานไม่ได้ - ฉันไม่รู้ว่าทำไม; รหัสนี้ใช้งานได้ฉันไม่รู้ว่าทำไม คุณช่วยฉันหลายชั่วโมง
อเล็กซ์

54

นอกจากนี้ยังมีปัญหานี้และในที่สุดก็พบวิธีการที่นี่ กล่าวโดยย่อคุณต้องเพิ่มบรรทัดต่อไปนี้ในไฟล์กำหนดค่า nginx fastcgi (/ etc / nginx / fastcgi_params ใน Ubuntu 12.04)

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
ทำงานบน Ubuntu 14.04
ตาราง

1
แก้ไขเมื่ออัปเกรดจาก Debian Wheezy (7.8) เป็น Jessie (8) และจาก Nginx 1.2.1-2.2 เป็น 1.6.2-5 ขอบคุณมาก
William Turrell

1
อย่างที่ฉันเข้าใจมันบอก fastcgi ว่าไฟล์อยู่ตรงไหนที่มันต้องให้บริการ PATH_TRANSLATED ใช้ URI คำขอจากนั้น "แปล" เข้าไปในตำแหน่งที่ไฟล์จริงอยู่บนเซิร์ฟเวอร์ เช่น. PATH_TRANSLATED สำหรับ test.com/index.php อาจเป็น / var/www/index.php
คงที่ Meiring

44

ผู้ใช้หลายคนตกอยู่ในเธรดนี้ซึ่งคาดว่าจะพบวิธีแก้ไขสำหรับหน้าเปล่าที่กำลังแสดงขณะใช้nginx + php-fpmฉันเป็นหนึ่งในนั้น นี่คือบทสรุปของสิ่งที่ฉันทำหลังจากอ่านคำตอบมากมายที่นี่รวมทั้งการสืบสวนของฉันเอง (อัปเดตเป็น php7.2):

1) เปิดและตรวจสอบค่าของพารามิเตอร์/etc/php/7.2/fpm/pool.d/www.conflisten

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

2) พารามิเตอร์listenควรจะตรงกับfastcgi_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_paramsและfastcgi.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 ดูที่: nginx.org/en/docs/http/ngx_http_core_module.html#variables , nginx.org/en/docs/http/ngx_http_core_module.html#aliasและบล็อกของ Martin Fjordvald / 04 / … ) ในบล็อกตำแหน่งของฉันมันแก้ไขปัญหาหน้าว่างด้วย php71-fpm และ Nginx ติดตั้งด้วย Homebrew ใน El Capitan
Slack Undertow

15

ฉันเขียนโปรแกรม C สั้น ๆ ที่คืนค่าตัวแปรสภาพแวดล้อมที่ส่งผ่านจาก nginx ไปยังแอปพลิเคชัน 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;
}

บันทึกสิ่งนี้ลงในไฟล์เช่น 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
หมายเหตุคุณต้องมีส่วนหัวและวางไข่ -ccgi บน Debian / Ubuntu คุณสามารถรับมัน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 หยด 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
วิธีนี้แก้ไขปัญหาเดียวกันสำหรับฉันใน Ubuntu 15.04 ด้วย nginx 1.8.0 และ php-fpm 5.6.4-4ubuntu6 ฉันชอบที่จะรู้ว่าสิ่งนี้กำลังทำอะไรอยู่และทำไมมันจึงไม่รวมอยู่ในไฟล์กำหนดค่าเริ่มต้นของ nginx แต่อย่างน้อยฉันก็มีความสุขที่ตอนนี้ฉันได้ประมวลมันใน Dockerfile แล้ว
James Williams

/etc/nginx/fastcgi_paramsฉันคิดว่าการใส่ค่าในไฟล์จะเหมาะสมกว่า
Arda

4

ในกรณีที่ใครมีปัญหานี้ แต่ไม่มีคำตอบข้างต้นแก้ปัญหาของพวกเขาฉันมีปัญหาเดียวกันนี้และมีเวลาที่ยากที่สุดในการติดตามเนื่องจากไฟล์ config ของฉันถูกต้องงาน ngnix และ php-fpm ของฉันทำงานได้ดีและ ไม่มีข้อผิดพลาดเกิดขึ้นจากบันทึกข้อผิดพลาด

ความผิดพลาดโง่ แต่ฉันไม่เคยตรวจสอบเปิด Short ตัวแปรแท็กในไฟล์ php.ini short_open_tag = Offของฉันที่ถูกกำหนดให้ เนื่องจากไฟล์ php ของฉันใช้<?แทน<?phpหน้าเว็บจึงแสดงเป็นหน้าว่าง ควรตั้งค่า Open Tag สั้นเป็นOnในกรณีของฉัน

หวังว่านี่จะช่วยใครซักคน


2

เหตุผลที่ปัญหานี้เกิดขึ้นเนื่องจากการกำหนดค่า fastcgi ใน nginx ไม่ทำงานตามที่ต้องการและในสถานที่หรือการประมวลผลพวกเขาตอบสนองเป็นข้อมูล 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-mysqlphp-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

หากคุณได้รับหน้าจอว่างเปล่านั่นอาจเป็นเพราะ 2 สาเหตุ:

  1. เบราว์เซอร์ปิดกั้นการแสดงเฟรม ในบางเบราว์เซอร์เฟรมจะถือว่าไม่ปลอดภัย หากต้องการเอาชนะสิ่งนี้คุณสามารถเปิดใช้ phpPgAdmin รุ่นที่ไม่มีที่ติได้

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

  2. คุณเปิดใช้งานคุณลักษณะความปลอดภัยใน Nginx สำหรับX-Frame-Optionsลองปิดการใช้งาน



0

นี่คือ vhost ของฉันสำหรับ 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 ปี .. โดยส่วนตัวฉันไม่เห็นคำตอบนี้เพิ่มคำถามมากมาย ..
treyBake

0

ฉันมีข้อผิดพลาดคล้ายกัน แต่ใช้ร่วมกับ Nextcloud ดังนั้นในกรณีนี้ไม่ได้ทำงานลอง: มีดูที่คู่มือ Nginx

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.