php-fastcgi

В прошлой статье о FastCGi — Nginx. Использование PHP в режиме FastCGI с помощью php-fpm я рассказал как использовать php-fpm спаунер (надо сказать, что с тех времен все сильно поменялось, например вышел php 5.3.3 и php-fpm стал входить в дистрибутив php, а так же поменялся формат конфига php-fpm). Сегодня расскажу как использовать spawn-fcgi, некогда входивший в дистрибутив lighttpd, а ныне являющийся отдельным проектом.

Установка

Перед установкой спаунера убедимся, что PHP собран с поддержкой CGi:

[X] CGI        Build CGI version

Далее заходим в порты и устанавливаем spawn-fcgi:

cd /usr/ports/www/spawn-fcgi
make install clean

Настройка

Отредактируйте «nginx.conf» и добавьте upstream:

upstream spawn-fcgi {
    server unix:/tmp/spawn-fcgi.sock;
}

Откройте на редактирование файл «/etc/rc.conf» и укажите необходимые настройки:

# При запуске системы загружать spawn-fcgi
spawn_fcgi_enable="YES"

# Пользователь от которой работать будет php-cgi
spawn_fcgi_username="www"

# Группа
spawn_fcgi_groupname="www"

# Путь до unix-сокета, именно его мы используем
spawn_fcgi_bindsocket="/tmp/spawn-fcgi.sock"

# Количество запущенных php-cgi процессов
spawn_fcgi_children="5"

# Кол-во запросов, после которых перезагружается процесс (для предотвращения утечек памяти)
spawn_fcgi_max_requests="1000"

Полный перечень допустимых настроек можно посмотреть в «/usr/local/etc/rc.d/spawn-fcgi», вот некоторые из них, о которых я не упоминал выше:

# Путь до php-cgi приложения
spawn_fcgi_app="/usr/local/bin/php-cgi"

# Дополнительные аргументы для php-cgi (их можно узнать командой "php-cgi -h")
spawn_fcgi_app_args=""

# Вы можете указать путь до песочницы
spawn_fcgi_chroot_dir=""

# IP адрес, который будет слушать демон
spawn_fcgi_bindaddr="127.0.0.1"

# Соответственно порт
spawn_fcgi_bindport="9000"

# Путь до PID файла
spawn_fcgi_pidfile="/var/run/spawn-fcgi.pid"

# Права на файл unix-сокета
spawn_fcgi_bindsocket_mode="0777"

Запуск

Запускаем spawn-fcgi и перезагружаем nginx:

/usr/local/etc/rc.d/spawn-fcgi start
nginx -s reload

Используемая версия spawn-fcgi — 1.6.3


Комментарии (36) на запись «Nginx. Использование PHP в режиме FastCGI с помощью spawn-fcgi»

» Трекбеки скрыты, показать их?
  1. ash2k | 26.11.2010 в 07:12

    Ай-ай-ай! Зачем людей плохому учишь?))) Кто-же это редактирует rc-скрипт когда все переменные можно по-нормальному задать в rc.conf?

    Захочешь вот обновить spawn — а после переустановки все настройки в этом скрипте будут затерты свежеустановленной версией скрипта.

  2. adw0rd | 26.11.2010 в 18:48

    Да, ты прав, поначалу я так и сделал, но потом меня что-то перемкнуло, сейчас поправлю :)

  3. Михаил | 27.11.2010 в 23:02

    А в чем разница php-fpm и spawn? Где скорость больше?

  4. adw0rd | 27.11.2010 в 23:52

    spawn-fcgi vs php-fpm

    www.twitpic.com/1dxswp/full

  5. Михаил | 28.11.2010 в 01:25

    Спасибо, почитаю. А по личным ощущениям как?

  6. adw0rd | 28.11.2010 в 04:49

    Мне по функциональности нравится больше php-fpm, посмотрите его конфиг и станет понятно почему, думаю. А со spawn-fcgi я мало работал, ничего не могу сказать

  7. Михаил | 28.11.2010 в 11:37

    php-fpm 5.3.3 я сейчас и использую, просто думал раз вы про spawn написали, то может есть какие-то преимущества;)

  8. Леха | 10.12.2010 в 19:28

    php-fpm прикольная вещичка...

  9. Fighter | 03.01.2011 в 01:31

    А при такой настройке как настраивать в nginx.conf location'ы, где идут php скрипты?

  10. adw0rd | 03.01.2011 в 13:17

    так же как и в fpm, меняется только значение директивы fastcgi_pass с php-fpm на spawn-fcgi

  11. Fighter | 04.01.2011 в 14:07

    вы не в курсе, если ставить spawn-fcgi, он с eaccelerator так же хорошо работает как и fpm?

  12. Fighter | 04.01.2011 в 19:29

    так, взялся я за этот, ставится он проще...

    значит пишу

    upstream spawn-fcgi {

    server unix:/tmp/spawn-fcgi.sock;

    }

    а потом в локэйшн

    location / {
                fastcgi_pass   spawn-fcgi;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /home/user/www/site$fastcgi_script_name;
                include        fastcgi_params;
            }

    все верно?

  13. adw0rd | 04.01.2011 в 20:11

    да, все верно с виду, выполните nginx -t

  14. Fighter | 04.01.2011 в 20:15

    окей, спасибо. помогите еще пожалуйста с одним моментом... если запросить скрипт, который не существует, выводится

    No input file specified.

    не получается составить правило

    location ~ \.php$ {

    try_files $uri 404;

    }

    даже существующие файлы распознаются как несуществующие...

  15. adw0rd | 04.01.2011 в 20:20

    Попробуйте:

    try_files $uri =404;

    sysoev.ru/nginx/docs/http...e.html#try_files

  16. Fighter | 04.01.2011 в 20:33

    пробовал, читал... на все выдает 404

  17. Fighter | 04.01.2011 в 21:00

    уже решил проблему.

  18. Fighter | 04.01.2011 в 22:27

    а вы не в курсе, можно как-то переопределить $_SERVER['DOCUMENT_ROOT']? а то он неверный

  19. adw0rd | 04.01.2011 в 23:02

    В Nginx это называет $document_root. Задается через директиву root, либо так:

    fastcgi_param  DOCUMENT_ROOT /path/to/;

  20. Fighter | 05.01.2011 в 03:16

    ...не работает allow по айпи, хотя deny all работает. Что это может быть?

    пример

    location /dir/ {

    allow 11.11.11.11;

    eny all;

    }

    постоянно выдает форбайдн

  21. adw0rd | 05.01.2011 в 10:46

    Что такое «eny»? Если просто опечатка, то приведите настоящий конфиг

    location / {
        allow 127.0.0.1;
        deny all;
        ...
    }

    Вот так у меня работает прекрасно

  22. Fighter | 05.01.2011 в 11:00

    извиняюсь, у меня в конфиге deny

    просто мне нужно, чтоб если по правилу подходит

    location /dir/ {

    allow 11.11.11.11;

    deny all;

    }

    искались локэйшэны дальше, а этого судя по всему не происходит...

    и еще можете пожалуйста помочь сформировать правило location, которое будет на себя брать ВСЕ файлы кроме *.php ну и косой черты */

  23. adw0rd | 05.01.2011 в 12:39

    просто мне нужно, чтоб если по правилу подходит

    location /dir/ {
    allow 11.11.11.11;
    deny all;
    }

    искались локэйшэны дальше, а этого судя по всему не происходит...

    Мне кажется вы не верно используете location. Думаю вам надо использовать if:

    if ($remote_addr != '11.11.11.11') {
        return 403;
    }

  24. adw0rd | 05.01.2011 в 13:27

    и еще можете пожалуйста помочь сформировать правило location, которое будет на себя брать ВСЕ файлы кроме *.php ну и косой черты */

    наверное как-то так:

    location / {
        if ($request_uri !~ (\.php|/)$) {
            ...
        }
    }

    но мне кажется вы что-то не так спроектировали :)

  25. Fighter | 05.01.2011 в 14:06

    хм, а я не совсем понял, в if'ах поддерживаются andы? например чтоб проверить и айпи и директорию

  26. adw0rd | 05.01.2011 в 14:26

    Насколько я помню — не поддерживаются. Но никто не отменял использование вложенных if'ов

    if ... {
        if ... {
            #...
        }
    }

  27. Fighter | 05.01.2011 в 19:55

    неа, вложенные не кушает. а так же это if ($remote_addr != '11.11.11.11') неправильно

  28. adw0rd | 05.01.2011 в 21:47

    У вас какая версия nginx?

  29. Fighter | 05.01.2011 в 23:34

    извиняюсь, if ($remote_addr != '11.11.11.11') работает, а вот вложенные ифы запрещенны

    syntax: if (условие) { ... }

    default: нет

    context: server, location

  30. adw0rd | 06.01.2011 в 00:07

    Ссори, наверное я попутал с чем-то другим. Но location точно есть вложенные

  31. Coder | 11.01.2011 в 14:12

    вопрос конкретно по php-fpm, но spawn-fcgi он в теории тоже касается. каждый воркер может одновременно обрабатывать только 1 запрос? т. е. если у меня 100 воркеров

    <value name="max_children">100</value>

    одновременно могут выполняться только 100 запросов, так? если их будет больше, будет вылетать 502?

  32. Coder | 24.01.2011 в 21:21

    мде... и тишина.

  33. adw0rd | 24.01.2011 в 23:53

    В документацию не пробовали сходить? Там вроде как все написано

  34. nrr | 01.03.2011 в 03:45

    А как можно сделать несколько локейшенов для обработки index.php с различными параметрами, при том что правило rewrite (аналогично .htacces) стоит перед этими правилами,

    суть:

    location / {

    root /.../httpdocs;

    index index.php;

    if (!-e $request_filename) {

    rewrite ^/(.*) /index.php last;

    }

    }

    location ~ \.php$ {

    root /.../httpdocs;

    fastcgi_pass 127.0.0.1:9000;

    fastcgi_cache mainzone;

    fastcgi_cache_valid 200 302 304 15m;

    fastcgi_cache_valid 301 1h;

    fastcgi_cache_valid any 5m;

    fastcgi_cache_min_uses 1;

    fastcgi_connect_timeout 5m;

    fastcgi_read_timeout 5m;

    fastcgi_send_timeout 5m;

    fastcgi_cache_key «$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri»;

    fastcgi_cache_bypass $cookie_COOKIE;

    fastcgi_no_cache $cookie_COOKIE;

    fastcgi_hide_header «Set-Cookie»;

    fastcgi_ignore_headers «Cache-Control» «Expires» «Set-Cookie»;

    fastcgi_cache_use_stale updating error timeout invalid_header http_500;

    fastcgi_temp_path /var/www/nginx/temp/ 1 2;

    include /etc/nginx/fastcgi_params;

    fastcgi_index index.php;

    fastcgi_param SCRIPT_FILENAME /.../httpdocs$fastcgi_script_name;

    }

    в location / передаются параметры запроса для обработки SEF урл-ов

    надо, чтобы часть url-ов не кешировалась,

    часть кешировалась, как это сделано в location ~ \.php$

  35. Loki | 10.11.2011 в 05:14

    Сразу, хочу поблагодарить за ваш столь информационный, познавательный сайт!

    Помогите мне плз с проблемой, третий день бьюсь, никак не могу решить...

    Поставить и наладить работу nginx + php-cgi через spawn-fcgi удалось довольно таки быстро,

    проблемы начались с подключения к PHP xcache.

    После подключения nginx на каждый второй запрос начал отвечать 502-ым bad gateway даже чаще,

    в логах nginx

    «upstream prematurely closed connection while reading response header from upstream» ?

    В чем может быть проблема, запускаю какой-нить скрипт php-cgi -f phpinfo.php норм запускается? это значит проблема

    spawn-fcgi?

  36. Slam | 27.01.2012 в 16:47

    2Loki

    Там аутентификацию нужно выключить в xcache.ini

Оставить комментарий