No input file specified: php 5.3, fastcgi, php-fpm, lighttpd

sergos

Новичок
No input file specified: php 5.3, fastcgi, php-fpm, lighttpd

Беда приключилась, не знаю куда копать. Даже гугла о чем спросить неясно...сильно расплывчато получается.

Предистория.
Был vds с lighttpd. PHP был пропатчен и работал как fpm. (php-5.2.6, пакет собран ребятами из поддержки хостинга)
На сервере крутится несколько сайтов, часть из них - на базе kohana.
Для ЧПУ в kohana использовались такие правила mod_rewrite:
Код:
url.rewrite-repeat-if-not-file = ( "^/(.*)$" => "index.php/$1" )
И все замечательно работало. Но выражение "не мешайте технике работать" почему то забылось, и решил я обновить php до 5.3. Поставил php 5.3.2 (с php-fpm) с dotdeb.org.
Сайты без kohana завелись на ура.
А вот с kohana - засада.

При открытии http://site1.ru/ получаю "No input file specified".
При открытии http://site1.ru/index.php - работает нормально (соответственно только главная страница).
С отключенным rewrite - http://site1.ru/index.php/about/ - опять "No input ..."

То есть проблема в урлах типа /index.php/blabla, Теперь они не работают.

Создается впечатление что в 5.3 как то подругому заработал FastCGI - может виноваты переменные окружения PATH_INFO, SCRIPT_FILENAME? Тут как то все запутано, не хватает знаний.
В инфе по переходу на 5.3 вроде ведется речь о каких то изменениях в CGI/FastCGI, но изучение
http://ru2.php.net/manual/en/migration53.sapi.php не дало никаких светлых мыслей.

Может кто сталкивался с подобными багами? Любые мысли, потому как свои уже иссякли.

Что используется:
1) debian lenny
2) lighttpd-1.4.26
Код:
fastcgi.server    = ( ".php" =>                                                                            
        ((                                                                                                
                "socket" => "/var/www/vhost/site1.ru/run/fastcgi.socket",                                                
                "broken-scriptfilename" => "enable"                                                        
        ))                                                                                                
)
3) php-5.3.2 (cgi.fix_pathinfo=1 - в php.ini указано)
4) php-fpm версии 0.6.

5) в пулах php-fpm каждый сайт настроен на работу под своим uid/gid. права на скрипты - есть.

Код:
                <section name="pool">                                                                                                        
                    <value name="name">site1</value>                                                                                  
                    <value name="listen_address">/var/www/vhost/site1.ru/run/fastcgi.socket</value>                                    
                        <value name="listen_options">                                                                                        
                                <value name="backlog">-1</value>                                                                            
                                <value name="owner">site1</value>                                                                          
                                <value name="group">site1</value>                                                                          
                                <value name="mode">0660</value>                                                                              
                        </value>                                                                                                            
                        <value name="php_defines">                                                                                          
                          <value name="error_log">/var/www/vhost/site1.ru/log/phperror.log</value>                                      
                          <value name="upload_tmp_dir">/var/www/vhost/site1.ru/tmp</value>                                              
                        </value>                                                                                                            
                        <value name="user">site1</value>>                                                                                  
                        <value name="group">site1</value>                                                                                  
                        <value name="pm">                                                                                                    
                                <value name="style">static</value>                                                                          
                                <value name="max_children">1</value>                                                                        
                                <value name="apache_like">                                                                                  
                                        <value name="StartServers">1</value>                                                                
                                        <value name="MinSpareServers">1</value>                                                              
                                        <value name="MaxSpareServers">3</value>                                                              
                                </value>                                                                                                    
                        </value>                                                                                                            
                        <value name="request_terminate_timeout">0s</value>                                                                  
                        <value name="request_slowlog_timeout">5s</value>                                                                    
                        <value name="slowlog">/var/www/vhost/site1.ru/log/phpslow.log</value>                                              
                        <value name="rlimit_files">1024</value>                                                                              
                        <value name="rlimit_core">0</value>                                                                                  
                        <value name="chroot"></value>                                                                                        
                        <value name="chdir">/var/www/vhost/site1.ru/htdocs</value>                                                        
                        <value name="catch_workers_output">yes</value>                                                                      
                        <value name="max_requests">500</value>                                                                              
                        <value name="allowed_clients">127.0.0.1</value>                                                                      
                        <value name="environment">                                                                                          
                                <value name="PATH">/usr/bin:/bin</value>                                                                    
                                <value name="TMP">/var/www/vhost/site1.ru/tmp</value>                                                      
                                <value name="MALLOC_CHECK_">2</value>                                                                        
                        </value>                                                                                                            
                </section>
 

sergos

Новичок
Что-то новое.

Поднял fastcgi без fpm (php запускает сам lighttpd)
Код:
fastcgi.server    = ( ".php" =>                                                                                                 
       ((                                                                                                                       
               "bin-path" => "/usr/bin/php-cgi",                                                                                
               "socket" => "/tmp/php.socket",                                                                                   
               "max-procs" => 2,                                                                                                
               "idle-timeout" => 20,                                                                                            
               "bin-environment" => (                                                                                           
                       "PHP_FCGI_CHILDREN" => "4",                                                                              
                       "PHP_FCGI_MAX_REQUESTS" => "10000"                                                                       
               ),                                                                                                               
               "bin-copy-environment" => (                                                                                      
                       "PATH", "SHELL", "USER"                                                                                  
               ),                                                                                                               
               "broken-scriptfilename" => "enable"                                                                              
       ))                                                                                                                       
)
- урлы типа index.php/blabla работают.
Собака зарыта все таки в fpm.

Стучим в бубен далее.
 

sergos

Новичок
Ну какие же var_dump?... :-(
Интерпретатор ведь не выполняет код скрипта совсем, не находит файл.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
sergos
fpm - это менеджер процессов, тебе надо логи и настройки лайти смотреть
в этом мы тебе не поможем
 

sergos

Новичок
смотрел. ни ошибок, ни чего что бы натолкнуло на решение.

зы
ветка то по настройке серверов...где же как не здесь спросить?
 

fixxxer

К.О.
Партнер клуба
Во всех подобных случаях нужно чтобы фастцги параметром шло корректное значение SCRIPT_FILENAME (содержащее полный абсолютный путь к пхп файлу), тогда все всегда будет работать.
 

sergos

Новичок
@DYPA

Да, ознакомился.
Смотри что выходит.
Рерайты работают таким образом что в запрос передается на index.php, при этом запрошенный uri ($1) передается ему в этом хитром формате
Код:
index.php/$1
Это работает как на апаче так и в лайти (nginx, который смог пощупать - иначе, отдает статус 404). Что получается - запрос передается в index.php и пхп сам извлекает запрошенный uri.

То есть, не используя никаких рерайтов, если мы запросим на любом сервере адрес типа index.php/myUri - пхх отработает правильно (отдаст контент, сгенерированный файлом index.php).

Я проверил эту мысль на апаче с mod_php, на лайти с internal spawning. Все подтвердилось, эти адреса отрабатывают нормально, интерпретатор парсит index.php и выполняет код.

Повторюсь, что в такой же схеме все также замечательно работало на предыдущем пхп 5.2.6 с наложенным патчем php-fpm.

Траблы возникли при переходе на php-5.3.2. Там как раз с версии 5.3.0 патч залили в официальную девелоперскую ветку.
Ведь как я понимаю, ошибку "No input file specified" отдает интерпретатор, который не смог получить доступ к скрипту, по причине например not found или access denied.
Cкорее всего что-то поменялось в поведении fpm менеджера, так как при этом же пхп в режиме internal spawning, который умеет лайти - все работает опять же нормально.
Видимо интерпретатор пытается искать не "index.php" а "index.php/blabla". Вариант с отсутствием доступа отсекаем - ничего не менялось.

Вот только не понятно чей это глюк: самого php или ребята из dotdeb.org как то странно собирают пакеты.

И кстати, описанный на форуме кохана способ с костылем такого типа:
Код:
RewriteRule .* index.php[b]?kohana_uri=$0[/b]
работает. Но пока вылезли проблемы с некоторыми урлами, где используется GET - у коханы глючит маршрутизация. Переписывать сайты нет желания. Поэтому не комильфо.


зы
Можно собрать пхп самому из официальных сырцов (deb-src в debain unstable как раз версии 5.3.2) конечно, и проверить. Но нет времени заниматься потом обновлением всего этого добра, чтобы использовать на продакшн сервере. Поэтому и хотелось юзать обновляемые пакеты от dotdeb.org. И посему хочется таки найти отгадку.

-~{}~ 02.06.10 07:18:

@fixxer

Автор оригинала: fixxxer
Во всех подобных случаях нужно чтобы фастцги параметром шло корректное значение SCRIPT_FILENAME (содержащее полный абсолютный путь к пхп файлу), тогда все всегда будет работать.
Да, вот что говорит официальный мануал (http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ModFastCGI):
If you want to use PATH_INFO and PHP_SELF in you PHP scripts you have to configure php and lighttpd. The php.ini needs the option:
Код:
cgi.fix_pathinfo = 1
and the option "broken-scriptfilename" in your fastcgi.server config:
Код:
fastcgi.server = ( ".php" =>
  (( "socket" => "/tmp/php-fastcgi.socket",
      "bin-path" => "/usr/local/bin/php",
      "bin-environment" => (
        "PHP_FCGI_CHILDREN" => "16",
        "PHP_FCGI_MAX_REQUESTS" => "10000" 
      ),
      "bin-copy-environment" => ( "PATH", "SHELL", "USER" ),
      "broken-scriptfilename" => "enable" 
  ))
)
Why this ? the "cgi.fix_pathinfo = 0" would give you a working PATH_INFO but no PHP_SELF. If you enable it, it turns around. To fix the PATH_INFO `--enable-discard-path` needs a SCRIPT_FILENAME which is against the CGI spec, a broken-scriptfilename. With "cgi.fix_pathinfo = 1" in php.ini and "broken-scriptfilename => "enable"" you get both.

Чтоб их этих буржуев за такие поэмы...
Но как я усвоил, нужно иметь в php.ini - cgi.fix_pathinfo = 1.
А в конфиге лайти - "broken-scriptfilename" => "enable".
И эти вещи в моей конфигурации присутствуют. И на старом пхп, и на новом. И я уже перепробовал различные комбинации этих параметров чтоб ему угодить. Однако воз и ныне там.

-~{}~ 02.06.10 07:28:

@all

Еще вот тут ведется речь о предмете: http://svn.php.net/repository/php/php-src/branches/PHP_5_3/sapi/cgi/CHANGES
Вот интересный абзац:
Код:
  --disable-path-info-check CGI: 
                            If this is disabled, paths such as
                            /info.php/test?a=b will fail to work

                            Now it is enabled by default, but can be disabled
                            with ini directive "cgi.fix_pathinfo=0"
Но опять же, по дефолту - разрешено, да и к тому же у меня установлено cgi.fix_pathinfo=1. (смотрю в phpinfo())
Неужели бага?
 

fixxxer

К.О.
Партнер клуба
Тебя интересует соответствие спеке CGI? Меня тоже нет.
Потому я всегда передаю SCRIPT_FILENAME и все работает независимо от cgi.fix_pathinfo (но с тех пор, как я увидел код, который выполняется при значении 1, я всегда ставлю в ноль :)).

Я правда в лайти вообще ничего не понимаю, наверное он по умолчанию переменные соответствующие спеке cgi передает. В nginx же все в явном виде. Я так делаю:

PHP:
fastcgi_param   DOCUMENT_ROOT     $document_root;
fastcgi_param   SCRIPT_FILENAME   $document_root$fastcgi_script_name;
fastcgi_param   PATH_INFO         $fastcgi_path_info;
fastcgi_param   QUERY_STRING      $args;
fastcgi_param   CONTENT_TYPE      $content_type;
fastcgi_param   CONTENT_LENGTH    $content_length;
fastcgi_param   SERVER_NAME       $server_name;
fastcgi_param   REQUEST_URI       $request_uri;
fastcgi_param   DOCUMENT_URI      $document_uri;
fastcgi_param   REQUEST_METHOD    $request_method;
fastcgi_param   REMOTE_ADDR       $remote_addr;
fastcgi_param   REMOTE_USER       $remote_user;
Если мое предположение по поводу лайти верно, то надо просто понять как написать в его конфиге аналог

PHP:
fastcgi_param   SCRIPT_FILENAME   $document_root$fastcgi_script_name;
 

sergos

Новичок
да, в nginx видел что передают явно параметры.
думал в эту сторону
но нигде в доках нет как это сделать. в примерах тоже пусто.

может конечно плохо искал. потрясу гугла.
 

fixxxer

К.О.
Партнер клуба
А "broken-scriptfilename" => "enable" это не оно ли? У лайти есть дебаг логи, чтобы посмотреть что он на самом деле передает?

-~{}~ 02.06.10 09:55:

А в явном виде, похоже, нельзя. Ужасно.

Получается, что если я хочу зароутить все подряд на индекс, нужен реврайт? Оххх...

Я понимаю, что привычка делать все-все-все ревратом у многих похапе-девелоперов сильна. Но когда веб сервер навязывает это как единственное решение... Ужас-ужас.

До Игоря Сысоева то, что это тупиковый путь и надо сделать явное задание фастцги-параметров, дошло еще где-то в версии 0.1.29 если я правильно помню, через недельку-другую после появления первого варианта реализации fastcgi (и вот там, в быстро отвергнутом варианте, было примерно так же, как в лайти).
 

sergos

Новичок
ну как бы оно. но эта опция как была прописана, так и сейчас прописана.

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

fixxxer

К.О.
Партнер клуба
Я вот начал тестировать реализацию fpm, которая сейчас в транке php (последний снэпшот), и наткнулся на проблему с новой фичей - pm status. Удивительно, но проблема оказалась схожей, и все растет из той невообразимой брутфорсоподобной хрени в старом унаследованном из CGI SAPI коде, которая творится при fix_pathinfo=1. В общем, я этот кусок переписал, завел баг 51983 и прицепил патч. Можешь попробовать взять снэпшот 5.3, наложить патч, и посмотреть, будет ли все работать со стандартным fastcgi-конфигом lighttpd?
 

sergos

Новичок
@fixxxer
Наконец то выдался свободный часок.

Собственно да, твои соображения верны.

Пропатчил снапшот твоим патчем, на той же конфигурации лайти все заработало.
При этом сразу бросилось в глаза: на неработающей версии было так:
Код:
$_SERVER[PATH_INFO] =>
на пропатченной стало:
Код:
$_SERVER[PATH_INFO] => /welcome/blabla/123
Все это здорово, но для продакшн не сгодится. поэтому откатился на проверенный 5.2.6. Будем ждать пока девелоперы исправят ситуацию.

зы
Интересна судьба патча, пустят ли в апстрим?

зыы
Видимо таки проблемы, описанные в моем первом посте - следствие баги. Посему предлагаю тему считать исчерпанной.
Всем спасибо за участие.
 
Сверху