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
По-видимому, nginx не вызывал php-fpm, проверяли ли вы журнал ошибок nginx?
Адамсмит

Проверьте мое обновление выше.
Майк Глэйз

Ошибка nginx connect() failed ... fastcgi://127.0.0.1:9000противоречит вашему nginx conf, перезагрузите nginx conf?
Адамсмит

Я думаю, что это правильно.
Майк Глаз

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 после nginxобновления 10 сентября 2014 года.
severin

6
Это исправило это и для меня после обновления nginx до 1.6.2 (обновление в сентябре 2014). Должен любить обновления, которые ломают вещи случайно.
Ман

30
Вот предыстория fastcgi_paramsпротив 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;Сделал трюк наконец.
danger89

Включение fastcgi.conf помогло все исправить
Ритис Лукошявичюс

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 «alias». См. Nginx.org/en/docs/http/ngx_http_core_module.html#variables , nginx.org/en/docs/http/ngx_http_core_module.html#alias и блог Мартина Фьордвалда, на который ссылается Левит выше ( blog.martdjf). / 04 /… ). В моем блоке локаций он решил проблему с пустой страницей с php71-fpm и Nginx, установленным с Homebrew на El Capitan.
отними прибойный

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.
Певик

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

Это исправлено установкой Droplet Ubuntu. Спасибо
Андрей

Это было исправлено после установки 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, страницы показывались пустыми. Short 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-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-teilitary-file-error.html.


0

Если вы получаете пустой экран, это может быть по двум причинам:

  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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.