LINUX.ORG.RU
ФорумAdmin

Nginx + PHP в режиме FastCGI. Не отдаются *.php странички.


0

0

Здравствуйте!

Поставил себе в виртуалку Ubuntu 9.04 Server. Настроил внутри виртуалки и снаружи, чтобы она отвечала на IP 192.168.1.5. Установил пакеты

php5-cgi nginx

Настроил запуск PHP5 в режиме FastCGI и Nginx. Когда они оба запущены, есть процессы:

root     2431 pts/1 S  16:22 sh -c /bin/su -m -c "/usr/bin/php5-cgi -q -b 127 
www-data 2432 pts/1 S  16:22 /bin/su -m -c /usr/bin/php5-cgi -q -b 127.0.0.1: 
www-data 2435 pts/1 S  16:22 sh -c /usr/bin/php5-cgi -q -b 127.0.0.1:8888 
www-data 2436 ?     Ss 16:22 /usr/bin/php5-cgi -q -b 127.0.0.1:8888 
www-data 2437 ?     S  16:22 /usr/bin/php5-cgi -q -b 127.0.0.1:8888 
www-data 2438 ?     S  16:22 /usr/bin/php5-cgi -q -b 127.0.0.1:8888 
www-data 2439 ?     S  16:22 /usr/bin/php5-cgi -q -b 127.0.0.1:8888 
www-data 2440 ?     S  16:22 /usr/bin/php5-cgi -q -b 127.0.0.1:8888 
www-data 2441 ?     S  16:22 /usr/bin/php5-cgi -q -b 127.0.0.1:8888 
root     2599 ?     Ss 16:38 nginx: master process /usr/sbin/nginx 
www-data 2600 ?     S  16:38 nginx: worker process 

В браузере хост-машины ввожу http://192.168.1.5 и вижу стартовую страницу Nginx, т.е. содержимое файла index.html в каталоге /var/www/nginx-default.

В браузере я могу смотреть любые созданные мной *.html странички, nginx их отдает. А вот *.php-скрипты не работают, вместо них показывается содержимое файла /var/www/nginx-default/50x.html

Я проверил, выполняются ли вообще php-скрипты. Команда

php5-cgi script.php
скрипт выполняет.

То есть, толи nginx не передает запросы на FastCGI порт, толи PHP не принимает запросы, толи PHP не отдает запросы обратно, толи nginx не принимает ответ от FastCGI порта, толи принимает, но не отдает на HTTP порт.

Дело осложняется тем, что документации по синтаксису и сруктуре файла настройки nginx до сих пор не существует. Есть документация по опциям модулей, но этого мало. Поэтому целенаправленно отконфигурировать nginx я не могу, все приходится делать методом тыка.

Конфигурация nginx сейчас такая.

Файл /etc/nginx/nginx.conf:

user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    access_log  /var/log/nginx/access.log;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}



Файл /etc/nginx/sites-enabled/default:

server {
        listen   80;
        server_name  localhost;

        access_log  /var/log/nginx/localhost.access.log;

        location / {
                root   /var/www/nginx-default;
                index  index.html index.htm;
        }

        location /doc {
                root   /usr/share;
                autoindex on;
                allow 127.0.0.1;
                deny all;
        }

        location /images {
                root   /usr/share;
                autoindex on;
        }

        #error_page  404  /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/nginx-default;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                root           /var/www;
                # fastcgi_pass   localhost:8888;
                fastcgi_pass   127.0.0.1:8888;
                fastcgi_index  index.php;
                # fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
                fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
                include fastcgi_params; 
        }

}



Файл /etc/nginx/fastcgi_params:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

PHP-файлы размещаю в каталоге /var/www. Там два файла - index.php и phpinfo.php. В браузере обращаюсь к ним как http://192.168.1.5/index.php и http://192.168.1.5/phpinfo.php. В момент обращения к этим страницам, в файле /var/log/nginx/error.log имею следующие записи:

2009/12/10 18:57:26 [error] 3719#0: *1 upstream prematurely closed connection while reading response header from upstream, client: 192.168.1.2, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:8888", host: "192.168.1.5"

2009/12/10 18:57:33 [error] 3719#0: *1 upstream prematurely closed connection while reading response header from upstream, client: 192.168.1.2, server: localhost, request: "GET /phpinfo.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:8888", host: "192.168.1.5"

Вопрос. Как отконфигурировать nginx, чтобы он начал отдавать результаты работы php скриптов?

Ответ на: комментарий от iSage

php получает /var/www/index.php в качестве пути к скрипту, который, судя по первому посту, нахидится в /var/www/nginx-default. примерно при этом.

arsi ★★★★★ ()
Ответ на: комментарий от arsi

>который, судя по первому посту, нахидится в /var/www/nginx-default
судя по первому посту там находится статика.
а вот где скрипты оп тактично умолчал.

iSage ★★★★ ()
Ответ на: комментарий от catap

> выкини строчку

fastcgi_param SCRIPT_NAME $fastcgi_script_name;


Выкинул. Перезапустил Nginx. Не помогло.

xintrea ()
Ответ на: комментарий от iSage

>> который, судя по первому посту, нахидится в /var/www/nginx-default

судя по первому посту там находится статика.

а вот где скрипты оп тактично умолчал.



Как же это умолчал?

"... PHP-файлы размещаю в каталоге /var/www. Там два файла - index.php и phpinfo.php. В браузере обращаюсь к ним как http://192.168.1.5/index.php и http://192.168.1.5/phpinfo.php ..."

И в конфигурации nginx для *.php прописан root:

location ~ \.php$ {
root /var/www;
# fastcgi_pass localhost:8888;
fastcgi_pass 127.0.0.1:8888;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
include fastcgi_params;
}

Меня смущает вот эта тигла «~» после слова location. Непонятно, что она обозначает? В некоторых конфигах в инете написано «~*». Тоже, неизвестно что это значит. Пробовал со звездочкой - результат тот же.

xintrea ()
Ответ на: комментарий от iSage

а теперь покажи логи пхп с E_ALL

Немогу, их нет. Я даже в /etc/php5/cgi/php.ini прописал в какой конкретно файл лог ложить.

Если сделать намеренную ошибку в php-файле, и запустить из консоли напрямую:

ph5-cgi index.php

то ошибка в файле лога появляется.

А если обратиться к странице через браузер, ошибка на добавляется.

Вывод: nginx не вызывает PHP скрипт по FastCGI, либо вызывает скрипт не с тем именем.

Вопрос: Как посмотреть, какое имя скрипта пытается открыть nginx?

xintrea ()
Ответ на: комментарий от catap

В общем, дело было не в nginx, а в старте PHP.

Если запускать PHP не скриптом http://paste.org.ru/?nz8qdv, а простой командой

# php-cgi -b 127.0.0.1:8888

То *.php странички начинают отдаваться.

Теперь бы понять, что не так в скрипте. Брал его отсюда http://kovyrin.net/2006/05/30/nginx-php-fastcgi-howto/lang/ru/. Изменял только путь к бинарнику PHPFCGI, номер порта FCGIPORT и количество запросов PHP_FCGI_MAX_REQUESTS.

xintrea ()
Ответ на: комментарий от catap

А дело было в стартовом PHP скрипте, в строчке:

ALLOWED_ENV="$ALLOWED_ENV FCGI_WEB_SERVER_ADDRS"

Если она есть, то старт PHP выполняется с таким содержанием переменных:

PHP_FCGI_CHILDREN=5 PHP_FCGI_MAX_REQUESTS=10 FCGI_WEB_SERVER_ADDRS=

то есть FCGI_WEB_SERVER_ADDRS принудительно задавался как пустой, и видимо где-то внутрях php5-cgi проверяется, если эта переменная есть, используется ее значение.

Я сию строчку закомментировал.

Заодно вместо

ALLOWED_ENV="ORACLE_HOME PATH USER"

написал

ALLOWED_ENV=""

и раздача *.php заработала.

xintrea ()
Ответ на: комментарий от LamerOk

> добавь юзера в судоюзерс или исправь 35-ую строку

Не, дело оказалось не в пользователях. Можно запускать хоть от моего пользователя, хоть от root, хоть от www-data, всеравно работает.

Проблема была в другом, смотри пост выше.

xintrea ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.