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 через сокет ‘/var/run/mysqld/mysqld.sock’ (2)
Ця помилка означає, що MySQL сервіс зупинено і слід запустити його, виконавши:
Для CentOS:
service mysqld start
Для Debian, Ubuntu:
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).
Вам також може бути цікава інструкція «Як прив’язати домен до сайту».