nginx, fastcgi php and invision powerboard 2.1.7 (ajax?)

Malik Abdugaliev malik at elcat.kg
Sun Dec 17 14:46:45 MSK 2006


Привет.

Поставил nginx 0.5.4, php 5.2.0 как fastcgi. Система FreeBSD 6.1.
На всём этом стоит движок форума invision powerboard 2.1.7. Это делалось на 
замену обычной связке - апаче+mod_php и nginx как фронтенд.

Всё заработало с виду нормально, но после часа эксплуатации заметили некоторые 
проблемы. Самое основное это ошибки при использовании AJAX-фичи для быстрого 
редактирования своих сообщений:
2006/12/17 16:10:00 [error] 55895#0: *28759 upstream prematurely closed 
connection while reading response header from upstream, client: 10.0.1.31, 
server: forum.tld, URL: 
"/index.php?s=&act=xmlout&do=post-edit-save&p=3213952&t=404709&f=129", 
upstream: "fastcgi://unix:/tmp/php.sock:", host: "forum.tld", referrer: 
"http://forum.tld/index.php?showtopic=404709"

Для клиента это выглядит так - выбираешь опцию "Быстрое редактирование", 
правишь сообщение, нажимаешь "Применить исправления", появляется бегунок и на 
этом всё, более никаких изменений.
В логах PHP при этом ругань о преждевременной (premature) кончине скрипта 
sources/ipclass.php, с указанием строки 3737 (к сожалению точных логов не 
сохранилось):
    /**
        * UnHTML and stripslashes _GET _POST value
    *
        * @param        string  Input
        * @return       string  Cleaned Input
        * @since        2.1
        */
    function parse_clean_value($val)
    {
        if ($val == "") # <<< вот строка номер 3737 <<<
        {
                return "";
        }

Я грешил на отсутствие некоторых переменных, которые не передавались в 
fastcgi, но эксперименты ними не помогли. Вот конфиг nginx в части fastcgi:
location ~* ^.+\.(php)$ {
    fastcgi_pass unix:/tmp/php.sock;
    fastcgi_index  index.php;

# пробовал с минимумом параметров:
    fastcgi_param  PATH_TRANSLATED    $fastcgi_path_translated;
    fastcgi_param  QUERY_STRING       $query_string;

# потом с параметрами для метода POST:
    fastcgi_param  REQUEST_METHOD     $request_method;
    fastcgi_param  CONTENT_TYPE       $content_type;
    fastcgi_param  CONTENT_LENGTH     $content_length;

# и со всеми параметрами, какие нашёл:
    fastcgi_param  REDIRECT_STATUS    200;
    fastcgi_param  SCRIPT_FILENAME    $fastcgi_path_translated;
    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  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:
PHP_FCGI_CHILDREN=10 /usr/local/php520/bin/php -a -b /tmp/php.sock


Кроме этого возникала другая ошибка, которую мне не удалось привязать к 
конкретному действию на форуме (вероятно какие ресурсоёмкие запросы, типа 
поиска):
2006/12/17 16:10:50 [error] 55893#0: *29240 FastCGI sent in stderr: "PHP Fatal 
error:  Out of memory (allocated 2883584) (tried to allocate 1732099484 
bytes) in /www/forum/sources/sql/mysql_extra_que
ries.php on line 70" while reading response header from upstream, client: 
195.38.161.6, server: forum.tld, URL: 
"/index.php?s=&act=xmlout&do=get-member-names&name=%u041F%u0438%u043B%u044E%u0
43B%u044F&__=1166350279734", upstream: "fastcgi://unix:/tmp/php.sock:", host: 
"forum.tld", referrer: "http://forum.tld/index.php?act=Search&f="

Т.е. php запросил 1.7 гига памяти, в то время когда ему выдано 2.8 метра )



После часа экспериментов на живых людях пришлось откатиться к старой схеме с 
апачем (

Есть ли у кого-нибудь какие замечания по устранению этих проблем?
Спасибо.
Малик.





More information about the nginx-ru mailing list