Всё же не удержусь и напишу последний мануал для Lenny. Гугл завален неправильно написанными мануалами про php-fpm+nginx на debian. Надеюсь, что вы попали на эту страничку сразу, а не читали перевод мануала с howtoforge с гениальной конструкцией sudo echo … >> /etc/apt/sources.list… Убил бы к чертям собачьим тех, кто не пробует свои же мануалы.
Мануал пишу на коленке, сроки ограничены. Буду краток. Все команды выполняем от рута. Без всяких sudo. Это важно.
root@php-fpm-nginx-server:~# echo "deb http://backports.debian.org/debian-backports lenny-backports main" >> /etc/apt/sources.list && aptitude update
root@php-fpm-nginx-server:~# aptitude install -t lenny-backports "nginx"
root@php-fpm-nginx-server:~# echo "deb http://php53.dotdeb.org lenny all" >> /etc/apt/sources.list && aptitude update
root@php-fpm-nginx-server:~# aptitude install php5-cli php5-common php5-suhosin
root@php-fpm-nginx-server:~# aptitude install php5-fpm php5-cgi
Далее. В файл виртуального хоста у nginx добавляем конфигурацию для location .php$
Тем самым мы включим обработку файлов .php нашим php-fpm демоном.
Если вы не догадываетесь куда вписать этот кусок конфига — вы можете не читать эту статью дальше. Лучше настройте apache. Вы вообще вряд ли знаете зачем нужен php-fpm.
Если догадываетесь но не знаете — то советую вписывать всё это после location / { … } у необходимого виртуального хоста или в /etc/nginx/sites-enabled/default , если вы собираетесь держать только 1 сайт.
Внимание. Не забудьте написать весь остальной конфиг для виртуального хоста. Если вам в этом нужна помощь — то пишите мелким подчерком на vlad@debian.pro , помогу.
Итак. Наконец то. Искомый кусок конфига:
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
include 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_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
Все директивы я взял с того самого кривого мануала на howtoforge. Работает. Но всё же советую почитать о каждой директиве.
root@php-fpm-nginx-server:~# /etc/init.d/nginx restart
root@php-fpm-nginx-server:~# /etc/init.d/php5-fpm restart
Всё. Php работает. При условии, что сайт валяется в /var/www пишем echo "" > /var/www/phpinfo.php
в консоли и радостно бежим по http://гдетамнашсервер/phpinfo.php проверять работу php.
Всё. Поставили. Работает. Без мучания мозга.
Дальше можете читать любые мануалы по настройке — они более или менее верные.
echo … | sudo tee some_system_file
спасет отца русской демократии, логиниться под рутом больше не нужно.
указывать разные имена дистров для источников не очень кошерно, вот станет squeezy stable и поломается что-нибудь в зависимостях.
по поводу конфига ничего не скажу, с fastcgi дела практически не имел, но таймауты какие-то уж очень большие, а буферы мелкие.
upd.
конечно надо так:
echo … | sudo tee -a some_system_file
а то перезапишет :)
если надо вписать несколько строк, то можно
(cat | sudo tee -a some_system_file) << stopword
и когда фантазия иссякнет stopword
а вообще, в убунточке считается кошерным добавлять в отдельных файлах в /etc/apt/source.list.d/
в дебиане еще не так? когда я на нем был, каталог там такой уже сделали, но пустой, ЕМНИП
Этот мануал написан не для убунты, не для будущих дебианов. Этот мануал написан именно для Lenny.
> а вообще, в убунточке считается кошерным добавлять в отдельных файлах в /etc/apt/source.list.d/
Nobody cares) один файл всё ещё удобнее.
что-то не работает… кучу пакетов обновить требует.. так до сквизи обновлять все?) О_о
Если просит обновить пакеты — то всё верно.
До сквизи обновляться не нужно.
Покажите вывод аптитуда… ну или в жаббер мне стукните — помогу.
Огромное спасибо за мануал, все отлично стало. Но у меня возник вопрос: есть какие-нибудь тонкости при установке eAccelerator`a на связку nginx+php-fmp? В который раз уже пытаюсь — не выходит.
Ага. Есть. eaccelerator для php-fpm ставится командой aptitude install php-apc =)))
А если серьёзно, то что именно за проблемы там?
С акселераторами пока разобрался. Есть такая трабла: ставлю webmin, nginx+php-fmp, mysql, wordpress. Только в вордпрессе захожу в админку что-то сжирает всю память и сервер перестает откликаться. Что это может быть и как с этим бороться?
htop попробуйте открытым в это вермя оставить и посмотреть что именно ест память.
Посмотрел: php-fpm: pool www. И их количество увеличивается.
max_children ограничь. в файле php-fpm.conf
Спасибо за прекрасный FAQ, все отлично заработало даже на Debian Squeeze.
Спасибо. Действительно как то по ленни не пойми что пишут:)
Верна ли информация, что php-apc актуален только для php в режиме модуля, отсутствует поддержка FastCGI, кеширование работает только с модулем apache mod_php и для php-fpm нужно использовать eAccelerator или XCache?
Неверна. APC прекрасно работает с fcgi. Только настраивать нужно.
А из трех акселераторов есть какому отдать предпостение?
Если apc настроите так, чтобы он в один пул для всех fcgi процессов работал — то сидите на нем.
А пример конфига для apc не могли бы показать? Странно, но для eAccelerator и XCache хватает инфы с которой можно нормально начать эксперементировать, а по apc как-то не очень.
http://www.brandonturner.net/blog/2009/07/fastcgi_with_php_opcode_cache/ вот это попробуйте почитать. Там в конце пример конфига, должен подойти.
Судя по графикам по адресу сайт/apc.php как и заявлено скомпилированные срипты занимают часть оперативки. Не в курсе зачем тогда для eAccelerator необходимо в темпе создавать отдельную директорию? Или eAccelerator не только хранит скомпилированные срипты?
Затем, что eaccelerator неспособен её сам создать хД
Если честно — никогда им не пользовался, после двух попыток заставить с ним работать не очень мейнстримные CMS — он криво кешировал.
А чем можно корректно проверить результат работы акселераторов? Что бы можно было объективно их сравнить.
Поставить каждый из них по очереди и пострелять siege’м по набору страниц одинаковых.
Попалась информация, что APC будет по умолчанию включен в PHP 6-й версии. Похоже не без основания.
Вам не приходилось использовать кэширование средствами nginx?
Приходилось, но никому ничего рассказывать я про это не буду — недостаточно опыта, да и рассказывать придется слишком много.
Тут лучше сысоева почитать или wiki.nginx.org.
А с такой ситуацией не сталкивались:
Сколько раз запрашиваю одну страницу, каждый раз создается новый файл в папке кэша nginx. При этом по тесту ab разница при включеном кэшировании и без 1с и 30с, соотвественно. Есть такому логическое объяснение?
Не видел такого (или не смотрел).
Можно ли сделает фронтендом сервер с nginx и бэкендами несколько сервером php-fpm? Если да, то каким образом будет выглядеть конфиг?
Раньше у меня стоял фронтенд на nginx и бэкенды со связками nginx+apache+php (nginx=статика, apache+php=динамика). Очень криво и не оптимально :)
upstream fpm {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
}
server {
location / {
proxy_pass http://fpm;
}
}
Примерно так
Как считаете, будет ли целесообразно делать связку nginx (front-end) + php-fpm (back-end) ? Все равно получается, что php-fpm отдает и статику и динамику нгинксу? Может лучше сделать связку nginx (front-end) + nginx & php-fpm (back-end) ?
php-fpm не может отдавать статику. Никак.
Теперь попытайтесь понять что вы написали =)
Я не совсем понимаю, каким образом nginx, который на фронтенде получает статику, что на бэкенде … ведь у него нет доступа, точнее, может и есть, но видимо через php-fpm /// проясните этот момент, если не тяжело :)
Когда nginx и php-fpm установлены на одном компе, то вообщем всё понятно у обоих есть доступ к файловой системе, а когда они на разных серверах — вот тут для меня загадка … Как я говорил выше, ранее у меня фронтендом выступал nginx, а бэкендом связка nginx+apache+php. Тут всё было понятно.
На фронтэнде ставьте nginx.
На бэкэнде — php-fpm.
Статику либо кладите на фронтэнд и отдавайте сразу отсюда, либо на бэк и отдавайте оттуда nginx’ом.
Т.е.
location / -> nginx-backend
location ~ \.php$ -> fpm-backend
Так вот что означала фраза в каком-то мануале «если конечно приложение поддерживает данную схему»! Может стоит реализовать схему nginx (f-e) + nginx & php-fpm (b-e) ? Потому что разделить наверное не получиться …
Зачем вам php-fpm проксировать 2 раза? Читайте вдумчиво мой предыдущий комментарий.
У вас бэкэнд должен быть с nginx и fpm. Но работать они могут отдельно, светясь портами наружу.
Хотя, вы можете fpm светить сокетом, тогда ваша мысль правильная, в общем-то. Но я бы на вашем месте проверил производительность двух схем, скорее всего, моя быстрее окажется.
Спасибо за советы. Клевый блог — буду тут почаще :)
Не за что)
Блин, почти всё получилось, но вот незадача — fpm не видит индексы (именно index.php)
схема такая:
location / -> nginx-backend
location ~ \.php$ -> fpm-backend
Вот конфиг nginx (front-end)
location / {
proxy_pass http://10.0.0.10;
}
location ~ \.php$ {
fastcgi_pass 10.0.0.10:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
include fastcgi_params;
}
ну а
index index.php;
строчку написать не желаете) ?
писал уже :(
location ~ \.php$ {
index index.php; …
и тут тоже:
location / {
proxy_pass http://10.0.0.10;
index index.php index.html index.htm;
#try_files $uri $uri/ /index.php;
}
Причем, вариант с try_files работает только в случае с http://site.ru/, но при доступе к http://site.ru/anydir/ выдает http://site.ru/index.php
index пишите не в location, а в server {} над локами.
try_files на удаленный сервер вряд ли отработает.
Привел к виду:
server {
location ~ \.php$ { … }
location / { … }
index index.php;
}
Не работает (((
p.s. и я конечно же не забываю перезагружать nginx
Директиву index нужно писать перед теми location, на которые она должна действовать.
И напишите location для php по всем правилам, как в мануале написано.
скинул вам на почту, а то боюсь, как бы из-за меня данная страничка блога не превратилась в мусорку :)
походу php5-fpm выкинули из бекпортов сквизя. Теперь только подключать тестинг репозиторий. Или этот http://www.dotdeb.org/
О! еще один dot.deb гуру. PHP5-FPM в stable для Debian не было и нет, и неизвестно еще как долго не будет, может с выходом PHP 5.4 пошевелятся, хотя их понять можно, как не работал php5-fpm стабильно так и не работает, ни через TCP stack ни через Sock. Удачи всем в поиске.
Да не, в целом dotdeb я не очень жалую. А учитывая новый статус backports, туда можно вообще не ходить почти) Вот только за такими редкими исключениями.
При условии, что сайт валяется в /var/www . А при условии что валяется в /home/$user/www ?? у меня сервер ошибку дает , в логах PHP-fpm «доступ запрещен » ? как исправить ? заранее спс)
https://ru.wikipedia.org/wiki/Chmod
https://ru.wikipedia.org/wiki/Chown