Установка и настройка darkhttpd на Ubuntu: быстрый статический веб‑сервер

Содержание
- Darkhttpd vs Apache vs Nginx
- Подготовка системы для darkhttpd
- Установка и запуск darkhttpd
- Подключение SSL через stunnel
- Когда darkhttpd не подходит
- Альтернативы и рекомендации
- Чек‑листы и критерии приёмки
- Краткое резюме
Darkhttpd vs Apache vs Nginx
Darkhttpd — не единственный HTTP‑сервер для Linux. Есть Apache, Nginx, Caddy, Lighttpd и другие. Ниже — сравнение darkhttpd с Apache и Nginx по практическим критериям.
Darkhttpd выигрывает по простоте использования: это один исполняемый файл, который не требует сложной конфигурации системы и init‑скриптов. Это удобно, если нужно быстро поделиться статическим сайтом или разместить небольшой проект на VPS.

С точки зрения безопасности, darkhttpd использует chroot для файлов и имеет автоматические тайм‑ауты для неактивных соединений и базовое логирование. Однако Apache и Nginx предоставляют более развитые средства: фильтры ограничения частоты запросов, тонкую настройку HTTP‑заголовков и дополнительные модули для защиты.
Простота darkhttpd одновременно ограничивает его гибкость. Авторы сделали акцент на быстром обслуживании статического контента, поэтому darkhttpd не предназначен для выполнения CGI‑скриптов или работы в роли обратного прокси для сложных приложений.

| Категория | darkhttpd | Apache | Nginx |
|---|---|---|---|
| Простота использования | Не требует дополнительной конфигурации для хостинга статических сайтов. | Требует системной и сайто‑ориентированной конфигурации. | Требует конфигурации сайтов. |
| Безопасность в целом | Базовый chroot и логирование. | Поддерживает rate limiting и защитные HTTP‑заголовки. | Поддерживает rate limiting и защитные HTTP‑заголовки. |
| Поддержка SSL | Нет встроенной поддержки SSL. | Поддерживается через mod_ssl. | Встроенная поддержка SSL. |
| Гибкость приложений | Только статический контент. | Статический и динамический контент. | Веб‑сервер, балансировщик и обратный прокси. |
Важно: если вам нужно шифрование трафика, автоматическое обновление сертификатов, полнофункциональный обратный прокси или выполнение динамических приложений — рассмотрите Nginx или Caddy.
Подготовка системы для darkhttpd
Примечание: инструкция проверялась на Ubuntu 24.04 на VPS с минимум 512 МБ оперативной памяти. Команды будут работать в большинстве дистрибутивов, но в некоторых командах пакетного менеджера могут быть отличия.
Первым шагом мы подготовим окружение для запуска darkhttpd в Docker и Docker Compose.
Скачать ключ подписи Docker и зарегистрировать его в системе:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpgСоздайте файл репозитория Docker:
sudo nano /etc/apt/sources.list.d/docker.listВставьте в файл следующую строку:
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu noble stableОбновите индексы пакетов и систему:
sudo apt update && sudo apt upgradeУстановите Docker, плагин Compose и Git:
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-buildx-plugin git
Примечания по локализации и доступности: если ваш VPS имеет ограниченный объём памяти (512 МБ — минимально приемлемо), следите за потреблением памяти контейнерами и системными службами. На слабых машинах избегайте одновременного запуска тяжёлых сервисов.
Установка и запуск darkhttpd
Клонируйте репозиторий darkhttpd и подготовьте Docker Compose:
cd ~ && git clone https://github.com/emikulic/darkhttpd.gitПерейдите в папку репозитория и создайте файл docker-compose.yml:
cd darkhttpd && nano ./docker-compose.ymlВставьте в него следующий блок:
services:
darkhttpd:
container_name: darkhttpd-website
build:
context: .
dockerfile: Dockerfile
volumes:
- "./html:/var/www/htdocs:ro"
ports:
- "8080:80"Сохраните файл и соберите контейнер, затем запустите его:
sudo docker compose up -dСоздайте папку для статического сайта и скопируйте туда файлы:
mkdir ./html/
cp -rv ~/my-website ./html/Проверьте список запущенных контейнеров:
docker ps
Совет: если вы переносите контейнеры между хостами, используйте сохранение образов (docker save/load) и перенос томов данных; для статических сайтов достаточно синхронизировать папку html.
Подключение SSL через stunnel
По умолчанию darkhttpd слушает HTTP (порт 80). Чтобы открывать сайт по HTTPS, используйте обратный прокси SSL, например stunnel, который принимает TLS‑соединения на 443 и перенаправляет их на порт контейнера (8080).
Создайте DNS‑A запись для вашего домена, указывающую на IPv4 вашего VPS, например web.example.com.
Установите stunnel, snap core и certbot для получения сертификата Let’s Encrypt:
sudo apt install stunnel4
sudo snap install core && sudo snap install certbot --classicНа Fedora:
sudo dnf install stunnel certbot- Зарегистрируйте учётную запись certbot и получите сертификат:
sudo certbot register --agree-tos -m YOUR-EMAIL@EXAMPLE.COM
sudo certbot certonly --standalone -d SUBDOMAIN.YOUR-DOMAIN.TLD
- Создайте конфигурацию stunnel:
sudo nano /etc/stunnel/stunnel.confВставьте:
output = /var/log/stunnel4/stunnel.log
cert = /etc/letsencrypt/live/SUBDOMAIN.YOUR-DOMAIN.TLD/fullchain.pem
key = /etc/letsencrypt/live/SUBDOMAIN.YOUR-DOMAIN.TLD/privkey.pem
[https]
client = no
accept = 443
connect = 8080Запустите сервис stunnel:
sudo systemctl start stunnel4.serviceНа Fedora сервис может называться stunnel.service:
sudo systemctl start stunnel.service
Откройте ваш поддомен в браузере и убедитесь, что сайт загружается по HTTPS:

Совет по эксплуатации: автоматизируйте обновление сертификатов certbot (обычно системный cron/snap уже создаёт таймер). После обновления сертификата служба stunnel может потребовать перезапуска для подхвата новых файлов.
Когда darkhttpd не подходит
- Если вам нужен обратный прокси для нескольких приложений с динамическими маршрутами и балансировкой нагрузки — лучше Nginx или Traefik.
- Для автоматической выдачи HTTP/2 и управления сертификатами по‑умолчанию удобнее Caddy.
- Если требуется запуск серверных скриптов (PHP, CGI) или модульная экосистема — Apache или Nginx предпочтительнее.
Альтернативные подходы
- Nginx как статический хост: даёт гибкую конфигурацию и производительные соединения.
- Caddy: простая настройка HTTPS «из коробки» с автоматическим получением сертификатов.
- Использование контейнеров без stunnel: настраивать Nginx‑контейнер как фронтенд и проксировать на darkhttpd‑контейнер.
Модель принятия решения (упрощённая)
Mermaid диаграмма выбора сервера:
flowchart TD
A[Нужен статический сайт?] -->|Да| B{Нужен SSL и автомат. сертификаты?}
B -->|Да| C[Caddy или Nginx]
B -->|Нет| D[darkhttpd]
A -->|Нет| E[Нужны динамические приложения]
E --> F[Apache или Nginx]Чек‑листы по ролям
Администратор:
- Проверить доступность порта 8080 локально.
- Обеспечить резервное копирование папки ./html.
- Настроить автоматическое обновление сертификатов и перезапуск stunnel.
- Мониторить логи stunnel и контейнера.
Разработчик/владелец сайта:
- Убедиться, что все ресурсы использует относительные пути.
- Тестировать сайт локально перед копированием в ./html.
- Проверять заголовки безопасности (Content‑Security‑Policy, X-Frame‑Options) — при необходимости добавлять на уровне прокси.
Критерии приёмки
- Сайт доступен по HTTPS на целевом домене.
- Статические файлы корректно отдаются контейнером darkhttpd.
- SSL‑сертификат корректен и не истёк.
- Логи stunnel и контейнера фиксируют обращения и ошибки.
Мини‑методология развертывания
- Подготовьте VPS и резервную копию файлов.
- Установите Docker и скопируйте репозиторий darkhttpd.
- Соберите контейнер и запустите служебный сайт на 8080.
- Получите SSL‑сертификат через certbot.
- Настройте stunnel как фронтенд для TLS.
- Проверяйте доступность и автоматизируйте поддержку сертификатов.
Тесты и приёмочные сценарии
- Открыть https://SUBDOMAIN — страница должна загрузиться без смешанного контента.
- Отключить stunnel временно — сайт по HTTPS должен быть недоступен, по HTTP на 8080 — доступен (локально).
- Обновить сертификат вручную и проверить, что stunnel использует новый файл после рестарта.
Рекомендации по безопасности
- Ограничьте доступ к папке ./html правами только на чтение для контейнера.
- Пересмотрите политики логирования и ротации (logrotate) для stunnel и контейнера.
- Для публичных сервисов настройте WAF/фильтрацию на уровне сети или фронтенда.
Совместимость и миграция
- Переход на Nginx/Caddy: экспортируйте список доменов и перенаправления, воспроизведите маршруты и правила кеширования.
- Для крупных проектов лучше заранее планировать распределение ролей (фронтенд, приложение, статический CDN).
Когда стоит выбрать darkhttpd
- Небольшие демонстрационные сайты и прототипы.
- Внутренние ресурсы сети, где HTTPS закрывается на прокси‑уровне.
- Образовательные задачи и быстрые PoC, где не нужна сложная конфигурация.
Краткое резюме
Darkhttpd — отличный инструмент для быстрой публикации статического контента: минимализм и простота — его основное преимущество. Для production‑проекта с требованием гибкости, продвинутой безопасности и управлением сертификатами стоит рассмотреть Nginx, Caddy или комбинированный подход с прокси.
Изображения и скриншоты — демонстрационные; автор фото: Ilya Pavlov via Unsplash. Скриншоты и изменения интерфейса — сделаны Ramces Red.
Похожие материалы
Как управлять 100+ вкладками в браузере
Десктопная версия сайта на iPhone и Android
Просмотр и удаление браузерных плагинов
Как удалить страницу в Google Docs быстро
Удалить репозиторий в Ubuntu — быстро и безопасно