Установка и оптимизация LAMP

LAMP — это комбинация операционной системы и открытого программного обеспечения, предназначенных для организации работы динамических веб-сайтов и веб-приложений. Акроним LAMP является производным от первых букв компонентов, которые входят в его состав: ОС Linux, веб-сервер Apache, базы данных MySQL и язык программирования PHP/Perl/Python.

Установка и настройка LAMP несколько разнится в зависимости от выбранного дистрибутива ОС Linux. Данная статья нацелена на пользователей наиболее популярных дитрибутивов Linux: CentOS и Debian/Ubuntu.

Подключаемся к серверу по SSH с правами root-пользователя и начинаем установку.

Первым делом, обновляем информацию о новых пакетах и их зависимостях в официальных репозиториях.

Вводим команду:

Для CentOS:

yum -y update

Для Debian, Ubuntu:

apt-get -y update

Установка веб-сервера Apache

Для CentOS:

yum -y install httpd

Для Debian, Ubuntu:

apt-get -y install apache2

Запускаем установленный веб-сервер:

Для CentOS:

service httpd start

Для Debian, Ubuntu:

service apache2 start

Если веб-сервер был запущен после установки автоматически, то мы увидим соответствующее сообщение об этом. Также мы всегда можем проверить текущее состояние веб-сервера (впрочем, как и любого другого сервиса) командой:

Для CentOS:

service httpd status

Для Debian, Ubuntu:

service apache2 status

Теперь можно протестировать установку Apache.

Перейдем в браузере по IP-адресу нашего сервера, например http://0.0.0.0, где вместо нулей мы указываем IP, который был выдан при создании сервера.

Показателем успешной установки веб-сервера в CentOS будет следующая тестовая страница:

Тестовая страница Apache в CentOS

В Debian, Ubuntu мы можем увидеть такую надпись:

Тестовая страница Apache в Debian, Ubuntu

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

Для CentOS:

chkconfig httpd on

Для Debian, Ubuntu:

update-rc.d apache2 defaults

Установка сервера баз данных MySQL

MySQL — система управления базами данных, ипользуемая для структуризации и поиска данных.

Чтобы установить MySQL-сервер выполняем команду:

Для CentOS:

yum -y install mysql-server

Для Debian, Ubuntu:

apt-get -y install mysql-server

После установки в Debian, Ubuntu появится окно для ввода нового пароля для root-пользователя MySQL сервера. Так как установка по умолчанию предусматривает подключение к серверу под root'ом без ввода пароля, настоятельно рекомендуется исправить это, установив пароль сразу. Как установить рутовый пароль в CentOS будет описано ниже.

Запускаем MySQL сервер и добавляем его в автозапуск:

Для CentOS:

service mysqld start
chkconfig mysqld on

Для Debian, Ubuntu:

service mysql start
update-rc.d mysql defaults

Затем запускаем скрипт, который поможет нам установить рутовый пароль (если он еще не был установлен), а также выполнить некоторые другие настройки безопасности:

mysql_secure_installation

Последовательно нам будут заданы несколько вопросов, на все из которых рекомендуется отвечать положительно, иходя из соображений безопасности (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 под рутом без ввода пароля. Вводим команду:

mysql -u root

Если мы видим ошибку, указанную ниже, значит всё корректно работает — как и должно быть, нас не пускает под рутом без пароля.

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

Если мы попробуем добавить ключ -p и введем пароль рута, нас должно успешно пустить.

mysql -u root -p

Если не пускает на этом этапе, перепроверяем правильность ввода пароля.

Сразу устанавливаем в настройках MyISAM движком для хранения таблиц по умолчанию, что показывает лучшую производительность на не слишком загруженных серверах. Это пригодится нам в дальнейшем. Для этого открываем конфигурационный файл MySQL:

Для CentOS:

nano /etc/my.cnf

Для Debian, Ubuntu:

nano /etc/mysql/my.cnf

и добавляем следующие строки:

default-storage-engine=MyISAM
default-tmp-storage-engine=MyISAM
skip-innodb

Перезапускаем MySQL сервер:

Для CentOS:

service mysqld restart

Для Debian, Ubuntu:

service mysql restart

Установка PHP

PHP — скриптовый язык программирования, необходимый для работы большинства программного обеспечения на сервере, включая форумы, системы управления контентом сайта, например, WordPress и т. д.

Установим PHP и модуль для поддержки MySQL в PHP:

Для CentOS:

yum -y install php php-mysql

Для Debian, Ubuntu:

apt-get -y install php5 php5-mysql

Также нам могут понадобиться некоторые дополнительные модули, например: gd (работа с изображениями), mbstring (поддержка мульбайтовых кодировок, включая UTF-8), mcrypt (поддержка шифрования)

Для их установки выполним:

Для CentOS:

yum -y install php-gd php-mbstring php-mcrypt

Для Debian, Ubuntu:

apt-get -y install php5-gd php5-mbstring php5-mcrypt

Перезапускаем Apache:

Для CentOS:

yum -y install httpd

Для Debian, Ubuntu:

apt-get -y install apache2

Чтобы протестировать установку PHP, необходимо создать файл с PHP фукцией и поместить его в рутовую папку Apache. Эта папка отличается в рассматриваемых дистрибутивах, поэтому выполним:

Для CentOS:

cd /var/www/html

Для Debian, Ubuntu:

cd /var/www

Создаем и открываем файл для редактирования

nano phptest.php

Вставляем в него код, приведенный ниже, сохраняем (Ctrl+O) и выходим из текстового редактора (Ctrl+X):

<?php phpinfo(); ?>

Теперь откроем phptest.php в браузере, чтобы проверить работоспособность PHP и его модулей

http://0.0.0.0/phptest.php, где вместо нулей мы указываем IP, который был выдан при создании сервера.

Тестовая страница связки Apache-PHP в Debian, Ubuntu

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

Наш тестовый PHP файл нам больше не нужен, поэтому можно его удалить (для подтверждения удаления достаточно нажать клавишу ‘Y’ и затем Enter):

rm phptest.php

Итак, Apache, MySQL и PHP установлены. Осталось проверить, как работает подключение к базе данных в PHP. Для этого создадим еще один файл в той же папке, где мы сейчас находимся и назовем его dbtest.php

Скопируем в него нижеприведенный код, заменив password нашим рутовым паролем MySQL. Не забываем сохранить файл.

<?php
$connect = mysql_connect("localhost", "root", "password");
if (!$connect)
{
die('ERROR! ' . mysql_error());
}
else
{
echo "Connected successfully!";
}
mysql_close($connect);
?> 

Откроем dbtest.php в браузере введя в адресную строку http://0.0.0.0/dbtest.php, где вместо нулей мы указываем IP, который был выдан при создании сервера.

Если мы все сделали правильно, то появится сообщение об успешном подключении.

Тестовая страница связки Apache-MySQL-PHP

Возможные проблемы при открытии dbtest.php в браузере

Мы можем увидеть следующие ошибки:

1) ERROR! Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Данная ошибка означает, что MySQL сервис остановлен и следует его запустить, выполнив:

Для CentOS:

service mysqld start

Для '''Debian, Ubuntu''':

<pre>service mysql start

2) ERROR! Access denied for user 'root'@'localhost' (using password: YES)

Нужно перепроверить рутовый пароль в dbtest.php, так он был введен неправильно.

3) Перед нами пустая белая страница.

Если перед нами пустая белая страница, значит тестовый код был скопирован неверно.

Если проверка была успешной, удаляем тестовый файл:

rm dbtest.php

Установка phpMyAdmin

phpMyAdmin — средство управления базами данных MySQL через веб-интерфейс.

Для CentOS:

По умолчанию phpMyAdmin не включен в официальные репозитории CentOS, поэтому мы воспользуемся репозиторием EPEL (Extra Packages for Enterprise Linux).

Скачиваем EPEL:

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Устанавливаем EPEL:

rpm -Uvh epel-release-6*.rpm

Удаляем скачанный файл, так как он нам больше не понадобится:

rm epel-release-6*.rpm

Как только пакет установлен, можно считать, что необходимый репозиторий добавлен. Приступаем к установке phpMyAdmin

yum -y install phpmyadmin

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

Открываем конфиграционный файл

nano /etc/httpd/conf.d/phpMyAdmin.conf

находим строку <Directory /usr/share/phpmyadmin>

и в секции Apache 2.2 меняем

Order Deny,Allow
Deny from All

на

Order Allow,Deny
Allow from All

Сохраняем файл (Ctrl+O) и выходим из текстового редактора (Ctrl+X).

Для Debian, Ubuntu:

apt-get -y install phpmyadmin

Во время установки нам предложат выбрать веб-сервер, который должен быть автоматически сконфигурирован для запуска phpMyAdmin

Жмем пробел, чтобы выбрать apache2, затем Tab и Enter.

Далее будет создан пользователь phpmyadmin и база данных для него. Для этого будет необходимо ввести рутовый пароль для MySQL

и дважды пароль для пользователя phpmyadmin.

Чтобы значительно снизить вероятность взлома сервера, мы изменим путь к phpMyAdmin, по которому мы переходим в браузере. Для этого открываем конфигурационный файл и вносим следующие корректировки:

Для CentOS:

nano /etc/httpd/conf.d/phpMyAdmin.conf

Находим строки:

Alias /phpMyAdmin /usr/share/phpMyAdmin

Alias /phpmyadmin /usr/share/phpMyAdmin

и меняем их на

#Alias /phpMyAdmin /usr/share/phpMyAdmin

Alias /phpmyconsole /usr/share/phpMyAdmin

Для Debian, Ubuntu:

nano /etc/phpmyadmin/apache.conf

Меняем строку

Alias /phpmyadmin /usr/share/phpmyadmin

на следующую

Alias /phpmyconsole /usr/share/phpmyadmin

Обратите внимание, вместо phpmyconsole вы можете указать любое сочетание букв и цифр на свое усмотрение, которое вам будет удобно использовать для доступа к консоли phpMyAdmin.

Сохраняем файл и выходим из текстового редактора.

На этом настройка phpMyAdmin завершена. Перезапускаем Apache

Для CentOS:

service httpd restart

Для Debian, Ubuntu:

service apache2 restart

Теперь мы можем подключиться к консоли phpMyAdmin, перейдя в браузере по ссылке

http://0.0.0.0/phpmyconsole/, где вместо нулей мы указываем IP, который был выдан при создании сервера.

Стартовая страница phpMyAdmin

Вводим наш MySQL логин и пароль.

Мы успешно залогинились.

Консоль управления phpMyAdmin

Теперь мы можем управлять базами данных MySQL через веб-интерфейс.

На этом установка завершена, но для оптимального использования ресурсов потребуется некоторая оптимизация компонентов LAMP.

Оптимизация LAMP для сайта

После того как всё необходимое ПО для хостинга сайта установлено, имеет смысл оптимизировать работу сервера: вы увеличите и производительность, и уменьшите расход ресурсов сервера, а как следствие — сэкономите и не будете покупать более мощный сервер. Оптимизация под каждый тип ресурса (блог, форум, интернет-магазин) может несколько отличаться, но есть базовые рекомендации, которые подойдут практически для каждой CMS.

Для начала, рекомендуется убрать из автозагрузки сервисы, которыми мы пользоваться не планируем. Чтобы увидеть их список, установим специальную утилиту и запустим ее:

Для CentOS:

yum -y install ntsysv
ntsysv

Для Debian, Ubuntu:

apt-get -y install rcconf
rcconf

Удаление сервиса из автозагрузки рассмотрим на примере агентов пересылки сообщений (Postfix в CentOS или Exim в Debian, Ubuntu), которые присутствует в стандартной установке. Если почтовый функционал нам не интересен в рамках данного сервера (например, мы используем почту для домена от Яндекса), Postfix/Exim можно смело отключать. Для навигации используем стрелки вверх-вниз, перемещаясь к интересуемому пункту, жмем Пробел, чтобы убрать астериск из квадратных скобок, далее Tab для перемещения к кнопке Ok и Enter.

Удаление сервисов из автозагрузки в CentOS, Debian, Ubuntu

Далее отключаем журналирование atime (время последнего доступа к файлу) для файловой системы ext4. Для этого окрываем кофигурационный файл, управляющий автомонтированием файловых систем:

nano /etc/fstab

и добавляем опцию noatime в четвертой колонке первой строки, как показано ниже:

/dev/xvda1  /  ext4  defaults,discard,errors=remount-ro,noatime  1  1
/dev/xvda2  swap  swap  defaults  0  0

Теперь необходимо вновь подмонтировать корневую файловую систему, для которой только что были выполнены измененения, выполнив команду:

mount / -o remount

Оптимизация Apache

Настроенный по умолчанию веб-сервер Apache подгружает некоторое количество ненужных модулей, потребляющих драгоценные ресурсы. Проверить, какие модули установлены и включены, можно следующей командой:

Для CentOS:

httpd -M

Для Debian, Ubuntu:

apache2ctl -M

Ниже представлен список модулей, которые необходимы для работы подавляющего большинства сайтов:

  • alias
  • autoindex
  • authz_host
  • deflate
  • dir
  • expires
  • log_config
  • mime
  • negotiation
  • php5
  • rewrite
  • setenvif

Остальные shared-модули могут быть отключены. Это сэкономит множество ресурсов на обработке запросов. При этом, мы в любой момент можем включить/отключить необходимые модули. Для отключения необходимо выполнить следующее:

Для CentOS:

Открываем конфигурационный файл

nano /etc/httpd/conf/httpd.conf

и комментируем строку с модулем, который нам не нужен:

#LoadModule название_модуля относительный_путь_к_модулю

Для Debian, Ubuntu:

Запускаем команду:

a2dismod название_модуля

Для включения модуля нужно сделать противоположное:

Для CentOS:

Открываем конфигурационный файл

nano /etc/httpd/conf/httpd.conf

и добавляем в него строку вида:

LoadModule название_модуля относительный_путь_к_модулю

например,

LoadModule rewrite_module modules/mod_rewrite.so

Для Debian, Ubuntu:

Запускаем команду:

a2enmod название_модуля

например,

a2enmod rewrite

Описание всех модулей Apache можно посмотреть на официальном сайте: Модули Apache

Настраиваем параметры мультипроцессорного модуля Prefork:

Для CentOS:

nano /etc/httpd/conf/httpd.conf

Для Debian, Ubuntu:

nano /etc/apache2/apache2.conf

Находим блок параметров для модуля Prefork по строке:

Для CentOS:

<IfModule prefork.c>

Для Debian, Ubuntu:

<IfModule mpm_prefork_module>

Разберем назначение каждой из директив и определим рекомендуемые значения.

Директивы StartServers, MinSpareServers и MaxSpareServers дают возможность иметь несколько созданных процессов в памяти заранее, чтобы не нужно было их создавать каждый раз после получения запроса.

Внесем некоторые коррективы в настройки. Укажем Apache создавать 3 процесса после запуска:

StartServers 3

Если осталось менее 3-х свободных процессов, Apache оставит 3 незакрытыми:

MinSpareServers 3

Позволим Apache оставлять не более 5 свободных процессов, остальные следует уничтожить

MaxSpareServers 5

ServerLimit устанавливает максимальное значение MaxClients на протяжении жизненного цикла процесса сервера Apache. Значение ServerLimit не должно превышать значения MaxClients в целях соблюдения стабильности системы.

Директива MaxClients определяет максимальное число параллельных запросов, обрабатываемых сервером. Данный параметр рекомендуется периодически подстраивать, выбирая оптимальное значение в диапазоне 128 — 4096.

Директива MaxRequestsPerChild устанавливает максимальное число запросов, которое может обработать один дочерний процесс до своего завершения. Стандартное значение 0 означает, что созданный процесс никогда не будет завершен. Изменим этот параметр, чтобы избежать риска утечек памяти. В нашем примере после 4096 обработанных запросов процесс будет перезапущен:

MaxRequestsPerChild 4096

Благодаря KeepAlive запросам устанавливаются постоянные соединения между клиентом и сервером. Таким образом происходит экономия ресурсов, так как не нужно устанавливать соединения повторно. Время ожидания перед закрытием установим в 30 секунд:

KeepAlive On
KeepAliveTimeout 30

Настоятельно рекомендуется ограничить журналирование для достижения наилучшей производительности путем изменения параметра LogLevel с warn на error:

LogLevel error

Так как модуль deflate (сжатие файлов gzip) уже включен, осталось подстроить его под разные типы файлов для существенного уменьшения размеров трафика. Делается это следующим образом:

Для CentOS:

Создаем конфигурационный файл:

nano /etc/httpd/conf.d/deflate.conf

Для Debian, Ubuntu:

Удаляем старый файл конфигурации и создаем вместо него пустой:

rm /etc/apache2/mods-enabled/deflate.conf && nano /etc/apache2/mods-enabled/deflate.conf

Вставляем в созданный файл блок:

<IfModule mod_deflate.c>
     AddOutputFilterByType DEFLATE text/plain
     AddOutputFilterByType DEFLATE text/html
     AddOutputFilterByType DEFLATE text/xml
     AddOutputFilterByType DEFLATE text/css
     AddOutputFilterByType DEFLATE application/xml
     AddOutputFilterByType DEFLATE application/xhtml+xml
     AddOutputFilterByType DEFLATE application/rss+xml
     AddOutputFilterByType DEFLATE application/javascript
     AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>

Обратите внимание, что в некоторых CMS сжатие также должно быть принудительно включено в настройках.

После проделанных манипуляций перезагружаем Apache:

Для CentOS:

service httpd restart

Для Debian, Ubuntu:

service apache2 restart

Оптимизация PHP

Открываем конфигурационный файл:

Для CentOS:

nano /etc/php.ini

Для Debian, Ubuntu:

nano /etc/php5/apache2/php.ini

Меняем значения некоторых параметров в соответствии со следующими рекомендациями:

zlib.output_compression = Off
zlib.output_compression_level = -1

Отключение сжатия (при условии, что оно включено в Apache, как было рекомендовано выше).

max_execution_time = 5

Установка максимального времени выполнения скрипта (в секундах). Обратите внимание, что для интернет-магазина может потребоваться более длительное выполнение скрипта (например, при фильтрации товаров).

memory_limit = 40M

Максимальное количество памяти, потребляемое скриптом. Хотя по умолчанию этот параметр равен 128 Мб, рекомендуется его уменьшить в несколько раз, чтобы не возникло ситуации, когда несколько плохо написанных скриптов “съедают” всю память, доступную на сервере.

expose_php = Off

Запрет PHP отправлять вместе с каждым ответом на запрос собственную версию (снижает вероятность взлома, так как потенциальные уязвимости сервера могут быть выявлены хакером в том числе и по версии PHP).

report_memleaks = On

Логгирование ошибок об обнаруженных утечках памяти.

post_max_size = 4M
upload_max_filesize = 4M

Максимальный размер запросов и файлов для загрузки. Не стоит устанавливать слишком большой размер, если нет такой необходимости. Параметр post_max_size не должен превышать memory_limit, установленный ранее.

error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR

Журналирование только самых критических ошибок.

Если у нас установлен PHP версии ниже 5.5, нам понадобится APC (Alternative PHP Cache), который будет кэшировать скомпилированные PHP скрипты, что позволит использовать их повторно без перекомпиляции. Это существенно снижает нагрузку. После изменения файлов, кэш сбрасывается автоматически и в результате скрипты перекомпилируются перед запуском. Устанавливаем несколько вспомогательных пакетов:

Для CentOS:

yum -y install php-pear php-devel httpd-devel pcre-devel gcc make

А теперь, собственно, и сам APC:

pecl install apc

В процессе установки нам будут заданы несколько вопросов, нажимаем Enter после каждого из них (принимаем настройки по умолчанию). Следующая команда включает расширение APC:

echo "extension=apc.so" > /etc/php.d/apc.ini

Для Debian, Ubuntu:

Здесь будет достаточно всего одной команды:

apt-get -y install php-apc

Дальнейшая оптимизация в работе PHP достигается кэшированием данных и отптимизацией собственно PHP-кода.

В форумных CMS также рекомендуется отключить debug-режим, так как он сильно замедляет работу (смотрите руководство для вашей CMS).

Оптимизация MySQL

Так как изначально MySQL рассчитан на работу с небольшими базами данных и на слабом железе, мы оптимизируем параметры для повышения производительности путем внесения изменений в конфигурационный файл:

Для CentOS:

nano /etc/my.cnf

Для Debian, Ubuntu:

nano /etc/mysql/my.cnf

Устанавливаем следующие значения:

key_buffer = 300M

Объем оперативной памяти, куда будут складываться индексы. Устанавливаем это значение в 30% от всей оперативной памяти, которой мы располагаем на сервере.

query_cache_size = 32M

Кэширование запросов. С увеличением этого значения прямо пропорционально увеличиваются, как производительность, так и расход памяти. Таким образом, можно начать с 32 Мб и увеличивать это значение по мере необходимости.

table_cache = 64

Память, выделенная под открытые таблицы.

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

Мы можем использовать команду для измерения отклика страницы сайта до и после внесения изменений в конфигурацию LAMP для определения, помогла ли настройка или только ухудшила положение. Для получения результата, нужно измерять время отклика после применения только одного критерия, чтобы несколько изменений не нейтрализовали друг друга. Чтобы измерять время отклика, воспользуемся командой:

curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total}\ http://www.yourdomain.com

где вместо http://www.yourdomain.com мы вставляем ссылку на страницу, время отклика которой нас интересует.

Нам будет выдан результат из трех значений, например:

0.070:0.230:0.655

Все эти таймеры ведут отсчет от старта запроса, даже перед обращением к DNS. Таким образом, после того как был сделан запрос, требуется 0.230 – 0.071 = 0.159 секунды, чтобы веб-сервер обработал запрос и начал возвращать данные. Клиент затратил 0.655 – 0.230 = 0.425 секунды, загружая данные с сервера.

Наблюдение за этими результатами позволят нам получить представление о скорости реации сайта на запросы пользователей.

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

Для CentOS:

yum -y install htop

Для Debian, Ubuntu:

apt-get -y install htop

Запускаем:

htop

Как видно в верхней части скриншота, наша тестовая инсталляция потребляет 191 Мб памяти (около 20%) памяти и нагружает каждое из ядер процессора на 1,3%:

Мониторинг системы средствами htop

В дополнение в вышесказанному, мы можем подвергнуть анализу скорость работы сайта с помощью инструмента Pagespeed от Google. Этот сервис укажет нам на текущие проблемы и выдаст полезные рекомендации. Для начала анализа достаточно ввести ссылку на нужную страницу в сервисе Google PageSpeed Insights.

На этом установка и начальная оптимизация LAMP завершены.

Можно приступать к установке системы управления контентом (CMS).

Вам также может быть интересна инструкция «Как привязать домен к сайту».