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

xintrea

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

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


Поставил себе в виртуалку 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 порта, толи 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 скриптов?
 

fixxxer

К.О.
Партнер клуба
php как запускаешь?

-~{}~ 11.12.09 00:43:

>>Файл /etc/nginx/fastcgi_params:

добавь

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

-~{}~ 11.12.09 00:47:

также советую не мучаться и поставить php-fpm.

на убунте можно воспользоваться репозиторием dotdeb:

Код:
deb http://php53.dotdeb.org stable all
пакет php5-fpm
 

xintrea

Новичок
Автор оригинала: fixxxer
php как запускаешь?
С помощью скрипта:

Код:
#!/bin/bash

## ABSOLUTE path to the PHP binary
PHPFCGI="/usr/bin/php5-cgi"

## tcp-port to bind on
FCGIPORT="8888"

## IP to bind on
FCGIADDR="127.0.0.1"

## number of PHP children to spawn
PHP_FCGI_CHILDREN=5

## number of request before php-process will be restarted
PHP_FCGI_MAX_REQUESTS=10

# allowed environment variables sperated by spaces
ALLOWED_ENV="ORACLE_HOME PATH USER"

## if this script is run as root switch to the following user
USERID=www-data

################## no config below this line

if test x$PHP_FCGI_CHILDREN = x; then
  PHP_FCGI_CHILDREN=5
fi

ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_CHILDREN"
ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS"
ALLOWED_ENV="$ALLOWED_ENV FCGI_WEB_SERVER_ADDRS"

if test x$UID = x0; then
  EX="/bin/su -m -c \"$PHPFCGI -q -b $FCGIADDR:$FCGIPORT\" $USERID"
else
  EX="$PHPFCGI -b $FCGIADDR:$FCGIPORT"
fi

echo $EX

# copy the allowed environment variables
E=

for i in $ALLOWED_ENV; do
  E="$E $i=${!i}"
done

# clean environment and set up a new one
nohup env - $E sh -c "$EX" &> /dev/null &
>>Файл /etc/nginx/fastcgi_params:
добавь
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
Я конечно добавил, скрипты не заработали. А зачем это нужно добавлять, если в /etc/nginx/sites-enabled/default в секции "location ~ \.php$" есть такие строки:

Код:
root           /var/www;
...
fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
также советую не мучаться и поставить php-fpm.

на убунте можно воспользоваться репозиторием dotdeb: deb http://php53.dotdeb.org stable all

пакет php5-fpm
Ну для меня это слишком сложно. Мне бы нативный PHP в CGI режиме завести, вроде все просто должно быть, да почему-то не заводится.
 

pilot911

Новичок
с php5-fpm какие могут быть сложности ?

там простейший конфиг
 

fixxxer

К.О.
Партнер клуба
>А зачем это нужно добавлят

а.. не заметил. это одно и то же

попробуй просто без скриптов руками:

su www-data
php-cgi -b 127.0.0.1:8888
и посмотри что происходит если отправить запрос.
но вообще лучше фпм =)

-~{}~ 12.12.09 22:34:

## number of request before php-process will be restarted
PHP_FCGI_MAX_REQUESTS=10

Ээээ как то совсем мало
поставь 500
хотя работать и так должно
 

xintrea

Новичок
Автор оригинала: fixxxer
попробуй просто без скриптов руками:

su www-data
php-cgi -b 127.0.0.1:8888

и посмотри что происходит если отправить запрос.
Сделать "su www-data" не смог, так как требует пароль, а я его не знаю. Рутовский пароль неподходит, пустой пароль тоже неподходит.

Но когда запустил "php-cgi -b 127.0.0.1:8888" от обычного пользователя (а так же пробовал от рута), то генерация php страниц заработала! Значит что-то не так в запускающем PHP скрипте. Я его копировал вот отсюда http://kovyrin.net/2006/05/30/nginx-php-fastcgi-howto/lang/ru/, только путь к бинарнику, номер порта и количество последовательных запросов заменил.

но вообще лучше фпм =)
Почитал про него, так и не понял, чем он луше то?

## number of request before php-process will be restarted
PHP_FCGI_MAX_REQUESTS=10

Ээээ как то совсем мало
поставь 500
хотя работать и так должно
У меня на виртуалку выделено 64Mb. После старта системы свободно где-то 35Mb. Мои скрипты самые сложные жрут чуть меньше 2Mb. Итого 10 скриптов скушают ~20Mb. Останется 15Mb на что-нибудь. Я правда не знаю, может скрипты в этом параметре не съедают память, а постоянно запускается на выполнение одна и таже копия. Тогда имеет смысл увеличить.

На виртуалку выделено так мало, потому что нашел недорогой тариф на VPS с такими вот характеристиками, сейчас тренируюсь на кошках.

-~{}~ 13.12.09 01:39:

А дело, оказывается, было в стартовом 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 заработала.
 

fixxxer

К.О.
Партнер клуба
>Почитал про него, так и не понял, чем он луше то?

ну для твоих целей только тем что это нормальный демон и не надо извращаться с вырвиглазным скриптом запуска)

ну если заработало отлично
 

Alexandre

PHPПенсионер
php-fpm хорошо работает на Ubuntu FreeBSD & MacOS (10.5)
у меня проблем не было.

вообще-то надо телнетом проверить 8888 порт, как происходит отдача контента.
 

fixxxer

К.О.
Партнер клуба
>>Я правда не знаю, может скрипты в этом параметре не съедают память, а постоянно запускается на выполнение одна и таже копия. Тогда имеет смысл увеличить

нененене!

это число запросов после которого детка рестартуется. защита от утечек памяти.

рестартовать каждые 10 запросов сам понимаешь излишне )
 
Сверху