nginx hiển thị các trang PHP trống


164

Tôi đã thiết lập một máy chủ nginx với php5-fpm. Khi tôi cố tải trang web, tôi nhận được một trang trống không có lỗi. Các trang Html được phục vụ tốt nhưng không phải php. Tôi đã thử bật display_errors trong php.ini nhưng không gặp may. php5-fpm.log không tạo ra bất kỳ lỗi nào và nginx cũng không.

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

BIÊN TẬP

đây là nhật ký lỗi nginx của tôi:

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
Rõ ràng php-fpm không được gọi bởi nginx, bạn đã kiểm tra nhật ký lỗi của nginx chưa?
adamsmith

Kiểm tra cập nhật của tôi ở trên.
Mike Glaz

Lỗi nginx connect() failed ... fastcgi://127.0.0.1:9000mâu thuẫn với nginx conf của bạn, tải lại nginx conf?
adamsmith

Tôi nghi răng đây la đung.
Mike Glaz

2
Tôi thực sự ngạc nhiên khi điều này dường như chỉ ảnh hưởng đến hàng ngàn người trên hành tinh, vì ngay cả cấu hình nginx + php mặc định cũng gây ra điều này.
Sliq

Câu trả lời:


250

Để tham khảo, tôi đang đính kèm location khối để bắt các tệp có .phpphần mở rộng:

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ểm tra kỹ /path/to/fastcgi-paramsvà đảm bảo rằng nó có mặt và có thể đọc được bởi người dùng nginx.


3
giải pháp của bạn là một phần của nó. Các phần khác là ở đây wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm
Mike Glaz

154
dòng cuối cùng với 'SCRIPT_FILENAME' đã lừa tôi :) cảm ơn
Stijn Leenknegt

3
cảm ơn bạn, dòng cuối cùng đã thực hiện thủ thuật (không cần thiết khi sử dụng phiên bản nginx 1.0 được vận chuyển với Centos). Tôi muốn xem các tài liệu xung quanh tất cả các cải thiện này.
Jorre

1
Bạn được chào đón, vui mừng khi biết nó vẫn giúp mọi người sau ngần ấy năm. Tuy nhiên, xin lưu ý câu trả lời cập nhật của @ spacepile bên dưới, có lẽ tốt hơn.
Julian H. Lam

2
Tôi gặp vấn đề tương tự và giải pháp cho tôi là thêm SCRIPT_FILENAME như được mô tả ở đây (không có dấu gạch chéo /). Nhưng điều khiến tôi phát điên là tại sao tôi thực sự cần phải làm điều này? Chúng tôi đã có một cài đặt nginx khác (cũ hơn 1.9) và dòng này không cần thiết. Tôi đã tìm thấy nginx.com/resource/wiki/start/topics/examples/phpfcgi này và nếu bạn so sánh nó với fastcgi_params của bạn, bạn sẽ thấy rằng rất có thể nó không giống với phiên bản trực tuyến được liệt kê và bạn sẽ thấy SCRIPT_FILENAME không có trong đó Tại sao vậy Đi nào ...
Daniel Dimitrov

342

thay thế

include fastcgi_params;

với

include fastcgi.conf;

và xóa fastcgi_param SCRIPT_FILENAME ... trong nginx.conf


17
CÁi này đã sửa nó giúp tôi. Có .confmột tham số cấu hình bổ sung bị thiếu _params.
Malvineous

7
Điều này (và, tất nhiên, /etc/init.d/nginx restart) cũng đã sửa nó cho tôi trong Thử nghiệm Debian sau khi nginxnâng cấp vào ngày 10 tháng 9 năm 2014.
severin

6
Điều này cũng đã sửa nó cho tôi sau khi cập nhật nginx lên 1.6.2 (bản cập nhật tháng 9 năm 2014). Yêu phải cập nhật mà phá vỡ mọi thứ một cách ngẫu nhiên.
Mahn

30
Đây là nền tảng của fastcgi_paramsvs fastcgi.conf: blog.martinfjordvald.com/2013/04/ trên
Levite

4
Mã này không hoạt động - tôi không biết tại sao; Mã này hoạt động, tôi không biết tại sao. bạn đã cứu tôi vài giờ.
Alex

54

Cũng có vấn đề này và cuối cùng tìm thấy giải pháp ở đây . Nói tóm lại, bạn cần thêm dòng sau vào tệp cấu hình nginx fastcgi của bạn (/ etc / nginx / fastcgi_params trong Ubuntu 12.04)

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
Cảm ơn bạn rất nhiều, điều này đã sửa nó trên Ubuntu 12.04 LTS.
Valentin Klinghammer

2
Đã sửa lỗi cho tôi sau khi nâng cấp nginx 1.5.4 -> 1.7.4. Cảm ơn bạn rất nhiều!
trisweb

4
Đã làm việc trên Ubuntu 14.04.
gian biểu

1
Đã sửa lỗi khi nâng cấp từ Debian Wheezy (7.8) lên Jessie (8) và từ Nginx 1.2.1-2.2 lên 1.6.2-5. Rất cảm ơn.
William Turrell

1
Theo tôi hiểu, nó cho fastcgi biết các tập tin cần phục vụ ở đâu. PATH_TRANSLATED nhận URI yêu cầu và sau đó "dịch" nó vào nơi tệp thực sự nằm trên máy chủ. Ví dụ. PATH_TRANSLATED cho test.com/index.php có thể là /var/www/index.php
tục khai thác

44

Nhiều người dùng rơi vào chủ đề này mong muốn tìm ra giải pháp cho các trang trống được hiển thị trong khi sử dụng nginx + php-fpm , tôi là một trong số họ. Đây là bản tóm tắt những gì tôi đã làm sau khi đọc nhiều câu trả lời ở đây cộng với các điều tra của riêng tôi (được cập nhật lên php7.2):

1) Mở /etc/php/7.2/fpm/pool.d/www.confvà kiểm tra giá trị của tham số listen.

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

2) Tham số listenphải khớp với fastcgi_passtham số trong tệp cấu hình trang web của bạn (i, e /etc/nginx/sites-enabled/default:).

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

3) Kiểm tra tập tin thực sự tồn tại:

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

4) Nếu nó không tồn tại có nghĩa là php7.2-fpm không chạy, vì vậy bạn cần khởi động lại nó:

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


Liên quan đến locationphần trong /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;
   }

Kiểm tra tệp snippets/fastcgi-php.conftồn tại tại vị trí /etc/nginx/:

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

Tệp này chứa danh sách các định nghĩa biến được yêu cầu bởi php7.2-fpm. Các biến được định nghĩa trực tiếp hoặc thông qua bao gồm một tệp riêng biệt.

 include fastcgi.conf;

Tập tin này được đặt tại /etc/nginx/fastcgi.confvà nó trông giống như:

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

nginx bao gồm hai tệp tham số có thể: fastcgi_paramsfastcgi.conf . Sự khác biệt giữa cả hai là định nghĩa của biến SCRIPT_FILENAME:

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

Để làm cho một câu chuyện dài ngắn, fastcgi.conf phải luôn hoạt động. Nếu vì lý do nào đó bạn thiết lập đang sử dụng fastcgi_params , bạn nên xác định 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;
}

Bây giờ tải lại cấu hình nginx:

$ sudo nginx -s reload

Và kiểm tra một tập tin php được hiển thị chính xác. Ví dụ:

/var/www/html/test.php

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

Đâu /var/www/htmllà đường dẫn đến thư mục gốc.

Nếu bất chấp tất cả, bạn vẫn thấy một tệp trống, hãy đảm bảo rằng bạn php.iniđã short_open_tagbật (nếu bạn đang kiểm tra trang PHP bằng các thẻ ngắn).


1
Cảm ơn Diego! fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;Đã lừa cuối cùng.
nguy hiểm89

Bao gồm fastcgi.conf đã giúp khắc phục tất cả
Rytis Lukoševičius

1
sự cố tuyệt vời Tôi đã thiếu cấu hình SCRIPT_FILENAME, điều này làm cho nó hoạt động
herval

1
khi tôi đã thêm SCRIPT_FILENAME vào cấu hình đó, một lần nữa mọi thứ đều thất bại với "không tìm thấy tệp"
holms

Thế còn câu chuyện dài, tại sao có hai bao gồm và một không hoạt động?
Bố già

24

Hãy chắc chắn rằng bạn đã có cái này trong / etc / nginx / fastcgi_params

fastcgi_param SCRIPT_FILENAME $ request_filename;

Ai biết tại sao điều này chưa có? Số lượng thời gian này phải lãng phí chung!


1
+1 Một lợi thế dường như của "fastcgi_param SCRIPT_FILENAME $ request_filename;" không giống như "$ document_root / $ fastcgi_script_name", "$ request_filename" điều chỉnh đường dẫn đến chỉ thị "bí danh" của Nginx. Xem: nginx.org/en/docs/http/ngx_http_core_module.html#variables , nginx.org/en/docs/http/ngx_http_core_module.html#alias , và blog của Martin Fjordvald của trích dẫn bởi Levit trên ( blog.martinfjordvald.com/2013 / 04 / Cẩu ). Trong khối vị trí của tôi, nó đã giải quyết vấn đề trang trống với php71-fpm và Nginx được cài đặt với Homebrew trên El Capitan.
Slack Undertow

15

Tôi đã viết một chương trình C ngắn trả về các biến môi trường được truyền từ nginx sang ứng dụng 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;
}

Lưu cái này vào một tập tin, vd fcgi_debug.c

Để biên dịch nó, đầu tiên cài đặt gcclibfcgi-devsau đó chạy:

gcc -o fcgi_debug fcgi_debug.c -lfcgi

Để chạy nó, cài đặt spawn-fcgi , sau đó chạy:

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

Sau đó, thay đổi cấu hình nginx fcgi của bạn để trỏ đến chương trình gỡ lỗi:

fastcgi_pass  127.0.0.1:3000;

Khởi động lại nginx, làm mới trang và bạn sẽ thấy tất cả các tham số xuất hiện trong trình duyệt để bạn gỡ lỗi! :-)


1
Lưu ý, bạn cần tiêu đề và spawn-fcgi. Trên Debian / Ubuntu bạn có thể lấy nó bằng cách apt-get install spawn-fcgi libfcgi-dev.
pevik

8

Những gợi ý này đã giúp tôi cài đặt Ubuntu 14.04 LTS,

Ngoài ra tôi cần phải bật short_open_tagtrong/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

Điều này được sửa bởi cài đặt Ubuntu giọt nhỏ giọt. Cảm ơn
Andrew

Điều này đã được sửa cho tôi sau khi cài đặt nginx 1.9.4
Ajeeb.KP

6

Thêm cái này vào /etc/nginx/conf.d/default.conf:

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
Bạn có phiền vui lòng cung cấp thêm một chút chi tiết về vấn đề chính xác của OP là gì và câu trả lời của bạn giải quyết vấn đề của OP như thế nào không?
wookie919

1
Điều này đã giải quyết vấn đề tương tự cho tôi trên Ubuntu 15.04 với nginx 1.8.0 và php-fpm 5.6.4-4ubfox6. Tôi rất muốn biết điều này thực sự đang làm gì và tại sao nó không được bao gồm trong tệp cấu hình nginx mặc định, nhưng ít nhất tôi rất vui vì giờ đây tôi đã mã hóa nó trong Dockerfile.
James Williams

Đặt giá trị trong /etc/nginx/fastcgi_paramstập tin sẽ đúng hơn tôi nghĩ.
Arda

4

Trong trường hợp bất kỳ ai gặp phải vấn đề này nhưng không có câu trả lời nào ở trên giải quyết được vấn đề của họ, tôi cũng gặp vấn đề tương tự và gặp khó khăn nhất khi theo dõi nó vì các tệp cấu hình của tôi là chính xác, các công việc ngnix và php-fpm của tôi vẫn chạy tốt và không có lỗi thông qua bất kỳ bản ghi lỗi.

Sai lầm ngớ ngẩn nhưng tôi chưa bao giờ kiểm tra biến Thẻ mở ngắn trong tệp php.ini của mình được đặt thành short_open_tag = Off. Vì các tệp php của tôi đang sử dụng <?thay vì <?php, các trang hiển thị trống. Thẻ mở ngắn nên được đặt thànhOn trong trường hợp của tôi.

Hy vọng điều này sẽ giúp được ai đó.


2

Lý do vấn đề này xảy ra là do các cấu hình fastcgi trong nginx không hoạt động theo yêu cầu và tại chỗ hoặc xử lý, chúng phản hồi dưới dạng dữ liệu html. Có hai cách có thể để bạn có thể định cấu hình nginx của mình để tránh sự cố này.

  1. Cách 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. Cách 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;
    }

Cả hai phương pháp sẽ hoạt động đúng, bạn có thể tiếp tục và lấy bất kỳ một trong số chúng. Họ gần như thực hiện các hoạt động tương tự với rất ít sự khác biệt.


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

Chúc may mắn


0

Không có câu trả lời nào ở trên làm việc cho tôi - PHP đã hiển thị đúng mọi thứ trừ các trang dựa trên mysqli, trong đó nó đang gửi một trang trống với mã phản hồi 200 và không đưa ra bất kỳ lỗi nào. Như tôi đang dùng OS X, cách khắc phục đơn giản là

sudo port install php56-mysql

tiếp theo là khởi động lại PHP-FPM và nginx.

Tôi đã chuyển từ thiết lập Apache / PHP cũ sang nginx và không nhận thấy phiên bản không khớp trong trình điều khiển cho php-mysqlphp-fpm .


0

Tôi gặp vấn đề tương tự, nginx đang xử lý một nửa trang rồi dừng lại. Không có giải pháp nào được đề xuất ở đây là làm việc cho tôi. Tôi đã sửa nó bằng cách thay đổi bộ đệm nginx fastcgi:

fastcgi_max_temp_file_size 0;

fastcgi_buffer_size 4K;
fastcgi_buffers 64 4k;

Sau khi thay đổi, locationkhối của tôi trông như sau:

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

Để biết chi tiết, hãy xem https://www.namhuy.net/3120/fix-nginx-upstream-response-buffered-t tạm-file -error.html


0

Nếu bạn nhận được một màn hình trống, đó có thể là vì 2 lý do:

  1. Trình duyệt chặn các khung hình được hiển thị. Trong một số trình duyệt, các khung được coi là không an toàn. Để khắc phục điều này, bạn có thể khởi chạy phiên bản không khung của phpPgAdmin bằng cách

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

  2. Bạn đã kích hoạt tính năng bảo mật trong Nginx cho X-Frame-Tùy chọn thử tắt nó.


0

Điều này đã giải quyết vấn đề của tôi:

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

Đây là vhost của tôi cho 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;
    }
}

Dòng cuối cùng làm cho nó khác với các câu trả lời khác.


2
có một câu trả lời được chấp nhận với hơn 200 phiếu bầu - câu hỏi là 5 tuổi .. Cá nhân tôi không thấy câu trả lời này thêm rất nhiều vào câu hỏi ..
treyBake 17/12/18

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.