Termux давно превратился из «терминала для экспериментов» в полноценную среду для развертывания сервисов прямо на Android. В этой статье Денис Евгеньевич, ведущий эксперт РыбинскЛАБ, покажет, как создать локальный веб‑сервер на базе Nginx в Termux, включить HTTP/2 и настроить HTTPS с сертификатами Let’s Encrypt.
Важно: конфигурация ниже ориентирована на локальное/домашнее применение (внутрисетевая доступность). Для получения сертификатов Let’s Encrypt нужен корректный доступ по доменному имени и подтверждение владения доменом; если вы используете только локальную сеть без маршрутизации из интернета, получение публичного сертификата через Let’s Encrypt обычно нецелесообразно. В таком случае можно рассмотреть альтернативы (например, внутренний CA), но в этой статье мы фокусируемся на Let’s Encrypt.
Что потребуется
- Android‑устройство с установленным Termux
- Пакеты: Nginx, certbot (или альтернативный клиент для ACME), а также утилиты для сборки/поддержки окружения
- Доменное имя, для которого вы сможете сделать DNS/HTTP‑проверку Let’s Encrypt (или настройка, позволяющая пройти challenge)
- Доступность портов 80/443 извне (если подтверждение Let’s Encrypt требует интернет‑доступа)
- Техническая дисциплина: аккуратное обращение с конфигурациями, ключами и правами
Обновление Termux и установка зависимостей
Начнём с обновления пакетов и установки необходимых инструментов. Сначала обновите базу пакетов:
pkg update -y && pkg upgrade -yДалее установим Nginx и базовые утилиты. Набор пакетов может немного отличаться в зависимости от версии репозитория Termux, но общий подход сохраняется.
pkg install -y nginx openssl curl ca-certificates nanoДля Let’s Encrypt в Termux чаще всего используют acme.sh (как универсальный скрипт) либо certbot через Python. В рамках практичности и повторяемости мы рассмотрим вариант с acme.sh, т.к. он обычно быстрее разворачивается в пользовательской среде. Установим acme.sh:
pkg install -y gitcurl https://get.acme.sh | shСкрипт acme.sh обычно ставит исполняемый файл в домашнюю директорию. Проверьте наличие:
~/.acme.sh/acme.sh --versionПодготовка структуры и каталогов
Создадим рабочие директории под сайты, ключи и логи. Удобнее держать всё в одном месте внутри home Termux.
mkdir -p ~/webroot/example.com/public_htmlmkdir -p ~/nginx/sites-available ~/nginx/sites-enabledmkdir -p ~/nginx/logsПодготовим тестовую страницу, чтобы убедиться, что Nginx отвечает корректно:
cat > ~/webroot/example.com/public_html/index.html <<'EOF'
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Termux Nginx</title>
</head>
<body>
<h1>Hello from Nginx in Termux (HTTP/2 + HTTPS)</h1>
</body>
</html>
EOFНастройка Nginx: базовый конфиг и включение HTTP/2
В Termux Nginx может поставляться с конфигурациями в системе, но безопаснее работать с пользовательскими файлами и аккуратно подключать их. Сначала найдите основной конфиг Nginx. Обычно путь начинается с /data/data/com.termux/files/usr/etc/nginx или /etc/nginx в зависимости от сборки.
Проверьте:
nginx -tЗатем отредактируйте (или создайте) нужные include‑файлы. В качестве практичного варианта используйте отдельный server‑блок и подключите его через include. Например, вы можете заменить/добавить строку в главном конфиге:
include /data/data/com.termux/files/home/nginx/sites-enabled/*.conf;Ниже пример конфигурации server‑block. Замените example.com на ваш домен.
Создадим файл:
cat > ~/nginx/sites-available/example.com.conf <<'EOF'
# HTTP (порт 80) - для ACME challenge и редиректа
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /data/data/com.termux/files/home/webroot/example.com/public_html;
index index.html;
location /.well-known/acme-challenge/ {
# acme.sh будет складывать challenge-файлы сюда
root /data/data/com.termux/files/home/webroot/example.com/public_html;
}
location / {
return 301 https://$host$request_uri;
}
}
# HTTPS (порт 443) - HTTP/2 + TLS
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
root /data/data/com.termux/files/home/webroot/example.com/public_html;
index index.html;
ssl_certificate /data/data/com.termux/files/home/.acme.sh/example.com/fullchain.cer;
ssl_certificate_key /data/data/com.termux/files/home/.acme.sh/example.com/example.com.key;
# Рекомендуемые параметры TLS (упрощённо)
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
# Заголовки безопасности (минимальный набор)
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options SAMEORIGIN always;
add_header Referrer-Policy strict-origin-when-cross-origin always;
location / {
try_files $uri $uri/ =404;
}
}
EOFВажно: пути к сертификатам в примере указывают на типичную структуру acme.sh, но фактические файлы могут отличаться. После получения сертификатов проверьте наличие fullchain.cer и example.com.key.
Далее включим конфиг, создав symlink (если вы подключаете include‑директорию):
ln -sf ~/nginx/sites-available/example.com.conf ~/nginx/sites-enabled/example.com.confПроверьте конфигурацию:
nginx -tЗапуск Nginx и базовая проверка
Запустите Nginx. Если Nginx требует foreground/daemon‑режим, ориентируйтесь на поведение в Termux (на практике удобно запускать в фоне через &).
nginxПроверьте, что порт 80 открыт внутри устройства. На локальном устройстве можно проверить:
curl -I http://localhost/И на HTTP редирект до HTTPS:
curl -I http://localhost -LПока сертификаты не получены, запросы на https:// могут завершаться ошибкой. Это нормально: сначала получим Let’s Encrypt.
Получение сертификатов Let’s Encrypt через acme.sh
Теперь ключевой блок: выпуск сертификата. Для Let’s Encrypt вам нужно определить тип challenge. Самый распространённый для автоматизации — HTTP challenge, который использует доступ по порту 80 и URL вида:
http://example.com/.well-known/acme-challenge/...
Так как мы оставили location для /.well-known/acme-challenge/ на порту 80, acme.sh сможет разместить challenge‑файлы.
Выполните выпуск сертификата:
~/.acme.sh/acme.sh --issue --standalone -d example.com -d www.example.com --httpport 80 --httpsport 443 --keylength ec-256 --forceОднако режим --standalone поднимает временный веб‑сервер для challenge и может конфликтовать с уже запущенным Nginx. Если у вас Nginx уже слушает 80, используйте один из вариантов:
- Остановить Nginx на время выдачи сертификата
- Использовать режим webroot (если применим в вашей схеме)
Вариант с webroot часто удобнее. Попробуйте такой запуск:
~/.acme.sh/acme.sh --issue --webroot ~/webroot/example.com/public_html -d example.com -d www.example.com --keylength ec-256 --forceПосле успешной выдачи установим сертификаты в место, которое мы указали в Nginx. Acme.sh обычно позволяет сделать это через --install-cert.
~/.acme.sh/acme.sh --install-cert -d example.com
--cert-file ~/nginx/certs/example.com/fullchain.cer
--key-file ~/nginx/certs/example.com/example.com.key
--fullchain-file ~/nginx/certs/example.com/fullchain.cer
--reloadcmd "nginx -s reload"Если вы хотите строго соответствовать путям из конфигурации Nginx в статье, убедитесь, что каталоги совпадают. Либо скорректируйте конфиг Nginx под фактические пути.
Проверка наличия файлов:
ls -la ~/nginx/certs/example.comТестовая проверка конфигурации Nginx и перезапуск:
nginx -t && nginx -s reloadПроверка HTTP/2 и HTTPS
Убедитесь, что HTTPS отвечает корректно:
curl -I https://example.comДля проверки HTTP/2 удобно использовать curl с указанием протокола. Примерно так:
curl -I --http2 https://example.comЕсли сервер действительно поднял HTTP/2, вы обычно увидите указание на negotiated protocol в выводе (зависит от версии curl и настроек TLS/ALPN).
Проверьте логи Nginx при ошибках. Например, в директории ~/nginx/logs или в системных путях из базового конфигарации:
tail -n 200 ~/nginx/logs/error.log 2>/dev/null || trueБезопасность и практические рекомендации
- Не храните лишнее: ключи TLS и файлы конфигурации с секретами держите в защищённых директориях и не публикуйте их.
- Ограничьте доступ к административным страницам (если вы их создаёте). Для локального серверa используйте минимальные механизмы доступа.
- Следите за обновлениями: Nginx и пакеты в Termux регулярно обновляйте через
pkg upgrade. - Автоматическое продление Let’s Encrypt: acme.sh поддерживает cron/автопланировщик. Для мобильной среды особенно важно, чтобы задача продолжала выполняться при изменении режима устройства.
- Планирование поддержки HTTP/2: в конфигурации включайте
http2в строкеlisten 443 ssl http2;. Если сертификаты установлены корректно, HTTP/2 включится автоматически через ALPN.
Автопродление сертификатов acme.sh
Схема продления зависит от используемого механизма запуска. Acme.sh обычно предлагает команду для установки cron. Пример (проверьте актуальность в вашем окружении):
~/.acme.sh/acme.sh --cron --domain example.com --authenticator webroot --webroot ~/webroot/example.com/public_html --renew-hook "nginx -s reload"Если cron в Termux не настроен, можно использовать альтернативные средства планирования (в зависимости от ваших условий). Главное — убедиться, что продление реально срабатывает.
Устранение типовых проблем
- Let’s Encrypt не проходит challenge: проверьте доступность домена, корректность DNS‑записей и то, что порт 80 доступен для проверки.
- Конфликт порта 80: если используете
--standalone, остановите Nginx на время выдачи. - Nginx не стартует: всегда начинайте с
nginx -t, затем смотрите конфиг и пути к сертификатам. - HTTP/2 не включается: убедитесь, что в конфиге действительно указано
listen 443 ssl http2;и сертификаты корректны.
Заключение
Мы разобрали практический сценарий: развернули локальный веб‑сервер Nginx в Termux, включили HTTP/2, подготовили сайт, подключили HTTPS и выпустили сертификаты Let’s Encrypt через acme.sh. Такой подход позволяет получать защищённое соединение и современную транспортную оптимизацию (HTTP/2) даже в мобильной среде.
Если вам нужна помощь с подбором конфигураций под ваш сценарий (домен, схема challenge, внутренние сети, поддержка продления и журналирования) — обратитесь в РыбинскЛАБ. Мы помогаем настраивать и сопровождать инфраструктуру, чтобы сервис работал стабильно и безопасно.