Termux позволяет развернуть полноценный веб‑стек прямо на Android: установить Apache, MySQL и PHP, подготовить виртуальные хосты и включить HTTPS с SSL‑сертификатами. В этой статье соберём LAMP, покажем рабочую структуру каталогов, настроим виртуальные хосты и объясним, как включить SSL. Материал ориентирован на практическую эксплуатацию в рамках локальной разработки и тестирования.
Что понадобится
- Android‑устройство с установленным Termux
- Доступ в интернет (для установки пакетов)
- Устройство/ПК в локальной сети (для проверки по IP), опционально — создание локальной сети через VPN, если вам так удобнее (не для обхода блокировок)
- Права на хранение/доступ к файловой системе в Termux
Обновление системы и установка базовых пакетов
Начнём с обновления и установки зависимостей. Операции выполняйте в Termux.
pkg update -y
pkg upgrade -y
pkg install -y wget curl nano openssl apache2 php php-mysqli mysql
В некоторых сборках зависимости для Apache/PHP могут отличаться. Если какой‑то пакет не находится, сообщите версию Termux и результат команды pkg search, и мы подскажем совместимый вариант.
Настройка MySQL/MariaDB в Termux
В Termux удобно использовать MySQL‑совместимый пакет. После установки подготовим базу и пользователя. Важно запускать сервер и проверять логи.
# Инициализация (если требуется)
# На практике в Termux иногда инициализация может отличаться по пакету.
# Попробуйте безопасный вариант запуска и инициализации через скрипт.
mkdir -p $HOME/mysql
cd $HOME
# Попытка стартовать сервис и создать базу. При ошибках — используйте подсказки из логов.
mysql --version
Так как в разных версиях Termux/пакетных репозиториях поведение MySQL может отличаться, приведём универсальный подход: запускаем сервер в фоновом режиме и работаем с ним через клиент. Если ваш пакет предоставляет сервисный скрипт — используйте его.
# Пример запуска (может отличаться в зависимости от сборки пакета)
# Если получаете ошибку, пришлите текст ошибки — настроим под вашу среду.
mysqld_safe --datadir=$HOME/mysql --socket=$HOME/mysql.sock &
# Проверка:
ss -ltn | grep -E '3306|mysql' || true
Далее создадим базу и пользователя для приложения.
mysql -u root -S $HOME/mysql.sock -e "CREATE DATABASE IF NOT EXISTS lampdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u root -S $HOME/mysql.sock -e "CREATE USER IF NOT EXISTS 'lampuser'@'localhost' IDENTIFIED BY 'StrongPasswordHere!';"
mysql -u root -S $HOME/mysql.sock -e "GRANT ALL PRIVILEGES ON lampdb. TO 'lampuser'@'localhost';"
mysql -u root -S $HOME/mysql.sock -e "FLUSH PRIVILEGES;"
Замените StrongPasswordHere! на надёжный пароль. Для локальной разработки этого достаточно.
Настройка PHP и подключения к MySQL
Для проверки, что PHP работает, создадим простой файл. Уточним web‑root и конфигурацию Apache позже, но для быстрого теста сделаем тестовую страницу.
mkdir -p $HOME/www
cat > $HOME/www/info.php << 'PHP'
<?php
phpinfo();
PHP
Пока это временно. В дальнейшем перенесём проект в папку виртуального хоста.
Подготовка каталогов для виртуальных хостов
Чтобы поддержать несколько сайтов (виртуальные хосты), организуем структуру:
- каталог конфигураций Apache (sites-available и sites-enabled)
- папки web‑контента для каждого домена
Создадим базовые директории:
mkdir -p $HOME/www/vhosts
mkdir -p $HOME/apache_conf/sites-available
mkdir -p $HOME/apache_conf/sites-enabled
Дальше важно понимать, где именно Apache ожидает конфиги в Termux. Обычно это в /data/data/com.termux/files/usr/etc/apache2/ либо в аналогичном каталоге, но для надёжности найдём путь.
# Найдём базовую структуру apache2 (пример — может отличаться)
ls -la $(dirname $(which apache2ctl)) 2>/dev/null || true
# Попробуем определить конфигурационный каталог
APCONF_DIR=$(apache2ctl -V 2>/dev/null | grep -i 'SERVER_CONFIG_FILE' | awk '{print $NF}' | xargs -I{} sh -c 'dirname {}')
echo "APCONF_DIR=$APCONF_DIR"
Если команда не даст путь, используйте:
find /data/data/com.termux/files/usr/etc -maxdepth 3 -type f -iname 'httpd.conf' -o -iname 'apache2' 2>/dev/null | head
find /data/data/com.termux/files/usr/etc -maxdepth 4 -type d -iname 'apache2' 2>/dev/null
В статье дальнейшие команды ориентированы на каталог /data/data/com.termux/files/usr/etc/apache2. Если у вас он отличается — замените переменные под свой путь.
Включение модулей Apache (rewrite, ssl, headers) при необходимости
Для работы с виртуальными хостами и HTTPS обычно нужны модули ssl и rewrite. Пакет Apache в Termux может включать/выключать модули через конфиги.
# Утилита a2enmod может отсутствовать; тогда проверяйте наличие .load/.conf файлов.
# Попробуем стандартный путь.
a2enmod ssl 2>/dev/null || true
a2enmod rewrite 2>/dev/null || true
# Проверка активных модулей (пример)
apache2ctl -M 2>/dev/null | grep -E 'ssl|rewrite|headers' || true
Создание SSL‑сертификата
Для тестов удобно использовать self‑signed сертификат. Для продакшена сертификаты следует получать из доверенного центра сертификации. В этой статье сделаем рабочий самоподписанный сертификат, который будет обслуживаться Apache.
Создадим директорию для сертификатов:
mkdir -p $HOME/certs/lamp
cd $HOME/certs/lamp
Сгенерируем ключ и сертификат. В качестве Common Name (CN) используйте имя, которое будете указывать в URL (например, example.local или ваш IP/домен в локальной сети).
openssl req -x509 -newkey rsa:4096 -keyout lamp.key -out lamp.crt \
-days 3650 -nodes -subj "/C=RU/ST=Region/L=City/O=Local/CN=lamp.local"
# Для удобства проверим содержимое
openssl x509 -in lamp.crt -noout -text | head -n 20
Если вы хотите, чтобы сертификат корректно работал на разных адресах, можно добавить SAN (Subject Alternative Name). Это усложняет команду OpenSSL, но при необходимости мы можем подстроить конфиг под ваш случай.
Конфигурация Apache: базовый webroot и включение виртуальных хостов
Создадим виртуальный хост, например для lamp.local. Разместим файлы в $HOME/www/vhosts/lamp.local.
DOM=lamp.local
WEBROOT=$HOME/www/vhosts/$DOM
mkdir -p $WEBROOT/public_html
cat > $WEBROOT/public_html/index.php << 'PHP'
<?php
$mysqli = new mysqli('localhost', 'lampuser', 'StrongPasswordHere!', 'lampdb');
if ($mysqli->connect_errno) {
http_response_code(500);
echo 'DB connection failed: ' . $mysqli->connect_error;
exit;
}
echo '<h1>LAMP on Termux (HTTPS + vhost)</h1>';
echo '<p>MySQL: connected</p>';
PHP
Далее создадим конфигурацию виртуального хоста. Ниже приведён пример, который обычно работает в Apache 2.4. Обратите внимание: пути к модулям/конфигам могут отличаться в вашей сборке Termux.
APACHE_ETC=/data/data/com.termux/files/usr/etc/apache2
# Проверим, что каталог существует
ls -la $APACHE_ETC 2>/dev/null || true
cat > $HOME/apache_conf/sites-available/$DOM.conf << 'CONF'
<VirtualHost :80>
ServerName lamp.local
DocumentRoot PLACEHOLDER_DOCROOT
<Directory PLACEHOLDER_DOCROOT>
AllowOverride All
Require all granted
Options FollowSymLinks
</Directory>
# Если PHP не подключён автоматически — добавьте обработчик.
# В Termux это часто настраивается модулями php.
</VirtualHost>
<VirtualHost :443>
ServerName lamp.local
DocumentRoot PLACEHOLDER_DOCROOT
SSLEngine on
SSLCertificateFile PLACEHOLDER_CERT_CRT
SSLCertificateKeyFile PLACEHOLDER_CERT_KEY
<Directory PLACEHOLDER_DOCROOT>
AllowOverride All
Require all granted
Options FollowSymLinks
</Directory>
# Мягкая настройка для безопасности тестовой среды
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
</VirtualHost>
CONF
Подставим правильные значения плейсхолдеров:
sed -i "s|PLACEHOLDER_DOCROOT|$WEBROOT/public_html|g" $HOME/apache_conf/sites-available/$DOM.conf
sed -i "s|PLACEHOLDER_CERT_CRT|$HOME/certs/lamp/lamp.crt|g" $HOME/apache_conf/sites-available/$DOM.conf
sed -i "s|PLACEHOLDER_CERT_KEY|$HOME/certs/lamp/lamp.key|g" $HOME/apache_conf/sites-available/$DOM.conf
Подключение виртуальных хостов в конфигурацию Apache
Пакет Apache в Termux может не иметь стандартную схему sites-enabled. Поэтому сделаем по факту: добавим include в основной конфиг или скопируем конфиг в место, которое Apache загружает автоматически.
Найдём основной конфиг Apache:
apache2ctl -S 2>/dev/null || true
# Попробуем найти основной конфигурационный файл
find /data/data/com.termux/files/usr/etc/apache2 -maxdepth 2 -type f -iname '.conf' 2>/dev/null | head -n 30
Часто используется файл наподобие httpd.conf или apache2.conf. Допустим, это $APACHE_ETC/apache2.conf. Добавим include директиву на папку, где хранятся включаемые конфиги.
# Создадим директорию, куда будем складывать включаемые конфиги
mkdir -p $APACHE_ETC/sites-enabled
# Скопируем наш vhost
cp -f $HOME/apache_conf/sites-available/$DOM.conf $APACHE_ETC/sites-enabled/$DOM.conf
# Добавим include в apache2.conf (если там нет)
# Внимание: команда может отличаться; проверяйте наличие строки.
CONF_FILE=$APACHE_ETC/apache2.conf
if [ -f "$CONF_FILE" ]; then
grep -q "sites-enabled" "$CONF_FILE" || \
printf "
# Custom vhosts
Include %s/sites-enabled/*.conf
" "$APACHE_ETC" >> "$CONF_FILE"
fi
Запуск Apache и проверка конфигурации
Перед запуском всегда полезно проверить конфигурацию и посмотреть, что слушатели поднялись на нужных портах (80 и 443).
# Проверка синтаксиса
apache2ctl configtest
# Запуск (остановите ранее запущенные процессы при необходимости)
apache2ctl start
# Проверим слушающие порты
ss -ltn | grep -E ':80|:443' || true
Локальная проверка HTTPS
Сначала узнаем IP‑адрес вашего Android в локальной сети (например, через настройки Wi‑Fi) или через команду:
ip addr | grep -E 'inet ' | grep -v '127.0.0.1' | head -n 5
Далее:
- Откройте браузер на вашем устройстве по адресу
https://lamp.local, если у вас настроен DNS/hosts - Или используйте IP:
https://<IP_Android>/— при этом сертификат может ругаться, т.к. CN может не совпадать с IP
Для точного соответствия можно подстроить CN/SAN под IP или добавить запись в hosts. Для hosts на Android обычно нужны соответствующие права/сервисы; удобнее в тестовом сценарии принять предупреждение браузера.
Поддержка виртуальных хостов: добавление второго домена
Чтобы добавить ещё один сайт, повторите паттерн: создайте директорию, контент и конфиг виртуального хоста.
# Пример для второго домена
DOM2=app.local
WEBROOT2=$HOME/www/vhosts/$DOM2
mkdir -p $WEBROOT2/public_html
cat > $WEBROOT2/public_html/index.php << 'PHP'
<?php
echo '<h1>Second vhost</h1>';
PHP
cp -f $HOME/apache_conf/sites-available/$DOM.conf \
$HOME/apache_conf/sites-available/$DOM2.conf
sed -i "s/ServerName $DOM/ServerName $DOM2/" $HOME/apache_conf/sites-available/$DOM2.conf
sed -i "s|$WEBROOT/public_html|$WEBROOT2/public_html|g" $HOME/apache_conf/sites-available/$DOM2.conf
# Включаем конфиг
cp -f $HOME/apache_conf/sites-available/$DOM2.conf $APACHE_ETC/sites-enabled/$DOM2.conf
# Перезагрузка Apache
apache2ctl graceful
Базовая безопасность и полезные улучшения
- Не используйте такие же пароли, что и в примере, для реальных аккаунтов.
- Ограничьте доступ к управляющим страницам (если появятся) через
<Directory>и IP‑фильтры. - Для тестовой среды можно включать HSTS (как в примере), но внимательно: после браузеры будут принудительно ходить по HTTPS.
- Следите за правами на каталоги проекта: Apache должен иметь доступ на чтение.
Диагностика: как понять, что пошло не так
Если сайт не открывается по HTTP/HTTPS, используйте порядок проверок:
- Синтаксис конфигурации:
apache2ctl configtest - Статус слушателей:
ss -ltn | grep -E ':80|:443' - Логи Apache: обычно доступны в каталогах пакета Apache; найдите через
apache2ctl -Vи сообщения об ошибках при старте - PHP‑обработка: создайте
info.phpи проверьте, что он выполняется, а не скачивается - MySQL‑подключение из PHP: временно выводите ошибки соединения (как в примере)
Также полезно проверить активные конфиги и модули:
apache2ctl -M
apache2ctl -S
Заключение
Мы собрали LAMP‑стек в Termux: установили Apache, PHP и MySQL‑совместимую базу, настроили виртуальные хосты, добавили HTTPS с SSL‑сертификатами и показали рабочий шаблон для нескольких доменов. Такой подход удобен для локальной разработки, тестирования и развёртывания прототипов прямо с Android.
Если хотите сделать это «под ключ» или требуется настройка под вашу конкретную версию Termux/пакетов, команда РыбинскЛАБ помогает с установкой, аудитом конфигураций и диагностикой проблем, чтобы вы быстрее получили стабильный результат.