Сверхлёгкий webserver на Alpine linux

+23
3.62K
Не знаю, как нормальных людей, но меня всё время мучает вопрос, зачем для размещения небольшого сайта на виртуальном сервере я вынужден устанавливать серьёзную операционную систему типа centos, ubuntu или debian? Почему я должен тратить вполне реальные деньги на аренду мощностей, которые не используются даже на 10% ?
Неужели для функционирования вебсервера, интерпретатора php и сервера базы данных необходима операционка, занимающая места в сотни раз больше, чем сами файлы сайта и его база вместе взятые?
Этот вопрос не давал мне покоя, пока IamB не прислал ссылку на Alpine linux.
При анализе возможностей Альпайна выяснилось, что это не только платформа под докер, но и вполне самостоятельный дистрибутив, у которого есть вполне серьезный функционал, вполне серьезный набор пакетов, который поддерживается вполне многлюдным сообществом разработчиков.
Немного изучив имеющиеся возможности Альпайна и поэкспериментировав на кошечках на виртуалбоксе, смог изобразить себе вполне работоспособный сервер размером в 533 мегабайта, большую часть которого занимает mariadb. Без неё весь сервер весит 202 Мб.

Итак: скачиваем минимальный ISO с сайта Альпайна: Virtual.
Он весит целых 42 метра. Размеры дистрибутива вполне серьёзного линукса поражают.
Эксперименты с Альпайном я советую проводить на virtualbox
Особо мужественные люди могут сразу приступать к установке на VPS, но сразу предупреждаю, мне пришлось провести с десяток экспериментов, прежде, чем всё получилось как надо.
Под спойлером инструкция для смелых:
=============================================================================
Идем на сайт к своему хостеру, заходим в управление своим виртуальным сервером.
И смотрим настройки сетевого адаптера. ip, маска подсети, gateway. Они нам пригодятся.
И инициируем переустановку сервера...
У нормальных хостеров есть возможность подключения своего ISO.
Подключаем наш образ Альпайна, дожидаемся его загрузки и распаковки и, после перезагрузки сервера, приступаем к установке. Если всё получилось — можете не читать следующие два абзаца.
Если у хостера нет такой возможности, то, при наличии в панели управления сервером пункта VNC, можно воспользоваться этой инструкцией: Замена любого линукса на Альпайн.
В этой инструкции на английском языке пишут, что можно скачать ISO, смонтировать его в sda (именно туда, хоть раздела sda и не видно в списке) и начать установку оттуда, после перезагрузки. У меня нормально проходили оба метода.
Итак, мы каким-либо образом, путем предыдущих действий, попали в инсталлятор Альпайн-линукса. Он нам пишет: localhost login:
Вбиваем root и жмём enter. Далее, пишем в консоли setup-alpine. Система задает вопросы — отвечаем:
keyboard layout: us
Select variant: us
Enter system hostname: напишите что-нибудь английскими буквами. Так будет называться ваш сервер. Если лень думать — жмите энтер, ваш сервер будет называться localhost.
Далее запрос на инициализацию сетевого адаптера. Система предлагает адаптер, который видит. Жмем энтер. Далее запрос получения ip. Не надеемся на автоматическое получение ip по DHCP, а вбиваем наши, ранее сохраненные айпи, маску и gateway.
DNS domain name: 8.8.8.8
Как правило, дальше система сообщает, что подключилась сеть (у меня всегда всё получалось) и предлагает ввести пароль root. Придумываем пароль и вводим дважды по запросу.
Далее просит ввести временную зону. Я вводил Europe/Moscow. Если у вас другой часовой пояс — жмите знак вопроса — подскажут.
HTTP/FTP proxy: none
Просит сервер обновления времени. По умолчанию chrony. Жмем энтер.
Enter mirror number: россиянам 6 (yandex) самое быстрое зеркало, жителям Украины всё, что угодно, кроме 6. )))
Which SSH server: вбиваем dropbear. Иначе не пустит по SSH под рутом. openssh потом поставить можно.
Which disk(s): набираем none. Чтобы иметь хоть какую-то свободу выбора размера swap. Bначе автоматом назначит 2Gb.
Enter where to store configs: none
Enter apk cache dire… жмём энтер не глядя.
И вот, момент истины!
Мы настроили конфиг, но на диск ничего не записано! Набираем setup-disk -s 0
Вместо ноля можно написать любую цифру — это будет размер swap в мегабайтах. Я обычно ставлю 0 для экономии диска, памяти мой сервер всё равно не потребляет. Жмем энтер
Which disk(s) you like to use: sda
How would you like to use it: sys
WARNING: erase таляля… жмем y и энтер.
Двадцать секунд — наша система установлена.
Идем в панель хостинга, отключаем ISO, перезагружаем сервер. Ждем в VNC загрузки. Если видим характерную картинку и просит логин — значит всё получилось.
==================================================================
Устанавливаем virtualbox, создаем новую виртмашину, как под дебиан или центос.
После создания, перед запуском обязательно настраиваем сеть!
Выставляем "Сетевой мост" вместо NAT. Запускаем нашу новую виртмашину, оно попросит образ, указываем наш скачанный образ Alpine.
Оно загружается, появляется черное окно установки и запрос логина администратора.
Вбиваем root и жмём enter. Далее, пишем в консоли
  1. setup-alpine
Система задает вопросы — отвечаем:
keyboard layout: us
Select variant: us
Enter system hostname: напишите что-нибудь английскими буквами. Так будет называться ваш сервер. Если лень думать — жмите энтер, ваш сервер будет называться localhost.
Далее запрос на инициализацию сетевого адаптера. Система предлагает адаптер, который видит. Жмем энтер. Далее запрос получения ip. Предлагает DHCP — жмём энтер, ip будет получен автоматически от вашего роутера.
Как правило, дальше система сообщает, что подключилась сеть (у меня всегда всё получалось) и предлагает ввести пароль root. Придумываем пароль и вводим дважды по запросу.
Далее просит ввести временную зону. Я вводил Europe/Moscow. Если у вас другой часовой пояс — жмите знак вопроса — подскажут.
HTTP/FTP proxy: none
Просит сервер обновления времени. По умолчанию chrony. Жмем энтер.
Enter mirror number: россиянам 6 (yandex) самое быстрое зеркало.
Жителям Украины всё, что угодно, кроме 6. )))
Which SSH server: вбиваем dropbear. Иначе не пустит по SSH под рутом. openssh потом поставить можно.
Which disk(s) you like to use: sda
How would you like to use it: sys
WARNING: erase таляля… жмем y и энтер.
Двадцать секунд — наша система установлена.
Выключаем нашу виртмашину идем в настройки — Носители — отключаем установочный ISO.
Если видим характерную картинку и просит логин — значит всё получилось.
При загрузке альпайн пишет в консоли полученный по DHCP ip адрес, к нему можно подключиться по ssh.
Иллюстрация
Далее цепляемся к нему по ssh какой-нибудь putty и устанавливаем mc.
Установка mc в Альпайне выглядит так:
  1. apk add mc
То есть, по аналогии с дебианом, вместо apt — apk, вместо install — add, далее имя пакета.
Если просто запустить потом mc, мы увидим его в каких-то траурных рамках из крестиков и других псевдографических элементов, мышь при этом не работает, а в коммандной строке при нажатии мыши скобки с цифрами.
Чтобы нормально пользоваться mc, набираем в терминале ТЕRM=linux, энтер и потом mc -x. Получаем вполне нормальный midnight commander.
Идем в файл /etc/apk/repositories и убираем решетки впереди четырех последних строк. Этим мы делаем доступными нужные репозитории, где лежат нужные нам пакеты.
Иллюстрация
Далее обновляем наш сервер
  1. apk update
  2. apk upgrade
Устанавливаем легчайший и, что важно, понимающий htaccess, вебсервер openlitespeed
  1. apk add litespeed
Через секунду будет установлен вебсервер и php7. Стартуем litespeed
  1. rc-service litespeed start
Добавляем его в автозагрузку
  1. rc-update add litespeed
Всё готово, идем по адресу наш_айпи:7080 и видим окно авторизации openlitespeed
Иллюстрация
Логин admin пароль 123456. Пароль можно потом изменить в настройках панели.
Версия openlitespeed не самая свежая, но при должном упорстве, можно обновить (это тема отдельной статьи).
Далее ставим mariadb и phpmyadmin
  1. apk add mariadb mariadb-client phpmyadmin
После установки попытаемся запустить mariadb
  1. rc-service mariadb start
Она, конечно, ругнется и предложит доустановиться. Доустанавливаем.
  1. /etc/init.d/mariadb setup
Потом стартуем и настраиваем
  1. rc-service mariadb start
  2. mysql_secure_installation
Отвечаем на вопросы системы, ставим пароль root для mysql.
Далее читаем мануал по опенлайтспид, создаем из админпанели новый виртуалхост с Virtual Host Root /usr/share/webapps/phpmyadmin (там лежит наш phpmyadmin), создаём в той же панели Listener phpmyadmin, назначаем ему порт любой, например 1234, перегружаем нашу панель кнопкой Graceful restart и по адресу наш_айпи:1234 видим окно авторизации phpmyadmin.
Далее, по тому же принципу в панели создаем виртуальный хост с нашим сайтом (папку для сайта надо создать предварительно), создаем листенер на порту 80, подключаем к нему наш виртуальный хост и наш сайт готов. Далее, в phpmyadmin создаем пользователя с паролем, базу этого пользователя и продолжаем установку нашего сайта.
Занятого системой места на диске 491 метр.

Дополнения с картинками:

Как добавить и настроить домен в Openlitespeed:
Итак, у нас есть установленный alpine linux c установленным openlitespeed и phpmyadmin.
Добавим новый домен и развернём на нём сайт на InstantCMS 2.14.2.
Сначала добавим пользователя, от которого будет работать сайт (владельца сайта), так как делать сайт от имени рута — очень плохая практика с точки зрения безопасности.
Придумаем имя пользователя (допустим alp и добавим его стандартным для линукса способом:
  1. adduser alp
Попросит пароль дважды. Придумываем пароль и вбиваем. После этого в папке /home сама появится папка с именем нашего юзера /home/alp
Переходим эту папку
  1. cd /home/alp
создаем там папку для нашего сайта (допустим alp.tes)
  1. mkdir alp.tes
переходим в неё
  1. cd alp.tes
скачиваем туда установочный архив InstantCMS
  1. wget /load/url=/static/download/2.0/instantcms_20210412_v2.14.2.zip
распаковываем его
  1. unzip instantcms_20210412_v2.14.2.zip
Теперь у нас есть владелец сайта, папка сайта и в ней файлы сайта. Но браузер наши файлы не увидит, пока его туда не ткнешь мордой!
Для этого нам надо создать виртуальный сервер, к которому мы привяжем папку с нашим сайтом, listener (слушатель), который будет слушать порт, который мы укажем и привязать виртуальный хост к слушателю.
В меню панели управления Openlitespeed (будем называть её webadmin) выбираем пункт Virtual Hosts и жмем над списком хостов плюсик "Add", то есть добавить. Появляется форма добавления виртуального хоста. Заполняем нужные пункты формы.
Если тыкать в знаки вопроса в форме — появляются довольно понятные пояснения, что туда надо писать. Если кто не понимает по-английски — можно пользоваться онлайн-переводчиком (но лучше, после прочтения пояснения, переключать обратно на английский).
Заполняем:
Virtual Host Name (имя нашего сайта): alp.tes
Virtual Host Root (папка сайта, указываем полный путь к папке, куда распаковали файлы движка): /home/alp/alp.tes
Config File (Тыкаем в знак вопроса, копируем, что предлагают и вставляем в строку): $SERVER_ROOT/conf/vhosts/$VH_NAME/vhconf.conf
Enable Scripts/ExtApps (разрешить работу скриптов): Yes
Restrained: No
После этого жмем иконку с дискеткой вверху формы (сохраняем). Оно ругается на несозданный файл конфига и предлагает создать его автоматически. Жмем CLICK TO CREATE и опять на дискетку. Наш виртуальный хост создан, но нужно его настроить.
В списке хостов жмем на имя нашего хоста, потом на вкладку General — там жмем значок Edit. Заполняем форму.
Document Root: $VH_ROOT
Enable Compression: Yes
Сохраняем. Ниже на вкладке Index Files
Index Files: index.php
Auto Index: Yes
Сохраняем (жмем на дискетку). Теперь на вкладке Basic — Security редактируем External App Set UID Mode — выбираем DocRoot UID и сохраняем. Таким образом мы делаем так, что наш сайт работает от имени владельца папки сайта.
Идем во вкладку Rewrite — Rewrite Control
Enable Rewrite: Yes
Auto Load from .htaccess: Yes
Сохраняем. Теперь сервер будет понимать правила из файлов .htaccess инстанта.
Теперь добавляем слушателя. Идем в пункт Listeners главного меню, жмём на плюсик, добавляем listener с именем например HTTP (ведь на него можно навешать еще сайтов и все они будут открываться на 80-м порту)
Listener Name: HTTP
Port: 80
Secure: No
Сохраняем. Теперь тыкаем в имя слушателя HTTP, тыкаем в плюсик и выбираем в выпадающем списке наш виртуальный хост alp.tes
Virtual Host: alp.tes
Domains: *
После этого тыкаем в левом верхнем углу на имя нашего сервера, вылезает большое меню, в нем тыкаем на Graceful Restart и соглашаемся с перезагрузкой вебсервера.
Иллюстрация
Всё, путь к нашему сайту прописан на вебсервере и мы можем перейти к нему по нашему ip. наш_ip_адрес видим окно установки Инстанта и видим, что чего-то не хватает
Иллюстрация
Доустанавливаем необходимые расширения php и сам мемкешед заодно
  1. apk add php7-fileinfo php7-iconv php7-xml php7-memcache php7-memcached php7-curl php7-ftp php7-mbstring php7-gd php7-zip memcached
Перезапускаем php
  1. pkill lsphp7
Запускаем и записываем в автозагрузку memcached
  1. rc-service memcached start
  2. rc-update add memcached
Теперь можно приступить к установке InstantCMS, но у нас не создана база для него!
По инструкции выше создаем виртуальный сервер с именем phpmyadmin (или как вам удобнее его назвать) и листенер phpmyadmin с портом например 1234
Всё также, как для сайта, только во вкладке Basic указываем
Virtual Host Root: /usr/share/webapps/phpmyadmin
Теперь привязываем наш виртуальный сервер к слушателю, Graceful Restart и переходим по адресу наш_ip_адрес:1234 (или какой там порт вы указали слушателю phpmyadmin). Вводим логин root и пароль, который вводили для пользователя root при настройке mysql_security_installation
В phpmyadmin идем в Учетные записи пользователей и создаем нового пользователя (например alp) и сразу ставим галку "создать базу данных с таким же именем и предоставить все права на неё". Сохраняем.
Теперь можно приступать к установке InstantCMS!
+3
abasia abasia 3 года назад #
Хорошая статья, спасибо, что поделились практическим опытом!
0
qwest qwest 3 года назад #
Можно наверное nginx вместо mariadb использовать. Еще легче будет.
0
qwest qwest 3 года назад #
Вместо Apache ошибся
+4
Ris Ris 3 года назад #
В статье ни слова про апач. Используется openlitespeed.
Только есть один нюанс. Разработчик пакета litespeed для alpine linux удалил пакет.
Сам я, к сожалению, не имею доступа к сборщику пакетов.
Но ничего, у меня почти готов скрипт для развертывания сервера в один клик.
Как будет готов - выложу.

Еще от автора

Накрутка рейтинга и кармы пользователям, контенту и фото.
По многочисленным просьбам изготовил новый инструмент для изменения администратором сайта рейтинга и кармы пользователей.
Авторизация по любым полям из профиля и по API
Представляю уважаемому сообществу небольшое дополнение для доработки авторизации вашего сайта, а также для интеграции двух сайтов на Instantcms друг с
Утилита  от @fazer для очистки upload.
Вашему вниманию предлагается утилита для очистки папки upload от неиспользуемых изображений. Написана @fazer на языке PERL.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.