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

EDIT

ось мій журнал помилок 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

Перевірте моє оновлення вище.
Майк Глаз

Помилка nginx connect() failed ... fastcgi://127.0.0.1:9000суперечить вашому nginx conf, перезавантажте nginx conf?
adamsmith

Я думаю, що це правильно.
Майк Глаз

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
Майк Глаз

154
останній рядок із "SCRIPT_FILENAME" зробив для мене хитрість :) дякую
Stijn Leenknegt

3
дякую, що останній рядок зробив трюк (він не потрібен при використанні версії 1.0 nginx, що постачається з Centos). Я хотів би побачити, як документація навколо всього цього покращиться.
Жорре

1
Запрошуємо вас, раді дізнатися, що це все ще допомагає людям після всіх цих років. Однак зверніть увагу на оновлену відповідь @ spacepile нижче, що, мабуть, краще.
Джуліан Х. Лам

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 Testing після nginxоновлення 10 вересня 2014 року.
severin

6
Це виправлено і для мене після оновлення nginx до 1.6.2 (оновлення вересня 2014 року). Треба любити оновлення, які розбивають речі випадковим чином.
Ман

30
Ось історіяfastcgi_params vs fastcgi.conf: blog.martinfjordvald.com/2013/04/…
Левіт

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.
Валентин Клінгеммер

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. Величезна подяка
Вільям Террелл

1
Як я розумію, він повідомляє fastcgi, де саме файли, які йому потрібно обслуговувати. PATH_TRANSLATED приймає URI запиту, а потім "переводить" його туди, де фактичний файл знаходиться на сервері. Напр. PATH_TRANSLATED для test.com/index.php може бути /var/www/index.php
Постійний мір

44

Багато користувачів потрапляють у цю тему, сподіваючись знайти рішення для відображення порожніх сторінок під час використання nginx + php-fpm , я є одним із них. Це резюме того, що я в кінцевому підсумку робив після прочитання багатьох відповідей тут, а також власних розслідувань (оновлених до php7.2):

1) Відкрийте /etc/php/7.2/fpm/pool.d/www.confі перевірте значення параметра listen.

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;Трюк нарешті.
небезпека89

Включити 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 та блог Мартина Фьордвальда, цитований Левітом вище ( blog.martinfjordvald.com/2013 / 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
Зверніть увагу, вам потрібні заголовки та spawn-fcgi. У 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

Це виправлено встановленням краплі Ubuntu DO. Спасибі
Андрій

Це було встановлено для мене після встановлення nginx 1.9.4
Ajeeb.KP

6

Додайте це до /etc/nginx/conf.d/default.conf:

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
Чи не заперечуєте ви, будь ласка, детальніше розповісти про те, що конкретно проблема ОП та як ваша відповідь вирішує проблему ОП?
wookie919

1
Це вирішило ту саму проблему для мене на Ubuntu 15.04 з nginx 1.8.0 та php-fpm 5.6.4-4ubuntu6. Я хотів би дізнатися, що це насправді робить, і чому він не включений у конфігураційний файл nginx за замовчуванням, але я принаймні щасливий, що зараз зашифрував це у Dockerfile.
Джеймс Вільямс

Внесення значення у /etc/nginx/fastcgi_paramsфайл було б більш правильним, я думаю.
Арда

4

Якщо у когось виникає ця проблема, але жоден із наведених вище відповідей не вирішує їх проблем, у мене виникала ця сама проблема і мені було найважче відстежити її, оскільки мої файли конфігурації були правильні, мої завдання ngnix та php-fpm працювали нормально, і не було помилок, що надходять через журнали помилок.

Дума помилка, але я ніколи не перевіряв змінну Short Open Tag у своєму файлі php.ini, на який було встановлено short_open_tag = Off. Оскільки мої файли php використовувались <?замість <?php, сторінки відображалися порожніми. 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-mysqlта php-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 by

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

  2. Ви ввімкнули функцію захисту в Nginx для параметрів X-Frame, спробуйте відключити її.


0

Це вирішило моє питання:

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

Це мій 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 років .. Я особисто не бачу цієї відповіді, що додає багато запитань ..
treyЗайдіть

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.