Как настроить веб-сервер на ubuntu с оптимальной производительностью


В интернете достаточно руководств, которые описывают, как легко и просто настроить LAMP сервер (Linux+Apache+MySQL+PHP). Во всех современных дистрибутивах линукса все это делается в несколько команд и не представляет никаких затруднений.

Однако стоит различать просто установку пакетов и настройку сервера хотя бы с оптимальной производительностью. Конечно, говоря о сервере, для собственных нужд, например, офиса, в котором работает что-то около 150 человек и сервер скорее всего не будет получать и 2-х запросов в секунду, можно особо не мучаться и поставить все из пакетов с дефолтными настройками.

Ну а наша задача, сегодня, сделать сервер, который можно использовать в продакш проекте, где будет и нагрузка и некоторое количество запросов в секунду. Рассмотрим мы все на примере небольшого масштаба. Однако, именно такую модель настройки можно положить и на более крупные проекты. Так же я хочу обратить внимание, что настраивать мы будет сервер с оптимальной производительностью. Если же требуется максимальная, то тут больше шаманства и как минимум распределенная архитектура (в идеале).

Итак, что мы будем делать.

Сервер

В качестве сервера будем использовать облачный инстанс с минимальными характеристиками. Мы, в последнее время, постоянно используем DigitalOcean.com — это отличный провайдер облачных IaaS услуг, при этом все их дроплеты работают на SSD, что гут. Да и цены радуют (минимальный по характеристикам дроплет — 5$/мес.).

Веб-сервер

Использовать будем обычный Apache, из репозитория. Использовать nginx для проксирования смысла не вижу. Конечно, можно закешировать nginx’ом статику и получить еще чуть-чуть производительности. Но  такое решение лучше всего будет выглядеть именно при распределенной архитектуре.

БД

Для баз данных у нас СУБД MySQL. Однако не простой мускул из репозитория, а форк от Percona. По сути, Percona использует ядро обычного mysql, однако, внедренные ими в сервер и клиент решения позволяют получить лучшую отдачу, нежели от классической сборки Оракла.

Кеширование

Для всевозможного кеширования мы будем использовать php-apc (кеширование байткода php), google mod_pagespeed для кеширования графики и js. Memcached для хранения сессий, ну и еще чего-нибудь, если это поддерживает ваш проект.

Движок сайта

Делаем мы все этом именно под сайт, по причине общепринятых требований к необходимым экстеншенам. Конечно, все описанное ниже будет верно и для любого другого веб-проекта на php. В общем, движок у нас — WordPress 3.8, для кеширования страниц использоваться будет плагин WP SuperCache.

Давайте приступим.

Настройка

После создания дроплета на DigitalOcean мы получаем письмо с логином и паролем. Естественно, для всего этого делается дроплет с ubuntu server 12.04 LTS. Мне нравится эта система 🙂

Получив письмо и залогинившись по ssh, мы начинаем нашу настройку. Итак, первым делом добавляем репозитории Percona.

Итак, mysql у нас стоит. Главное не забудьте пароль, который вы указали в качестве пароля root-пользователя, при установке пакетов. Далее переходим к установке apache и php.

Получаем базовый комплект, так сказать. Теперь мы можем управлять mysql через веб-панель ну и можем запускать php-скрипты через сервер apache. Для начала, прежде чем двигаться дальше, давайте заставим работать наш сайт. Для этого нам надо добавить виртуальных хост в apache, так же активировать модуль mod_rewrite (чтобы работали ЧПУ WordPress’а).

Активировали mod_rewrite и перезапустили Apache. Теперь идем делать виртуальный хост.

В него, в самом конце пишем следующие сроки конфигурации.

Готово, теперь наш подопытный сервер будет знать чего делать, если к нему обратились с вопросом «покажи сайта mysite.com». Сейчас нам надо сделать так, чтобы с файлами сайта можно было работать через ftp. Тут один маленький нюанс: чтобы не было конфликта между файлами, созданными по ftp и через apache, надо чтобы все это происходило через одного и того же пользователя.

На привычных всем shared-хостингах для этого используют следующую схему: на сервере вы получаете пользователя, а ftp и воркер apache работают под ним. Получается, что все файлы создаются одним пользователем — нет никаких проблем с работой.

Готово, теперь используя наш логин, пароль и ftp-клиент можно попробовать подключиться к серверу. Если подключиться не получится, то надо бы посмотреть конфиг vsftpd, который лежит по адресу /etc/vsftpd.conf. Там явно включен коннект под гостем, что нам без надобности.

Заливаем файлы на сервер, в директорию mysite.com. Направляем на наш сервер DNS запись A и через некоторое время получаем наш сайт, полностью рабочий и вообще прекрасный 🙂

Осталось совсем не много, а именно — настроить все кэши. Забегая вперед, скажу, что про memcached писать тут не буду. Его настройка в плане кеширования сессий описана в другой статье, полностью посвященной настройке memcached. Мы же едем дальше.

128 — это у нас память. Регулируйте как надо. Ну и последнее, что нам понадобится — это как-нибудь посматривать на расход памяти memcached и php-apc. Для этого есть очень интересные cкрипты.

apc.php — для просмотра статистики PHP APC.

memcache.php — для просмотра статистики memcached (если у вас несколько портов поднято — добавляйте их в массив, в начале файла).

Ложим оба в /var/www. Они уже могут работать, сразу 🙂 Но надо бы прикрыть их от чужих глаз, зачем кому-то видеть как расходуются наши ресурсы. Для этого, на директорию /var/www мы выставим ограничение по доступу через конфиг Apache.

Строк с разрешением доступа по ip может быть несколько.

Остался только google mod_pagespeed для apache. Это интересный модуль. Обработка скриптов и графики происходит на серверах google, после чего результат кешируется на вашем сервере. Установка проста.

Готово, мод работает и уже кеширует все, что необходимо. Хотя, можно и повозиться с дополнительными настройками в файле конфига, который находится в /etc/apache2/mods-available/pagespeed.conf.

Вот и все, теперь у нас имеется оптимально настроенный сервер. Конечно, его можно еще более тонко настроить, но сегодня мы это рассматривать не будем. Так же еще остается вопрос безопасности, который я никак не затронул. Коснемся его в следующих статьях.

Что мы получили?

А получили мы веб-севрер, который способен выдержать наплыв в 5-20 запросов в секунду, при этом его Load Average не поднимется и до 1. Что радует. Еще я очень рекомендую использовать кеширование на стороне WordPress, если вы используете WordPress — это позволит еще больше сократить потребление ресурсов и ускорить работу сайта.


  • «можно закешировать nginx’ом статику» — Вот об этом очень хотелось бы поподробнее: nginx — как фронтэнд для статики, а php5-fpm — для обработки php. Стоит ли ждать мануала?
    Кстати, еще вопрос: нужно ли перед установкой Percona удалять предустановленный MySQL?

    • Ждите. nginx+php5-fpm — тема интересная и актуальная. Обязательно напишу, правда, не буду обещать как скоро (времени сейчас маловато).
      Удалять MySQL нет необходимости — при установке Percona все необходимые операции выполнятся сами. Естественно, если ставите apt’ом, и репозитория/пакета.