Debian.pro

Блог для пользователей и администраторов Debian


Debian. nginx + php-fpm. Настраиваем без криков «да что ж оно не работает то!»

Всё же не удержусь и напишу последний мануал для 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.

Всё. Поставили. Работает. Без мучания мозга.
Дальше можете читать любые мануалы по настройке — они более или менее верные.


Комментарии (50):

  1. anonymous :

    echo … | sudo tee some_system_file

    спасет отца русской демократии, логиниться под рутом больше не нужно.

    указывать разные имена дистров для источников не очень кошерно, вот станет squeezy stable и поломается что-нибудь в зависимостях.

    по поводу конфига ничего не скажу, с fastcgi дела практически не имел, но таймауты какие-то уж очень большие, а буферы мелкие.

  2. anonymous :

    upd.

    конечно надо так:
    echo … | sudo tee -a some_system_file
    а то перезапишет :)

    если надо вписать несколько строк, то можно
    (cat | sudo tee -a some_system_file) << stopword
    и когда фантазия иссякнет stopword

    а вообще, в убунточке считается кошерным добавлять в отдельных файлах в /etc/apt/source.list.d/
    в дебиане еще не так? когда я на нем был, каталог там такой уже сделали, но пустой, ЕМНИП

  3. Этот мануал написан не для убунты, не для будущих дебианов. Этот мануал написан именно для Lenny.

    > а вообще, в убунточке считается кошерным добавлять в отдельных файлах в /etc/apt/source.list.d/

    Nobody cares) один файл всё ещё удобнее.

  4. Arman :

    что-то не работает… кучу пакетов обновить требует.. так до сквизи обновлять все?) О_о

  5. Если просит обновить пакеты — то всё верно.
    До сквизи обновляться не нужно.
    Покажите вывод аптитуда… ну или в жаббер мне стукните — помогу.

  6. Drew :

    Огромное спасибо за мануал, все отлично стало. Но у меня возник вопрос: есть какие-нибудь тонкости при установке eAccelerator`a на связку nginx+php-fmp? В который раз уже пытаюсь — не выходит.

  7. Ага. Есть. eaccelerator для php-fpm ставится командой aptitude install php-apc =)))
    А если серьёзно, то что именно за проблемы там?

  8. Drew :

    С акселераторами пока разобрался. Есть такая трабла: ставлю webmin, nginx+php-fmp, mysql, wordpress. Только в вордпрессе захожу в админку что-то сжирает всю память и сервер перестает откликаться. Что это может быть и как с этим бороться?

  9. htop попробуйте открытым в это вермя оставить и посмотреть что именно ест память.

  10. Drew :

    Посмотрел: php-fpm: pool www. И их количество увеличивается.

  11. max_children ограничь. в файле php-fpm.conf

  12. Спасибо за прекрасный FAQ, все отлично заработало даже на Debian Squeeze.

  13. ast :

    Спасибо. Действительно как то по ленни не пойми что пишут:)

  14. Дмитрий :

    Верна ли информация, что php-apc актуален только для php в режиме модуля, отсутствует поддержка FastCGI, кеширование работает только с модулем apache mod_php и для php-fpm нужно использовать eAccelerator или XCache?

  15. Неверна. APC прекрасно работает с fcgi. Только настраивать нужно.

  16. Дмитрий :

    А из трех акселераторов есть какому отдать предпостение?

  17. Если apc настроите так, чтобы он в один пул для всех fcgi процессов работал — то сидите на нем.

  18. Дмитрий :

    А пример конфига для apc не могли бы показать? Странно, но для eAccelerator и XCache хватает инфы с которой можно нормально начать эксперементировать, а по apc как-то не очень.

  19. http://www.brandonturner.net/blog/2009/07/fastcgi_with_php_opcode_cache/ вот это попробуйте почитать. Там в конце пример конфига, должен подойти.

  20. Дмитрий :

    Судя по графикам по адресу сайт/apc.php как и заявлено скомпилированные срипты занимают часть оперативки. Не в курсе зачем тогда для eAccelerator необходимо в темпе создавать отдельную директорию? Или eAccelerator не только хранит скомпилированные срипты?

  21. Затем, что eaccelerator неспособен её сам создать хД
    Если честно — никогда им не пользовался, после двух попыток заставить с ним работать не очень мейнстримные CMS — он криво кешировал.

  22. Дмитрий :

    А чем можно корректно проверить результат работы акселераторов? Что бы можно было объективно их сравнить.

  23. Поставить каждый из них по очереди и пострелять siege’м по набору страниц одинаковых.

  24. Дмитрий :

    Попалась информация, что APC будет по умолчанию включен в PHP 6-й версии. Похоже не без основания.
    Вам не приходилось использовать кэширование средствами nginx?

  25. Приходилось, но никому ничего рассказывать я про это не буду — недостаточно опыта, да и рассказывать придется слишком много.
    Тут лучше сысоева почитать или wiki.nginx.org.

  26. Дмитрий :

    А с такой ситуацией не сталкивались:
    Сколько раз запрашиваю одну страницу, каждый раз создается новый файл в папке кэша nginx. При этом по тесту ab разница при включеном кэшировании и без 1с и 30с, соотвественно. Есть такому логическое объяснение?

  27. Не видел такого (или не смотрел).

  28. Андрей :

    Можно ли сделает фронтендом сервер с nginx и бэкендами несколько сервером php-fpm? Если да, то каким образом будет выглядеть конфиг?

    Раньше у меня стоял фронтенд на nginx и бэкенды со связками nginx+apache+php (nginx=статика, apache+php=динамика). Очень криво и не оптимально :)

  29. upstream fpm {
    server backend1.example.com weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;
    }

    server {
    location / {
    proxy_pass http://fpm;
    }
    }

    Примерно так

  30. Андрей :

    Как считаете, будет ли целесообразно делать связку nginx (front-end) + php-fpm (back-end) ? Все равно получается, что php-fpm отдает и статику и динамику нгинксу? Может лучше сделать связку nginx (front-end) + nginx & php-fpm (back-end) ?

  31. php-fpm не может отдавать статику. Никак.
    Теперь попытайтесь понять что вы написали =)

  32. Андрей :

    Я не совсем понимаю, каким образом nginx, который на фронтенде получает статику, что на бэкенде … ведь у него нет доступа, точнее, может и есть, но видимо через php-fpm /// проясните этот момент, если не тяжело :)

  33. Андрей :

    Когда nginx и php-fpm установлены на одном компе, то вообщем всё понятно у обоих есть доступ к файловой системе, а когда они на разных серверах — вот тут для меня загадка … Как я говорил выше, ранее у меня фронтендом выступал nginx, а бэкендом связка nginx+apache+php. Тут всё было понятно.

  34. На фронтэнде ставьте nginx.
    На бэкэнде — php-fpm.
    Статику либо кладите на фронтэнд и отдавайте сразу отсюда, либо на бэк и отдавайте оттуда nginx’ом.
    Т.е.
    location / -> nginx-backend
    location ~ \.php$ -> fpm-backend

  35. Андрей :

    Так вот что означала фраза в каком-то мануале «если конечно приложение поддерживает данную схему»! Может стоит реализовать схему nginx (f-e) + nginx & php-fpm (b-e) ? Потому что разделить наверное не получиться …

  36. Зачем вам php-fpm проксировать 2 раза? Читайте вдумчиво мой предыдущий комментарий.
    У вас бэкэнд должен быть с nginx и fpm. Но работать они могут отдельно, светясь портами наружу.

    Хотя, вы можете fpm светить сокетом, тогда ваша мысль правильная, в общем-то. Но я бы на вашем месте проверил производительность двух схем, скорее всего, моя быстрее окажется.

  37. Спасибо за советы. Клевый блог — буду тут почаще :)

  38. Не за что)

  39. Андрей :

    Блин, почти всё получилось, но вот незадача — 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;
    }

  40. ну а
    index index.php;
    строчку написать не желаете) ?

  41. Андрей :

    писал уже :(
    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

  42. index пишите не в location, а в server {} над локами.
    try_files на удаленный сервер вряд ли отработает.

  43. Андрей :

    Привел к виду:

    server {
    location ~ \.php$ { … }
    location / { … }

    index index.php;
    }

    Не работает (((
    p.s. и я конечно же не забываю перезагружать nginx

  44. Директиву index нужно писать перед теми location, на которые она должна действовать.
    И напишите location для php по всем правилам, как в мануале написано.

  45. Андрей :

    скинул вам на почту, а то боюсь, как бы из-за меня данная страничка блога не превратилась в мусорку :)

  46. Roma :

    походу php5-fpm выкинули из бекпортов сквизя. Теперь только подключать тестинг репозиторий. Или этот http://www.dotdeb.org/

  47. SergioXII :

    О! еще один dot.deb гуру. PHP5-FPM в stable для Debian не было и нет, и неизвестно еще как долго не будет, может с выходом PHP 5.4 пошевелятся, хотя их понять можно, как не работал php5-fpm стабильно так и не работает, ни через TCP stack ни через Sock. Удачи всем в поиске.

  48. Да не, в целом dotdeb я не очень жалую. А учитывая новый статус backports, туда можно вообще не ходить почти) Вот только за такими редкими исключениями.

  49. Михаил :

    При условии, что сайт валяется в /var/www . А при условии что валяется в /home/$user/www ?? у меня сервер ошибку дает , в логах PHP-fpm «доступ запрещен » ? как исправить ? заранее спс)

Написать комментарий