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
- Установка сервера баз данных MySQL
- Установка PHP
- Установка phpMyAdmin
- Оптимизация LAMP для сайта
Установка веб-сервера 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 будет следующая тестовая страница:
В 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:
service httpd restart
Для Debian, Ubuntu:
service apache2 restart
Чтобы протестировать установку 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, который был выдан при создании сервера.
Данная таблица означает, что 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, который был выдан при создании сервера.
Если мы все сделали правильно, то появится сообщение об успешном подключении.
Возможные проблемы при открытии 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, который был выдан при создании сервера.
Вводим наш MySQL логин и пароль.
Мы успешно залогинились.
Теперь мы можем управлять базами данных 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.
Далее отключаем журналирование 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%:
В дополнение в вышесказанному, мы можем подвергнуть анализу скорость работы сайта с помощью инструмента Pagespeed от Google. Этот сервис укажет нам на текущие проблемы и выдаст полезные рекомендации. Для начала анализа достаточно ввести ссылку на нужную страницу в сервисе Google PageSpeed Insights.
На этом установка и начальная оптимизация LAMP завершены.
Можно приступать к установке системы управления контентом (CMS).
Вам также может быть интересна инструкция «Как привязать домен к сайту».