Max Isaev Linux
Данное руководство рассчитано на вебмастеров, стремящихся решить проблему недостаточной производительности сайтов, построенных на платформе WordPress. В нем описана пошаговая настройка сервера с ограниченными ресурсами (1 ядро, 512 RAM на примере минимального тарифа Flops.ru) для использования в связке LEMP (Linux + nginx + MySQL + PHP). Для комфортного использования материала вы должны иметь общие представления о работе сайтов и серверов на базе Linux.
Эволюция требований к хостингу при увеличении масштабов проекта.
Наиболее популярным решением для веб серверов по прежнему остается связка LAMP (Linux, Apache, MySQL, PHP). Подобный вариант легок в настройке, хорошо документирован, часто используется для небольших проектов. Но за простоту использования приходится платить чрезмерным потреблением ресурсов и высокими рисками даунтайма при увеличении нагрузки (возросшее число посетителей, большое количество материалов, тяжелые плагины).
В результате веб мастерам приходится либо увеличивать финансирование на оплату услуг хостинга путем увеличения производительности аппаратной составляющей, либо искать менее ресурсоемкие решения.
Часто в качестве следующего шага развития используется LAMP за proxy сервером nginx, обеспечивающим быструю отдачу статики, тем самым снижая нагрузку на Apache. Подобное решение позволяет с минимальными усилиями и поддержкой специфических для Apache возможностей (например .htaccess) существенно повысить производительность. Для ускорения динамики в ход идут исполнение PHP в режиме CGI, средства кэширования байт-кода и SQL запросов. При этом в подобной связке все равно остается узкое место — производительность Apache.
Следующим витком эволюции в погоне за производительность стает полный отказ от Apache, использование FPM, полное кэширование страниц сайта.
Это руководство подробно рассказывает о настройке WordPress, выдерживающей нагрузки в несколько сотен конкурентных запросов в секунду в условиях крайне ограниченных серверных ресурсов. Руководство описывает все шаги установки, включая первичную настройку сервера, обеспечивающую защиту от стандартных угроз, установку и настройку LEMP, настройку WordPress. Выполнение всех пунктов гарантирует получение работоспособного сервера.
ВАЖНО: В руководстве не описана процедура резервного копирования, так как Flops.ru обеспечивает создание резервных копий и снэпшотов, а использование сторонних мест хранения сугубо индивидуально.
ВАЖНО: Набор предустановленных пакетов у разных хостинг-провайдеров может варьироваться. Руководство подразумевает наличие схожих с Flops.ru пакетов.
ЗАМЕЧАНИЕ: В интернете гуляет множество статей по использованию в подобной связке Varnish, но nginx отдает статику не хуже, а конфигурация, представленная ниже, преимущественно будет работать именно со статикой, так что не вижу смыла усложнять проект еще одной прослойкой, тем более сильно отягчающей жизнь проектам, использующим SSL. Для формирования статической выдачи будет использоваться плагин WP Super Cache.
Требования к серверу.
В руководстве приводятся примеры конфигурации для сервера VPS с одним ядром, 512Mb Ram, SSD. Тестовые сервера были развернуты у хостинг-провайдера Flops.ru, но вы можете воспользоваться любыми другими. Так как приведенные ниже настройки рассчитаны на максимальное использование кэшированных на дисках объектов, наиболее важным параметром будет производительность дисковой подсистемы.
Для установки сервера был выбран дистрибутив Debian 7 x86, так как в микроинстялляциях он обеспечивает более экономное использование памяти по сравнению с x64 версиями.
Подготовка серверного окружения.
После установки сервера установим с ним соединение по ssh.
Сразу после установки не назначены локали по умолчанию. Укажем основной локалью en_US.UTF-8.
Для того, чтобы изменения вступили в силу, необходимо завершить сеанс SSH и начать его заново.
Обновим ПО сервера.
Установим и настроим sudo.
Добавим нового пользователя, под которым будем получать доступ по SSH.
Настроим sudo.
Теперь перелогинимся под новым пользователем и убедимся, что все хорошо.
Если проблем не возникло ограничим доступ root пользователю к SSH.
Найдем строку
и заменим ее на
После внесения изменений перезагрузим OpenSSH.
Ограничим возможности потенциальных злоумышленников к подбору паролей SSH. Воспользуемся утилитой fail2ban. Также позже мы настроим fail2ban для блокирования возможности подбора пароля к WordPress.
Для нашей задачи дополнительные настройки fail2ban не требуются.
Теперь при шестикратном неправильном вводе пароля ssh, пользователь будет блокироваться с помощью iptables на 600 секунд.
Настроим синхронизацию времени.
Настроим exim4 для отправки писем с сайта.
General type of mail configuration:
Выберем верхний пункт internet site; mail is sent and received directly using SMTP.
System mail name:
Укажем полное имя сервера, например admins.su.
IP-addresses to listen on for incoming SMTP connections:
127.0.0.1
Other destinations for which mail is accepted:
Оставим пустым.
Domains to relay mail for:
Оставим пустым.
Machines to relay mail for:
Оставим пустым.
Keep number of DNS-queries minimal (Dial-on-Demand)?
No
Delivery method for local mail:
Любое значение.
Split configuration into small files?
Yes
Резюме выполненных действий:
1. Создан пользователь webmaster для доступа по ssh.
2. Для повышения привилегий до root требуется дополнительный ввод пользователем webmaster пароля root.
3. Настроена защита от перебора пароля по ssh.
4. Настроена синхронизация времени.
5. Настроена почта для отправки писем с сайта.
Установка LEMP.
Мы будем использовать установку из пакетов для простого управления обновлениями. Для того, чтобы получить более свежий nginx (стандартно ставится nginx 1.2.1), мы подключим родной репозиторий nginx.
Скачаем и установим PGP ключ сервера nginx.
Добавим репозиторий nginx в список sources.list менеджера apt.
Обновим данные о доступных пакетах.
Теперь настало время установки необходимых для работы веб сервера пакетов.
После недолгой установки мы получили работоспособную связку nginx, php-fpm,mysql.
Настройка LEMP.
Создадим директорию, в которой будут располагаться файлы сайта.
Вместо %SITENAME% необходимо указать имя сайта без http и www. Например admins.su или blog.admins.su
Создадим базу данных для сайта.
ВАЖНО: В листинге требуется изменить название базы, имя пользователя и его пароль.
Теперь настроим FPM.
Удалим стандартную конфигурацию.
Создадим новую конфигурацию.
ВАЖНО: В листинге необходима замена параметра %SITENAME% на название сайта без www.
После того, как мы создали файл конфигурации php-fpm, необходимо перезагрузить сервис.
Если потребуется создать еще один сайт на этом сервере, достаточно будет сделать копию конфигурационного файла, не забыв изменить имя сайта.
Теперь настроим nginx.
Изменим имя пользователя с nginx на www-data.
Найдем и раскомментируем строки.
Настроим gzip.
Изменим время таймаута keepalive.
Удалим стандартные конфигурационные файлы:
Создадим новый конфигурационный файл.
ВАЖНО: В листинге необходима замена параметра %SITENAME% на название сайта без www.
После сохранения конфигурационного файла необходимо проверить работоспособность конфигурации.
Если ошибок не обнаружено перезагрузим nginx.
Резюме выполненных действий:
1. Установлена БД MySQL. Создана база для WordPress, создан пользователь, заданы привилегии.
2. Установлен и настроен php-fpm.
3. Установлен и настроен nginx.
Установка WordPress.
Установка WordPress на сервер ничем не отличается от установки на Apache.
Загрузим последнюю версию WordPress на сервер, распакуем ее и изменим владельца файлов на www-data.
Далее перейдем к браузеру, продолжив установку там. Подробно установку описывать не буду, так как она интуитивно понятна.
Сразу после этого установим и активируем 2 необходимых для нормальной работы в LEMP плагина: Nginx Helper и WP Super Cache.
Плагин Nginx Helper в нашем случае не требует настройки , важен лишь факт его присутствия и активации. В условиях того, что за кэш будет отвечать плагин WP Super Cache, кнока Purge сверху работать не будет.
WP Super Cache требует незначительной настройки.
После активации необходимо выбрать нужный вид ЧПУ на странице http://%SITENAME%/wp-admin/options-permalink.php
В настройке самого плагина перейдем на вкладку «Настройки»
Выставим следующие настройки (с остальных галки необходимо снять):
[*]Кэшировать сессии просмотров для быстрого доступа. (Рекомендовано)
[*]Использовать mod_rewrite для обслуживания кэша. (Рекомендовано)
[*]Сжимать файлы кэша чтобы ускорить работу. (Рекомендовано)
[*]Ошибка 304. Данная ошибка возникает тогда, когда страница не была изменена со времени прошлого запроса. (Рекомендовано)
[*]304 support is disabled by default because some hosts have had problems with the headers used in the past.
[*]Авто перестройка кэша. Гости блога увидят устаревшие версии страниц кэша пока новые будут генерироваться. (Рекомендовано)
[*]Clear all cache files when a post or page is published or updated.
[*]Дополнительная сверка кэша (очень редко может нарушить работу кэширования). (Рекомендовано)
[*]Обновлять страницу при добавлении нового комментария к ней
После внесения изменений нажмите кнопку «Обновить».
При попытке сохранения сверху вы увидите следующее сообщение:
Права на запись должны быть обновлены
Необходимые для работы плагина права были изменены или отсуствуют. Прокрутите страницу вниз и нажмите кнопку Обновить правила Mod_Rewrite.
WP Super Cache не знает, что используется nginx и сообщает, что требуется изменить файл .htaccess. Для того, чтобы все заработало, надо разрешить ему сделать это. Прокрутим страницу вниз и нажмем кнопку Обновить правила mod_rewrite.
На вкладке «Обслуживание» установим галочку:
[*]Очищать кэш при ошибке.
И также нажмем кнопку «Обновить».
Теперь перейдем на вкладку Кэш и проверим, что все работает нажатием кнопки «Проверить».
Если вы увидели надпись «Временные штампы обоих вариантов страницы совпадают!«, значит все настройки сделаны правильно.
Резюме выполненных действий:
1. Установлен WordPress.
2. Установлены и настроены плагины WP Super Cache и Nginx helper.
На этом настройка завершена.
На заметку:
Не забывайте, что скорость работы блога сильно зависит от используемых на нем плагинов. Они разрабатываются в основном энтузиастами и часто работают неоптимально и имеют ошибки, создающие дополнительную нагрузку.
В руководстве не упоминается тюнинг MySQL. Это отдельная большая тема, про которую я обязательно напишу.
Linux, Tutorial, Web