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