Nginx показывает пустые страницы PHP
У меня есть сервер 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
Для справки я прикрепляю блок 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.
Ответ 2
заменить
include fastcgi_params;
с
include fastcgi.conf;
и удалите fastcgi_param SCRIPT_FILENAME... в nginx.conf
Ответ 3
Также возникла эта проблема и, наконец, нашли решение здесь. Короче говоря, вам нужно добавить следующую строку в конфигурационный файл nginx fastcgi (/etc/nginx/fastcgi_params в Ubuntu 12.04)
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
Ответ 4
Многие пользователи попадают в эту ветку, ожидая найти решение для отображения пустых страниц при использовании 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
существует в 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 с короткими тегами).
Ответ 5
Убедитесь, что у вас есть это в /etc/nginx/fastcgi _params
fastcgi_param SCRIPT_FILENAME $request_filename;
Кто знает, почему этого уже нет? Количество времени, которое это должно коллективно тратить!
Ответ 6
Я написал короткую программу на 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, обновите страницу, и вы должны увидеть все параметры, отображаемые в вашем браузере для отладки!: -)
Ответ 7
Эти подсказки помогли мне с моей установкой 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
Ответ 8
Добавьте это в /etc/nginx/conf.d/default.conf
:
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
Ответ 9
В случае, если у кого-то возникла эта проблема, но ни один из вышеперечисленных ответов не разрешил их проблемы, у меня была такая же проблема, и мне было сложнее отслеживать ее, поскольку мои конфигурационные файлы были правильными, выполнялись мои ngnix и php-fpm задания отлично, и не было ошибок, возникающих в журналах ошибок.
Неверная ошибка, но я никогда не проверял переменную Short Open Tag в файле php.ini, которая была установлена на short_open_tag = Off
. Поскольку мои php файлы использовали <?
вместо <?php
, страницы отображались пустым. Короткий открытый тег должен быть установлен на On
в моем случае.
Надеюсь, это поможет кому-то.
Ответ 10
Причина, по которой эта проблема возникает, заключается в том, что конфигурации fastcgi в nginx не функционируют по мере необходимости, а на месте или в обработке они отвечают как данные html. Существует два возможных способа настройки nginx, чтобы избежать этой проблемы.
-
Способ 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:
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;
}
Оба метода будут работать правильно, вы можете пойти и взять любой из них. Они почти выполняют те же операции с очень небольшой разницей.
Ответ 11
Ни один из вышеперечисленных ответов не работал у меня - PHP правильно отображал все, кроме страниц, которые полагались на mysqli, для которых он отправлял пустую страницу с кодом ответа 200 и не выдавал никаких ошибок. Поскольку я на OS X, исправление было просто
sudo port install php56-mysql
за которым следует перезапуск PHP-FPM и nginx.
Я переносил с более старой установки Apache/PHP на nginx и не замечал несоответствие версии в драйвере для php-mysql
и php-fpm
.
Ответ 12
У меня была аналогичная проблема, 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
Ответ 13
Если вы получаете пустой экран, это может быть вызвано двумя причинами:
-
Браузер блокирует отображение фреймов. В некоторых браузерах фреймы считаются небезопасными. Чтобы преодолеть это, вы можете запустить бескаркасную версию phpPgAdmin
http://-your-domain-name-/intro.php
-
Вы включили функцию безопасности в Nginx для X-Frame-Options, попробуйте отключить ее.
Ответ 14
Это решило мою проблему:
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;
}
Ответ 15
Это мой 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;
}
}
Последняя строка отличает его от других ответов.
Ответ 16
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;
}
Удачи
Ответ 17
У меня была похожая ошибка, но в сочетании с Nextcloud. Так что, если это не сработало, попробуйте:
Взгляните на руководство по Nginx.