We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Создание и конфигурация локального веб‑сервера Nginx с поддержкой HTTP/2 и сертификатов Let’s Encrypt в Termux

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 git
curl https://get.acme.sh | sh

Скрипт acme.sh обычно ставит исполняемый файл в домашнюю директорию. Проверьте наличие:

~/.acme.sh/acme.sh --version

Подготовка структуры и каталогов

Создадим рабочие директории под сайты, ключи и логи. Удобнее держать всё в одном месте внутри home Termux.

mkdir -p ~/webroot/example.com/public_html
mkdir -p ~/nginx/sites-available ~/nginx/sites-enabled
mkdir -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, внутренние сети, поддержка продления и журналирования) — обратитесь в РыбинскЛАБ. Мы помогаем настраивать и сопровождать инфраструктуру, чтобы сервис работал стабильно и безопасно.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен и доработан перед публикацией.

Нужна помощь с настройкой Termux, Linux и серверов?

Я оказываю ИТ-услуги: настройка серверов, автоматизация, безопасность, помощь с Linux и инфраструктурой. Материалы сайта — только в ознакомительных и образовательных целях.

Связаться со мной
Поддержать проект