Skip to content

GubinNET

Общее описание

GubinNET — это высокопроизводительный HTTP-сервер с поддержкой модулей, написанный на языке Go. Он обладает широким спектром возможностей: - Поддержка виртуальных хостов - SSL/TLS (HTTPS) - Проксирование запросов - Защита от DDoS-атак - Кэширование файлов - Метрики производительности через Prometheus - Поддержка пользовательских модулей на C/C++ (через CGO)


Архитектура сервера

Основные компоненты:

  1. HTTP/HTTPS сервер — основной веб-сервер с поддержкой TLS.
  2. Виртуальные хосты — поддержка нескольких доменов на одном IP.
  3. Анти-DDoS система — защита от перегрузки запросами.
  4. Модульная система — возможность запуска пользовательского кода.
  5. Кэширование статики — ускорение отдачи статических файлов.
  6. Логгирование — подробная запись событий и метрик.
  7. Prometheus метрики — интеграция для мониторинга.

Установка

Требования:

  • ОС: Linux или macOS
  • Go 1.20+
  • g++
  • libdl-dev (для CGO)

Сборка:

go build -o gubinnet main.go

Запуск:

sudo ./gubinnet

Конфигурация

Файлы конфигурации

Файлы конфигурации находятся в /etc/gubinnet/config/. Имя файла должно заканчиваться на .ini.

Пример конфигурации (example.com.ini):

server_name=example.com
listen_port=80
root_path=/var/www/example.com
index_file=index.html
use_ssl=false
redirect_to_https=true
proxy_url=https://backend.example.com
try_files=$uri/index.html,$uri.html,$uri

Параметры конфигурации:

Параметр Описание
server_name Имя виртуального хоста (например, example.com)
listen_port Порт, на котором слушает сервер
root_path Корневая папка сайта
index_file Имя главной страницы (по умолчанию index.html)
use_ssl Включить ли SSL (true/false)
cert_path Путь к SSL-сертификату
key_path Путь к приватному ключу сертификата
redirect_to_https Перенаправлять HTTP на HTTPS (true/false)
proxy_url URL бэкенда для проксирования
try_files Последовательность файлов для поиска

Возможности

Виртуальные хосты

Поддерживаются множественные сайты на одном сервере. Настройка происходит через отдельные INI-файлы.

HTTPS / SSL

Поддержка TLS 1.2+. Сертификаты загружаются динамически при старте или перезагрузке конфигурации.

Проксирование

Сервер может выступать как reverse proxy, направляя запросы на другой backend.

Пример:

proxy_url=https://internal-api.example.com

Анти-DDoS

Ограничивает количество запросов от одного IP, блокируя злоумышленников.

Параметры: - MaxRequestsPerSecond — максимум запросов в секунду - BlockDuration — время блокировки (в секундах) - LogFilePath — путь к логу DDoS-защиты

Кэширование

Статические файлы кэшируются в памяти для повышения производительности.

Логи

  • Логи доступа: /etc/gubinnet/logs/access.log
  • Логи Anti-DDoS: /tmp/antiddos.log
  • Логи модулей: выводятся в stdout

Поддерживается автоматическая ротация логов (раз в 24 часа).

Prometheus метрики

Интеграция с Prometheus для мониторинга: - http_requests_total — общее число запросов - http_request_duration_seconds — длительность запросов - http_active_connections — активные соединения - module_executions_total — вызовы модулей - module_errors_total — ошибки выполнения модулей

Доступны по адресу /metrics (если не изменено).


Поддержка модулей

Система модулей

GubinNET позволяет подключать собственные модули на C/C++. Они компилируются в .so файлы и размещаются в /etc/gubinnet/modules/<module-name>/.

Структура модуля:

/etc/gubinnet/modules/
└── hello/
    ├── module.cpp
    └── module.so

Пример C++ модуля (module.cpp):

#include <string.h>

extern "C" {
    char* process(const char* input) {
        return strdup("Hello from C++!");
    }
}

Компиляция:

g++ -shared -fPIC module.cpp -o module.so

Вызов модуля:

GET /modules/hello?input=test

Ответ:

Hello from C++!

Администрирование

Перезагрузка конфигурации

Чтобы перечитать конфигурацию без перезапуска сервера, отправьте сигнал SIGHUP:

kill -HUP <pid>

Грейсфул-шатдаун

Для корректного завершения работы:

kill -TERM <pid>

Логирование

Формат логов

По умолчанию логи пишутся в JSON-формате для удобства парсинга:

{
  "timestamp": "2024-06-05T12:34:56Z",
  "level": "INFO",
  "message": "Request processed",
  "fields": {
    "method": "GET",
    "path": "/",
    "status": 200,
    "duration": 0.0012,
    "remote": "192.168.1.1:12345",
    "user_agent": "Mozilla/5.0",
    "request_id": "abc123"
  }
}

Безопасность

Фильтрация опасных запросов

Запрещены следующие пути: - ../, %2e%2e, .env, phpmyadmin, shell, setup-config.php, device.rsp

При попытке доступа к ним будет возвращён 403 Forbidden.


Расположение файлов

Путь Назначение
/etc/gubinnet/config/ Конфигурационные файлы
/etc/gubinnet/logs/ Логи
/etc/gubinnet/modules/ Пользовательские модули
/etc/gubinnet/modules/<name>/module.cpp Исходник модуля
/etc/gubinnet/modules/<name>/module.so Скомпилированный модуль

Репозиторий

Официальный репозиторий GitHub (на текущий момент временно имеет статус Private)

Лицензия

MIT License


Автор

GubinNET создан Михаилом Губиным (Mikhail Gubin).