Пользователь
0,0
рейтинг
15 августа 2009 в 21:49

Администрирование → Установка nginx + php-fpm + memcache + eaccelerator на FreeBSD

Зачем всё это? — спросите вы. Да просто захотелось поделиться с общественностью некоторым опытом, полученным в процессе оптимизации vds под нужды одного общеизвестного блого-социального движка, который на обычном хостинге чувствует себя, мягко скажем, некомфортно.

Началось всё с того, что я ушёл от firstvds, где уже ничто не спасёт от тормозов. Ушел на ганди.нет, взял одну шару (1 share), которую дали на месяц бесплатно. Кстати, акция эта (This summer, your server is free!) вроде еще не закончилась. ;) И начал на этой шаре проводить зверские эксперименты с установкой разного ПО. Тестировал результаты с помощью siege.

В итоге конфигурация из сабжа оказалась самая быстрая. Опытом её установки и настройки я и хотел бы с вами поделиться.

Перво-наперво обновляем дерево портов, если давно этого не делали. А если никогда не делали, то без этого дальше никуда:
# portsnap fetch update

NGINX


Устанавливаем последнюю стабильную версию nginx из портов:
# cd /usr/ports/www/nginx
# make install clean

Добавляем строку 'nginx_enable=«YES»' в файл '/etc/rc.conf'.

Основные настройки nginx по-умолчанию, чтобы знать где искать:
  • Конфиг: /usr/local/etc/nginx/nginx.conf
  • Порты http / https: 80 / 443
  • Логи ошибок: /var/log/nginx-error.log
  • Логи доступа: /var/log/nginx-access.log
  • Коневая папка: /usr/local/www/nginx/

PHP-FPM


Сначала ставим сам php:
# cd /usr/ports/lang/php5
# make install clean

Поддержка PHP в FreeBSD построена по модульному принципу, поэтому базовая установка обладает ограниченной функциональностью. Дополнительные расширения могут быть легко добавлены при помощи порта php5-extensions. Установим расширения, которые нам необходимы (например, mbstring, gd, mysql...):
# cd /usr/ports/lang/php5-extensions
# make install clean

Далее ставим патч php-fpm. В портах freebsd этот патч отсутствует, но это не беда. Предлагаю всё-таки поставить его через порт, а не собрать из исходников. Скачиваем порт для FreeBSD с сайта php-fpm.org и распаковываем в директорию портов по-умолчанию, откуда и устанавливаем:
# fetch php-fpm.anight.org/downloads/freebsd-port/php-5.2.10-fpm-0.5.13.tar.gz
# tar -xvf php-5.2.10-fpm-0.5.13.tar.gz -C /usr/ports/lang/
# cd /usr/ports/lang/php5-fpm
# make install clean

Добавляем строку 'php_fpm_enable=”YES"' в файл '/etc/rc.conf'.

Дружим NGINX и PHP


Заходим в кофиг нашего http-сервера. По-умолчанию он находится здесь '/usr/local/etc/nginx/nginx.conf'. Стираем всё. Для начала конфиг будет такой с минимумом настроек:
user www;
worker_processes 1;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;

server {
listen 80;
server_name localhost;

charset utf-8;

location / {
root /usr/local/www/nginx;
index index.php index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/www/nginx-dist;
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/nginx$fastcgi_script_name;
include fastcgi_params;
}
}
}

Детальное описание настроек конфигурационного файла можно найти тут и тут, поэтому подробно останавливаться не буду. Давеча вышла статья на Хабре про настройку nginx — рекомендую к просмотру.

Далее редактируем конфигурацию php-fpm. По-дефолту он лежит тут '/usr/local/etc/php-fpm.conf'. Находим в файле строки:
<!–- <value name=”user”>nobody</value> -–>
<!–- <value name=”group”>nobody</value> -–>

И меняем их на:
<value name=”user”>www</value>
<value name=”group”>www</value>

Тем самым указав пользователя и группу, под которыми будет крутиться php. Подробное описание этих и других настроек php-fpm есть на официальном сайте на русском языке.

MEMCACHE


Ставим расширение memcache:
# cd /usr/ports/databases/pecl-memcache
# make install clean

После чего заходим в файл '/usr/local/etc/php/extensions.ini', где добавляем строчку:
extension=memcache.so

EACCELERATOR


Устанавливаем:
# cd /usr/ports/www/eaccelerator
# make install clean

Аналогично memcache заходим в файл '/usr/local/etc/php/extensions.ini' и добавляем строчку:
extension=eaccelerator.so

Создаем папку, где eAccelerator будет хранить свой кэш, задаем владельца www и устанавливаем права:
# mkdir /tmp/eaccelerator
# chown www /tmp/eaccelerator
# chmod 0700 /tmp/eaccelerator

РЕЗУЛЬТАТ


Запускаем php и nginx:
# /usr/local/etc/rc.d/php-fpm start
# /usr/local/etc/rc.d/nginx start

Пришло время проверить, получилось ли у нас что-нибудь. :) Создаем файл '/usr/local/www/nginx/info.php' c содержимым "<?php phpinfo(); ?>". И смотрим результат в браузере: httр://ваш-домен/info.рhр — должно быть как-то так:

image

За рамки данной заметки вышли: установка mysql (ставится так же просто, как и всё остальное из портов) и куча различных настроек, читай тюнинга, всего этого великолепия. Но это огромный материал, который регулярно освещается на Хабре в той или иной мере по частям. Есть ли смысл собирать тюнинг всей связки в одной статье — пока не знаю. Спасибо за внимание. Мой первый топик здесь за два года присутствия. :)
Александръ @skachko
карма
82,7
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (48)

  • +5
    Ну хоть одна нормальная статья — человек все ставил из портов
    • 0
      Ну если поставить из портов достижение, то статья супер.
      А вообще какая-то банальная инфа.
      • +3
        А по-моему совершенно нормальная статья, структурированное описание по существу. Тем, у кого практика слабовата — самое то.
        • –28
          Статья для школьника который пытается настроить сервер.
          Наверно для вас актуально
          • +9
            Так поделитесь информацией, которая не для школьника… или вы можете только срать в комментариях?
            • –27
              только сру в комментариях.
              это лучше чем писать тупенькие статейки.
          • –7
            ахаха %) спалил школоту, молодцом!11

            статья кстате действительно «так себе», впрочем как и предыдущее повествование про nginx. очень слабенько и очень заметно что и сам автор не имеет опыта эксплуатации nginx и ко. :(

            пс: иногда читаешь такое непотребство и думаешь, может уже написать что-то действительно нормальное, но к счастью природная лень останавливает, ведь все написано в документации, а то что нет постигается через призму накопленого экспириенса. все хинты через статью все равно не сольешь :)
            • +3
              Если сами руководствуетесь таким принципом — то зачем тогда ждете хороших статей от других?
        • +5
          Написано «Серверная оптимизация», а внутри «Сервер для чайников».
          А так всё хорошо.
          • 0
            На Хабре нет такого блога. :)
            Долго думал, куда разместить заметку. Разумным показалось сюда.
    • +1
  • +5
    Хотелось бы увидеть, насколько увеличилась скорость? И вообще. что было, и что стало, желательно с цифрами, тогда будет о чем поговорить… а так, выглядит, как мануал :))) Но все равно спасибо, может пригодиться.
    • +5
      Я пользуюсь фёрствдс уже больше года. Все мои самописные движки нормально крутятся там. Норма понятие относительное, но 0,2-,0,3сек время генерации страниц меня устраивало за 150 рублей в месяц. Когда же я поставил ЛС, то вот что я увидел:

      * Работа с БД:
      * Запросов: 12
      * Время: 1,403 с.

      * Работа с кэшем:
      * Запросов: 17 из них
      * — записей: 8
      * — прочтений: 8
      * Время: 0,86129 с.

      * PHP:
      * Время загрузки модулей: 2,18 с.
      * Общее время загрузки страницы: 7,618 с.


      При это страница в браузе и правда грузилась ооочень долго. Смена тарифа на максимальный не особо помогла:

      Статистика производительности

      * Работа с БД:
      * Запросов: 12
      * Время: 0,239 с.

      * Работа с кэшем:
      * Запросов: 17 из них
      * — записей: 8
      * — прочтений: 8
      * Время: 0,83087 с.

      * PHP:
      * Время загрузки модулей: 1,037 с.
      * Общее время загрузки страницы: 4,384 с.


      Поставил nginx фронтэндом к апачу, на взгляд страницы стали отдаваться быстрее, но время работы скрипта не изменилось.

      Пошел искать другого хостера. Попал на ганди. :)
      Результаты на дефолтной LAMP под названием GandiOS порадовали — 0,5 сек в среднем генерация страниц ЛС начала занимать. Но я на этом не успокоился, поставил пустой Дебиан5 (там на выбор дают только оболочки линкса). Не все промежуточные тесты от siege сохранились. :(

      1) Debian + nginx + php-cgi + mysql:
      * Запросов: 12
      * Время: 0.026 с.

      * Работа с кэшем:
      * Запросов: 35 из них
      * — записей: 8
      * — прочтений: 26
      * Время: 0.068 с.

      * PHP:
      * Время загрузки модулей: 0.036 с.
      * Общее время загрузки страницы: 0.275 с.

      siege:
      Transactions: 5258 hits
      Availability: 100.00 %
      Elapsed time: 901.62 secs
      Data transferred: 11.61 MB
      Response time: 1.20 secs
      Transaction rate: 5.83 trans/sec
      Throughput: 0.01 MB/sec
      Concurrency: 6.97
      Successful transactions: 5258
      Failed transactions: 0
      Longest transaction: 11.27
      Shortest transaction: 0.10

      2) Debian + nginx + php-cgi + mysql + memcache +eaccelerator:
      * Работа с БД:
      * Запросов: 8
      * Время: 0.021 с.

      * Работа с кэшем:
      * Запросов: 31 из них
      * — записей: 4
      * — прочтений: 26
      * Время: 0.0057 с.

      * PHP:
      * Время загрузки модулей: 0.004 с.
      * Общее время загрузки страницы: 0.047 с.

      siege:
      Lifting the server siege… done. Transactions: 11010 hits
      Availability: 100.00 %
      Elapsed time: 900.37 secs
      Data transferred: 31.96 MB
      Response time: 0.30 secs
      Transaction rate: 12.23 trans/sec
      Throughput: 0.04 MB/sec
      Concurrency: 3.69
      Successful transactions: 11010
      Failed transactions: 0
      Longest transaction: 5.62
      Shortest transaction: 0.01
      • 0
        Да, прирост существенный, а не пробовал, то же самое, только без никса? то есть просто связка LAMP + memcache +eaccelerator? Было б действительно интересно, ведь тормозил судя по всему не Апач? Я правильно понял?

        Хотя результат — мне нравится. :)
        • 0
          без никса не выйдет. в ЛС очень много статики, из-за этого и тормоза. + там огромные js+css, они в сумме почти 400кб. их надо как-то ужимать. нгикс это на лету делает, ну и для статики нет ничего лучше. :)
          • 0
            Прости друг, полмега javascript & CSS ?!!! Может пропиаришься и в личку скинешь линк?

            Я надеюсь, это не виртуальная ось? :)
            • 0
              Да движок-то все знают. И проблемы его — тоже. ливстрит.ру. Попробуй скачать исходник и запустить без нгинкса на апаче. :) И каким-нибудь сервисом посчитать количество и вес js и css.
              • 0
                Сейчас борюсь с этими проблемами на полудохлом хостинге. Есть результаты.
                По мере написания хаков и оптимизации движка планирую отписаться в комьюнити.
                А вообще огромное спасибо хотя бы за то, что этого монстра удалось довести до релиза.
                Удачи Вам ;)
          • 0
            Прирост может дать если статику сжать изначально.
            у сысоева есть примеры конфигурации с отдачей заранее сжатого контента. должно уменьшить расходы на сжатие.
  • +1
    Меня как клиента firstVDS интересует упоминание о их тормозах — это у вас проект большой или они стали плохо работать?
    • 0
      Тоже хотел задать вопрос по этому же поводу. :)
      Сам пока не являюсь их клиентом, но в ближайшее время собираюсь им стать. У знакомого там вроде всё нормально работает.
      • 0
        А с ферстом кому как повезет ). У самого у них сервачок крутится, но fastvps.ru как то получше будет.
        • 0
          Сходил на fastvps.ru цены порадовали, особенно на выделенные сервера — супер!

          0 (ноль) в месяц! Берут только 149 за установку!!!
          Коммунизм видать уж близко! :)) А может это хитрый пиар ход?

          Теряюсь в догадках…

          Что еще у них не написано? :))))
          • 0
            Сходил еще раз, подумалось, а вдруг меня под утро глючит? Так и да, цена ( 0 ) правда помечено, что есть ссылка. сходил глянул, и мне кажется у меня опять глюк, что это:

            «После оплаты платы за установку и первого месяца использования, на Ваш счет в биллинг-системе FastVPS Ltd зачисляете месячная стоимость Вашего сервера, которая в дальнейшем может быть израсходована на любые услуги от FastVPS Ltd, в том числе на оплату выделенного сервера. „

            Что значит на любые услуги? И что значит “в том числе» ?!!! Что за услуги? Оплата кофе персоналу? Оплата счетов электричества? Или оплата услуг предоставленных мне? Как например — ребут кнопкой? Если последний пункт верный, то не проще просто, как все в мире, брать за поддержку отдельную плату, а не вычитать из уже оплаченной услуги ?! И сколько будет стоить ребут кнопкой? То же? Вот theplanet — берет за час поддержки определенную сумму, вне зависимости от сложности проблемы, и я понимаю, за что я плачу, плюс, я могу вообще отказаться от поддержки! И они возьмут только за сервер, работает он или нет- это уже мои проблемы.
            • 0
              Ну так firstvps тоже за поддержку берут на почасовой основе, но по подписке… Минимальная стоимость поддержки — пять часов работы специалиста.
              • 0
                Кроме почасовой у них есть иной механизм (поштучный что ли :) ), реализованный непосредственно в BillCnter-е. Суть в том, что они поделил все запросы в суппорт на категории и выставили им фиксированную стоимость. Вот скрин
    • 0
      фёрствдс — это лотерея. если повезет попасть на новый пустой сервер, где мало клентов — все будет летать. ну канал — отдельная песня. если — нет, на себе почувствуете, что такое жесточайший оверселлинг. мне не повезло.
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      да, конечно
      • НЛО прилетело и опубликовало эту надпись здесь
        • НЛО прилетело и опубликовало эту надпись здесь
          • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Без choot запускаем?
    • 0
      Я не специалист по безопасности. Chroot запущенная под рутом разве безопаснее запуска под юзером www, как описано в заметке?
      • +1
        В php-fpm дочерние процессы могут быть запущены в chroot окружении. Права на уровне фс это все же права на уровне фс, они не запрятет нам подняться выше docroot-а веб сервера. chroot же подняться выше docroot нам не даст.

        Понятно, что и при желании из chroot можно вырваться, но сделать это будет не так просто.
      • +1
        Правда я слышал от коллег, что chroot очень проблематично настроить так, чтобы все работало полноценно. Кто-нибудь может подтвердить конструктивно их слова или опровергнуть здесь? +1 будет от меня лично
  • +1
    А как вы FreeBSD туда поставили? На gandi.net, вроде, 8 вариантов разных Линуксов, никаким FreeBSD и не пахнет.
    • +4
      видимо человек использовал программу «депингвинатор» ^__^
    • 0
      На ганди я ставил на Дебиан5, что несколько сложнее — больше ручных операций. :)
      • 0
        На дебиан ставили фри?
        И ещё вопрос сколько слотов брали на ганди?
        • 0
          Нет. Как-то не догадался. :)
          FreeBSD у меня на другом vps стоит.
      • 0
        вообще да, дико нелогично звучит первый абзац… Я тоже на долго искал на gandi.net, где там у них freebsd :-)
        • 0
          freebsd скоро обещают, на неё больше всего заявок. можете тоже проголосовать там, где новые возможности.

          если хотите установку этого комплекса под дебиан, могу написать, т.к. не раз это проделывал и шпоры, как это быстрее сделать, сохранились.
  • +1
    Неплохая статья, в плане грамотной установки ПО.

    Однако есть ряд недостатков:
    * Отсутствие тюнинга самой ОС, чтобы сервер начал обслуживать адекватное кол-во коннектов(а ведь для этого обычно nginx и ставится) нужно подгонять sysctl'и aka «тюнинг по-Сысоеву» (как минимум kern.ipc.somaxconn, net.inet.ip.portrange.first итд)
    * ОС и nginx не использует httpready фильтр (kldload accf_http, accept_filter=httpready)
    * Отсудствие тюнинга самого nginx (worker_processes по кол-ву процессоров, sendfile on, tcp_nodelay on, reset_timedout_connection on; итд итп)
    * PHP на порту, а не сокете (юзаем путь к сокету php-fpm в переменной fastcgi_pass)
    * PHP-cgi необходимо передовать побольше параметров чем указано, например, не помешало бы добавить как минимум fastcgi_param REMOTE_ADDR $remote_addr;
  • 0
    Хотел бы заметить что в статье один fastcgi параметр написан не совсем правильно вроде из за этого не будет работать.

    fastcgi_param script_FILENAME /usr/local/www/nginx$fastcgi_script_name;
    fastcgi_param script_FILENAME /usr/local/www/nginx$fastcgi_script_name;
    • 0
      вот блин так он специально в нижний регистр переводит слово «script»
    • 0
      Эх что-же так низко написали )))
      Я день потратил, пока не сообразил.
    • 0
      Только сейчас прочитал этот комментарий, после того как и сам уже нашел в чем проблемма :)
      Автору неплохо бы отметить в статье что SCRIPT должен быть в верхнем регистре, раз уж парсер лох )

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