В прошлой статье о FastCGi — Nginx. Использование PHP в режиме FastCGI с помощью php-fpm я рассказал как использовать php-fpm спаунер (надо сказать, что с тех времен все сильно поменялось, например вышел php 5.3.3 и php-fpm стал входить в дистрибутив php, а так же поменялся формат конфига php-fpm). Сегодня расскажу как использовать spawn-fcgi, некогда входивший в дистрибутив lighttpd, а ныне являющийся .
Установка
Перед установкой спаунера убедимся, что PHP собран с поддержкой CGi:
Далее заходим в порты и устанавливаем spawn-fcgi:
make install clean
Настройка
Отредактируйте «nginx.conf» и добавьте upstream:
server unix:/tmp/spawn-fcgi.sock;
}
Откройте на редактирование файл «/etc/rc.conf» и укажите необходимые настройки:
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», вот некоторые из них, о которых я не упоминал выше:
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:
nginx -s reload
Используемая версия spawn-fcgi — 1.6.3


Ай-ай-ай! Зачем людей плохому учишь?))) Кто-же это редактирует rc-скрипт когда все переменные можно по-нормальному задать в rc.conf?
Захочешь вот обновить spawn — а после переустановки все настройки в этом скрипте будут затерты свежеустановленной версией скрипта.
Да, ты прав, поначалу я так и сделал, но потом меня что-то перемкнуло, сейчас поправлю :)
А в чем разница php-fpm и spawn? Где скорость больше?
Спасибо, почитаю. А по личным ощущениям как?
Мне по функциональности нравится больше php-fpm, посмотрите его конфиг и станет понятно почему, думаю. А со spawn-fcgi я мало работал, ничего не могу сказать
php-fpm 5.3.3 я сейчас и использую, просто думал раз вы про spawn написали, то может есть какие-то преимущества;)
php-fpm прикольная вещичка...
А при такой настройке как настраивать в nginx.conf location'ы, где идут php скрипты?
так же как и в fpm, меняется только значение директивы fastcgi_pass с php-fpm на spawn-fcgi
вы не в курсе, если ставить spawn-fcgi, он с eaccelerator так же хорошо работает как и fpm?
так, взялся я за этот, ставится он проще...
значит пишу
upstream spawn-fcgi {
server unix:/tmp/spawn-fcgi.sock;
}
а потом в локэйшн
fastcgi_pass spawn-fcgi;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/user/www/site$fastcgi_script_name;
include fastcgi_params;
}
все верно?
да, все верно с виду, выполните nginx -t
окей, спасибо. помогите еще пожалуйста с одним моментом... если запросить скрипт, который не существует, выводится
No input file specified.
не получается составить правило
location ~ \.php$ {
try_files $uri 404;
}
даже существующие файлы распознаются как несуществующие...
Попробуйте:
пробовал, читал... на все выдает 404
уже решил проблему.
а вы не в курсе, можно как-то переопределить $_SERVER['DOCUMENT_ROOT']? а то он неверный
В Nginx это называет $document_root. Задается через директиву root, либо так:
...не работает allow по айпи, хотя deny all работает. Что это может быть?
пример
location /dir/ {
allow 11.11.11.11;
eny all;
}
постоянно выдает форбайдн
Что такое «eny»? Если просто опечатка, то приведите настоящий конфиг
allow 127.0.0.1;
deny all;
...
}
Вот так у меня работает прекрасно
извиняюсь, у меня в конфиге deny
просто мне нужно, чтоб если по правилу подходит
location /dir/ {
allow 11.11.11.11;
deny all;
}
искались локэйшэны дальше, а этого судя по всему не происходит...
и еще можете пожалуйста помочь сформировать правило location, которое будет на себя брать ВСЕ файлы кроме *.php ну и косой черты */
Мне кажется вы не верно используете location. Думаю вам надо использовать if:
return 403;
}
наверное как-то так:
if ($request_uri !~ (\.php|/)$) {
...
}
}
но мне кажется вы что-то не так спроектировали :)
хм, а я не совсем понял, в if'ах поддерживаются andы? например чтоб проверить и айпи и директорию
Насколько я помню — не поддерживаются. Но никто не отменял использование вложенных if'ов
if ... {
#...
}
}
неа, вложенные не кушает. а так же это if ($remote_addr != '11.11.11.11') неправильно
У вас какая версия nginx?
извиняюсь, if ($remote_addr != '11.11.11.11') работает, а вот вложенные ифы запрещенны
Ссори, наверное я попутал с чем-то другим. Но location точно есть вложенные
вопрос конкретно по php-fpm, но spawn-fcgi он в теории тоже касается. каждый воркер может одновременно обрабатывать только 1 запрос? т. е. если у меня 100 воркеров
одновременно могут выполняться только 100 запросов, так? если их будет больше, будет вылетать 502?
мде... и тишина.
В документацию не пробовали сходить? Там вроде как все написано
А как можно сделать несколько локейшенов для обработки 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$
Сразу, хочу поблагодарить за ваш столь информационный, познавательный сайт!
Помогите мне плз с проблемой, третий день бьюсь, никак не могу решить...
Поставить и наладить работу 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?
2Loki
Там аутентификацию нужно выключить в xcache.ini