Установка и настройка оптимизации LAMP
LAMP — это комбинация операционной системы и открытого программного обеспечения, предназначенных для организации работы динамических веб-сайтов и веб-приложений. Акроним LAMP является производным от первых букв компонентов, которые входят в его состав: ОС Linux, веб-сервер Apache, базы данных MySQL и язык программирования PHP/Perl/Python.
Установка и настройка LAMP несколько разнится в зависимости от выбранного дистрибутива ОС Linux. Данная статья нацелена на пользователей наиболее популярных дитрибутивов Linux: CentOS и Debian/Ubuntu.
Подключаемся к серверу по SSH с правами root-пользователя и начинаем установку.
Первым делом, обновляем информацию о новых пакетах и их зависимостях в официальных репозиториях.
Для CentOS:
Для Debian, Ubuntu:
Содержание
Установка веб-сервера Apache
Для CentOS:
Для Debian, Ubuntu:
Запускаем установленный веб-сервер:
Для CentOS:
Для Debian, Ubuntu:
Если веб-сервер был запущен после установки автоматически, то мы увидим соответствующее сообщение об этом. Также мы всегда можем проверить текущее состояние веб-сервера (впрочем, как и любого другого сервиса) командой:
Для CentOS:
Для Debian, Ubuntu:
Теперь можно протестировать установку Apache.
Перейдем в браузере по IP-адресу нашего сервера, например http://0.0.0.0, где вместо нулей мы указываем IP, который был выдан при создании сервера.
Показателем успешной установки веб-сервера в CentOS будет следующая тестовая страница:
В Debian, Ubuntu мы можем увидеть такую надпись:
Теперь, когда Apache установлен и работает, следует добавить его в автозагрузку, чтобы он запустится автоматически в случае перезагрузки сервера:
Для CentOS:
Для Debian, Ubuntu:
Установка сервера баз данных MySQL
MySQL — система управления базами данных, ипользуемая для структуризации и поиска данных.
Чтобы установить MySQL-сервер выполняем команду:
Для CentOS:
Для Debian, Ubuntu:
После установки в Debian, Ubuntu появится окно для ввода нового пароля для root-пользователя MySQL сервера. Так как установка по умолчанию предусматривает подключение к серверу под root’ом без ввода пароля, настоятельно рекомендуется исправить это, установив пароль сразу. Как установить рутовый пароль в CentOS будет описано ниже.
Запускаем MySQL сервер и добавляем его в автозапуск:
Для CentOS:
Для Debian, Ubuntu:
Затем запускаем скрипт, который поможет нам установить рутовый пароль (если он еще не был установлен), а также выполнить некоторые другие настройки безопасности:
Последовательно нам будут заданы несколько вопросов, на все из которых рекомендуется отвечать положительно, иходя из соображений безопасности (Y или просто Enter):
Set root password? [Y/n] Установка пароля для root, если он не был установлен ранее.
Remove anonymous users? [Y/n] Удаление анонимного пользователя, который позволяет логиниться в MySQL, не имея аккаунта. Данная возможность предназначена только для тестовых целей.
Disallow root login remotely? [Y/n] Запрет логиниться под рутом удаленно, оставить доступ только с ‘localhost’.
Remove test database and access to it? [Y/n] Удаление тестовой базы данных.
Reload privilege tables now? [Y/n] Применение только что выполненных изменений.
Проверим, можно ли теперь подключиться к MySQL под рутом без ввода пароля. Вводим команду:
Если мы видим ошибку, указанную ниже, значит всё корректно работает — как и должно быть, нас не пускает под рутом без пароля.
ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: NO)
Если мы попробуем добавить ключ -p и введем пароль рута, нас должно успешно пустить.
Если не пускает на этом этапе, перепроверяем правильность ввода пароля.
Сразу устанавливаем в настройках MyISAM движком для хранения таблиц по умолчанию, что показывает лучшую производительность на не слишком загруженных серверах. Это пригодится нам в дальнейшем. Для этого открываем конфигурационный файл MySQL:
Для CentOS:
Для Debian, Ubuntu:
и добавляем следующие строки:
Перезапускаем MySQL сервер:
Для CentOS:
Для Debian, Ubuntu:
Установка PHP
PHP — скриптовый язык программирования, необходимый для работы большинства программного обеспечения на сервере, включая форумы, системы управления контентом сайта, например, WordPress и т. д.
Установим PHP и модуль для поддержки MySQL в PHP:
Для CentOS:
Для Debian, Ubuntu:
Также нам могут понадобиться некоторые дополнительные модули, например: gd (работа с изображениями), mbstring (поддержка мульбайтовых кодировок, включая UTF-8), mcrypt (поддержка шифрования)
Для их установки выполним:
Для CentOS:
Для Debian, Ubuntu:
Для CentOS:
Для Debian, Ubuntu:
Чтобы протестировать установку PHP, необходимо создать файл с PHP функцией и поместить его в рутовую папку Apache. Эта папка отличается в рассматриваемых дистрибутивах, поэтому выполним:
Для CentOS:
Для Debian, Ubuntu:
Создаем и открываем файл для редактирования
Вставляем в него код, приведенный ниже, сохраняем (Ctrl+O) и выходим из текстового редактора (Ctrl+X):
Теперь откроем phptest.php в браузере, чтобы проверить работоспособность PHP и его модулей
http://0.0.0.0/phptest.php, где вместо нулей мы указываем IP, который был выдан при создании сервера.
Данная таблица означает, что PHP установлен и работает. Проскроллив таблицу вниз, мы можем также увидеть список установленных модулей для PHP.
Наш тестовый PHP файл нам больше не нужен, поэтому можно его удалить (для подтверждения удаления достаточно нажать клавишу ‘Y’ и затем Enter):
Итак, Apache, MySQL и PHP установлены. Осталось проверить, как работает подключение к базе данных в PHP. Для этого создадим еще один файл в той же папке, где мы сейчас находимся и назовем его dbtest.php
Скопируем в него нижеприведенный код, заменив password нашим рутовым паролем MySQL. Не забываем сохранить файл.
Откроем dbtest.php в браузере введя в адресную строку http://0.0.0.0/dbtest.php, где вместо нулей мы указываем IP, который был выдан при создании сервера.
Если мы все сделали правильно, то появится сообщение об успешном подключении.
Возможные проблемы при открытии dbtest.php в браузереМы можем увидеть следующие ошибки:
1) ERROR! Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)
Данная ошибка означает, что MySQL сервис остановлен и следует его запустить, выполнив:
Для CentOS:
2) ERROR! Access denied for user ‘root’@’localhost’ (using password: YES)
Нужно перепроверить рутовый пароль в dbtest.php, так он был введен неправильно.
3) Перед нами пустая белая страница.
Если перед нами пустая белая страница, значит тестовый код был скопирован неверно.
Если проверка была успешной, удаляем тестовый файл:
Установка phpMyAdmin
phpMyAdmin — средство управления базами данных MySQL через веб-интерфейс.
Для CentOS:
По умолчанию phpMyAdmin не включен в официальные репозитории CentOS, поэтому мы воспользуемся репозиторием EPEL (Extra Packages for Enterprise Linux).
Удаляем скачанный файл, так как он нам больше не понадобится:
Как только пакет установлен, можно считать, что необходимый репозиторий добавлен. Приступаем к установке phpMyAdmin
По умолчанию, phpMyAdmin в CentOS сконфигурирован так, чтобы не позволять никому подключаться к нему. Мы собираемся это исправить, так как без этого установка не имела смысла.
Открываем конфиграционный файл
находим строку <Directory /usr/share/phpmyadmin>
и в секции Apache 2.2 меняем
Сохраняем файл (Ctrl+O) и выходим из текстового редактора (Ctrl+X).
Для Debian, Ubuntu:
Во время установки нам предложат выбрать веб-сервер, который должен быть автоматически сконфигурирован для запуска phpMyAdmin
Жмем пробел, чтобы выбрать apache2, затем Tab и Enter.
Далее будет создан пользователь phpmyadmin и база данных для него. Для этого будет необходимо ввести рутовый пароль для MySQL
и дважды пароль для пользователя phpmyadmin.
Чтобы значительно снизить вероятность взлома сервера, мы изменим путь к phpMyAdmin, по которому мы переходим в браузере. Для этого открываем конфигурационный файл и вносим следующие корректировки:
Для CentOS:
Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin
#Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyconsole /usr/share/phpMyAdmin
Для Debian, Ubuntu:
Alias /phpmyadmin /usr/share/phpmyadmin
Alias /phpmyconsole /usr/share/phpmyadmin
Обратите внимание, вместо phpmyconsole вы можете указать любое сочетание букв и цифр на свое усмотрение, которое вам будет удобно использовать для доступа к консоли phpMyAdmin.
Сохраняем файл и выходим из текстового редактора.
На этом настройка phpMyAdmin завершена. Перезапускаем Apache
Для CentOS:
Для Debian, Ubuntu:
Теперь мы можем подключиться к консоли phpMyAdmin, перейдя в браузере по ссылке
http://0.0.0.0/phpmyconsole/, где вместо нулей мы указываем IP, который был выдан при создании сервера.
Вводим наш MySQL логин и пароль.
Мы успешно залогинились.
Теперь мы можем управлять базами данных MySQL через веб-интерфейс.
На этом установка завершена, но для оптимального использования ресурсов потребуется некоторая оптимизация компонентов LAMP.
Оптимизация LAMP для сайта
После того как всё необходимое ПО для хостинга сайта установлено, имеет смысл оптимизировать работу сервера: вы увеличите и производительность, и уменьшите расход ресурсов сервера, а как следствие — сэкономите и не будете покупать более мощный сервер. Оптимизация под каждый тип ресурса (блог, форум, интернет-магазин) может несколько отличаться, но есть базовые рекомендации, которые подойдут практически для каждой CMS.
Для начала, рекомендуется убрать из автозагрузки сервисы, которыми мы пользоваться не планируем. Чтобы увидеть их список, установим специальную утилиту и запустим ее:
Для CentOS:
Для Debian, Ubuntu:
Удаление сервиса из автозагрузки рассмотрим на примере агентов пересылки сообщений (Postfix в CentOS или Exim в Debian, Ubuntu), которые присутствует в стандартной установке. Если почтовый функционал нам не интересен в рамках данного сервера, Postfix/Exim можно смело отключать. Для навигации используем стрелки вверх-вниз, перемещаясь к интересуемому пункту, жмем Пробел, чтобы убрать астериск из квадратных скобок, далее Tab для перемещения к кнопке Ok и Enter.
Далее отключаем журналирование atime (время последнего доступа к файлу) для файловой системы ext4. Для этого окрываем кофигурационный файл, управляющий автомонтированием файловых систем:
и добавляем опцию noatime в четвертой колонке первой строки, как показано ниже:
Теперь необходимо вновь подмонтировать корневую файловую систему, для которой только что были выполнены измененения, выполнив команду:
Оптимизация ApacheНастроенный по умолчанию веб-сервер Apache подгружает некоторое количество ненужных модулей, потребляющих драгоценные ресурсы. Проверить, какие модули установлены и включены, можно следующей командой:
Для CentOS:
Для Debian, Ubuntu:
Ниже представлен список модулей, которые необходимы для работы подавляющего большинства сайтов:
- alias
- autoindex
- authz_host
- deflate
- dir
- expires
- log_config
- mime
- negotiation
- php5
- rewrite
- setenvif
Остальные shared-модули могут быть отключены. Это сэкономит множество ресурсов на обработке запросов. При этом, мы в любой момент можем включить/отключить необходимые модули. Для отключения необходимо выполнить следующее:
Для CentOS:
Открываем конфигурационный файл
и комментируем строку с модулем, который нам не нужен:
Для Debian, Ubuntu:
Для включения модуля нужно сделать противоположное:
Для CentOS:
Открываем конфигурационный файл
и добавляем в него строку вида:
Для Debian, Ubuntu:
Описание всех модулей Apache можно посмотреть на официальном сайте: Модули Apache
Настраиваем параметры мультипроцессорного модуля Prefork:
Для CentOS:
Для Debian, Ubuntu:
Находим блок параметров для модуля Prefork по строке:
Для CentOS:
Для Debian, Ubuntu:
Разберем назначение каждой из директив и определим рекомендуемые значения.
Директивы StartServers, MinSpareServers и MaxSpareServers дают возможность иметь несколько созданных процессов в памяти заранее, чтобы не нужно было их создавать каждый раз после получения запроса.
Внесем некоторые коррективы в настройки. Укажем Apache создавать 3 процесса после запуска:
Если осталось менее 3-х свободных процессов, Apache оставит 3 незакрытыми:
Позволим Apache оставлять не более 5 свободных процессов, остальные следует уничтожить
ServerLimit устанавливает максимальное значение MaxClients на протяжении жизненного цикла процесса сервера Apache. Значение ServerLimit не должно превышать значения MaxClients в целях соблюдения стабильности системы.
Директива MaxClients определяет максимальное число параллельных запросов, обрабатываемых сервером. Данный параметр рекомендуется периодически подстраивать, выбирая оптимальное значение в диапазоне 128 — 4096.
Директива MaxRequestsPerChild устанавливает максимальное число запросов, которое может обработать один дочерний процесс до своего завершения. Стандартное значение 0 означает, что созданный процесс никогда не будет завершен. Изменим этот параметр, чтобы избежать риска утечек памяти. В нашем примере после 4096 обработанных запросов процесс будет перезапущен:
Благодаря KeepAlive запросам устанавливаются постоянные соединения между клиентом и сервером. Таким образом происходит экономия ресурсов, так как не нужно устанавливать соединения повторно. Время ожидания перед закрытием установим в 30 секунд:
Настоятельно рекомендуется ограничить журналирование для достижения наилучшей производительности путем изменения параметра LogLevel с warn на error:
Так как модуль deflate (сжатие файлов gzip) уже включен, осталось подстроить его под разные типы файлов для существенного уменьшения размеров трафика. Делается это следующим образом:
Для CentOS:
Создаем конфигурационный файл:
Для Debian, Ubuntu:
Удаляем старый файл конфигурации и создаем вместо него пустой:
Вставляем в созданный файл блок:
Обратите внимание, что в некоторых CMS сжатие также должно быть принудительно включено в настройках.
После проделанных манипуляций перезагружаем Apache:
Для CentOS:
Для Debian, Ubuntu:
Оптимизация PHPОткрываем конфигурационный файл:
Для CentOS:
Для Debian, Ubuntu:
Меняем значения некоторых параметров в соответствии со следующими рекомендациями:
Отключение сжатия (при условии, что оно включено в Apache, как было рекомендовано выше).
Установка максимального времени выполнения скрипта (в секундах). Обратите внимание, что для интернет-магазина может потребоваться более длительное выполнение скрипта (например, при фильтрации товаров).
Максимальное количество памяти, потребляемое скриптом. Хотя по умолчанию этот параметр равен 128 Мб, рекомендуется его уменьшить в несколько раз, чтобы не возникло ситуации, когда несколько плохо написанных скриптов “съедают” всю память, доступную на сервере.
Запрет PHP отправлять вместе с каждым ответом на запрос собственную версию (снижает вероятность взлома, так как потенциальные уязвимости сервера могут быть выявлены хакером в том числе и по версии PHP).
Логгирование ошибок об обнаруженных утечках памяти.
Максимальный размер запросов и файлов для загрузки. Не стоит устанавливать слишком большой размер, если нет такой необходимости. Параметр post_max_size не должен превышать memory_limit, установленный ранее.
Журналирование только самых критических ошибок.
Если у нас установлен PHP версии ниже 5.5, нам понадобится APC (Alternative PHP Cache), который будет кэшировать скомпилированные PHP скрипты, что позволит использовать их повторно без перекомпиляции. Это существенно снижает нагрузку. После изменения файлов, кэш сбрасывается автоматически и в результате скрипты перекомпилируются перед запуском. Устанавливаем несколько вспомогательных пакетов:
Для CentOS:
А теперь, собственно, и сам APC:
В процессе установки нам будут заданы несколько вопросов, нажимаем Enter после каждого из них (принимаем настройки по умолчанию). Следующая команда включает расширение APC:
Для Debian, Ubuntu:
Здесь будет достаточно всего одной команды:
Дальнейшая оптимизация в работе PHP достигается кэшированием данных и отптимизацией собственно PHP-кода.
В форумных CMS также рекомендуется отключить debug-режим, так как он сильно замедляет работу (смотрите руководство для вашей CMS).
Оптимизация MySQLТак как изначально MySQL рассчитан на работу с небольшими базами данных и на слабом железе, мы оптимизируем параметры для повышения производительности путем внесения изменений в конфигурационный файл:
Для CentOS:
Для Debian, Ubuntu:
Устанавливаем следующие значения:
Объем оперативной памяти, куда будут складываться индексы. Устанавливаем это значение в 30% от всей оперативной памяти, которой мы располагаем на сервере.
Кэширование запросов. С увеличением этого значения прямо пропорционально увеличиваются, как производительность, так и расход памяти. Таким образом, можно начать с 32 Мб и увеличивать это значение по мере необходимости.
Память, выделенная под открытые таблицы.
Проверка производительности VPSМы можем использовать команду для измерения отклика страницы сайта до и после внесения изменений в конфигурацию LAMP для определения, помогла ли настройка или только ухудшила положение. Для получения результата, нужно измерять время отклика после применения только одного критерия, чтобы несколько изменений не нейтрализовали друг друга. Чтобы измерять время отклика, воспользуемся командой:
где вместо http://www.yourdomain.com мы вставляем ссылку на страницу, время отклика которой нас интересует.
Нам будет выдан результат из трех значений, например:
Все эти таймеры ведут отсчет от старта запроса, даже перед обращением к DNS. Таким образом, после того как был сделан запрос, требуется 0.230 – 0.071 = 0.159 секунды, чтобы веб-сервер обработал запрос и начал возвращать данные. Клиент затратил 0.655 – 0.230 = 0.425 секунды, загружая данные с сервера.
Наблюдение за этими результатами позволят нам получить представление о скорости реации сайта на запросы пользователей.
Также устанавливаем утилиту, с помощью которой нам будет удобно контролировать количество используемой памяти и загрузку процессора. Вводим команду:
Для CentOS:
Для Debian, Ubuntu:
Как видно в верхней части скриншота, наша тестовая инсталляция потребляет 191 Мб памяти (около 20%) памяти и нагружает каждое из ядер процессора на 1,3%:
В дополнение в вышесказанному, мы можем подвергнуть анализу скорость работы сайта с помощью инструмента Pagespeed от Google. Этот сервис укажет нам на текущие проблемы и выдаст полезные рекомендации. Для начала анализа достаточно ввести ссылку на нужную страницу в сервисе Google PageSpeed Insights.