Файл конфигурации
Конфигурация приложения хранится в файле config.json. Файл содержит настройки серверов, баз данных, хранилищ, сессий, email и других компонентов.
Секция main
Основные настройки приложения.
workers число
Количество worker-потоков для обработки соединений и чтения/записи данных.
threads число
Количество потоков для обработки запросов и формирования ответов.
reload soft | hard
Режим горячей перезагрузки:
soft— перезагрузка с сохранением активных соединенийhard— перезагрузка с принудительным закрытием соединений
buffer_size число
Размер буфера для чтения и записи данных в сокет (в байтах).
client_max_body_size число
Максимальный размер тела запроса (в байтах).
tmp строка
Путь до директории временных файлов.
gzip массив строк
Список MIME-типов для автоматического сжатия. Оставьте пустым, если сжатие не требуется.
log объект
Настройки системы логирования:
"log": {
"enabled": true,
"level": "info"
}enabled boolean
Включает или отключает логирование. При false все функции логирования будут игнорироваться.
level string
Минимальный уровень логирования. Сообщения с более низким приоритетом будут отфильтрованы.
Допустимые значения (от наиболее критичных к наименее критичным):
emerg— система неработоспособна (приоритет 0)alert— требуется немедленное действие (приоритет 1)crit— критическое состояние (приоритет 2)errилиerror— ошибки (приоритет 3)warningилиwarn— предупреждения (приоритет 4)notice— важные уведомления (приоритет 5)info— информационные сообщения (приоритет 6)debug— отладочные сообщения (приоритет 7)
Рекомендации
- Production: используйте
infoилиnoticeдля баланса между полезной информацией и производительностью - Development: используйте
debugдля максимально детального логирования - Critical systems: используйте
warningилиerrorдля минимального логирования только важных событий
Секция migrations
source_directory строка
Путь до директории с файлами миграций.
Секция servers
Конфигурация HTTP/WebSocket серверов. Каждый сервер имеет уникальный идентификатор (например, s1, s2).
domains массив строк
Список доменов, привязанных к серверу. Поддерживаются:
- Точные имена:
example.com - Подстановочные:
*.example.com - Регулярные выражения:
(api|www).example.com
ip строка
IP-адрес для прослушивания, например 127.0.0.1.
port число
Порт сервера (обычно 80 для HTTP, 443 для HTTPS).
root строка
Путь до корневой директории статических файлов.
ratelimits объект
Настройки ограничения частоты запросов (Rate Limiting):
"ratelimits": {
"default": { "burst": 15, "rate": 15 },
"strict": { "burst": 1, "rate": 0 }
}burst— максимальное количество запросов в пикеrate— скорость восполнения токенов
http объект
Конфигурация HTTP-маршрутов и middleware.
ratelimit строка
Имя профиля rate limiting по умолчанию для всех маршрутов.
middlewares массив строк
Список middleware, применяемых ко всем маршрутам:
"middlewares": ["middleware_auth", "middleware_log"]routes объект
Маршруты HTTP-запросов:
"routes": {
"/api/users": {
"GET": {
"file": "/path/to/handler.so",
"function": "get_users",
"ratelimit": "strict"
},
"POST": {
"file": "/path/to/handler.so",
"function": "create_user"
}
},
"/api/users/{id|\\d+}": {
"PATCH": {
"file": "/path/to/handler.so",
"function": "update_user"
}
}
}Параметры маршрута:
file— путь до .so файла с обработчикомfunction— имя функции-обработчикаratelimit— переопределение профиля rate limiting для маршрута
redirects объект
Правила редиректов с поддержкой регулярных выражений:
"redirects": {
"/old-path": "/new-path",
"/number/(\\d)/(\\d)": "/digit/{1}/{2}"
}Группы захвата доступны через {1}, {2} и т.д.
websockets объект
Конфигурация WebSocket. Структура аналогична секции http:
"websockets": {
"default": {
"file": "/path/to/ws_handler.so",
"function": "default_handler"
},
"routes": {
"/ws": {
"GET": { "file": "/path/to/ws_handler.so", "function": "connect" },
"POST": { "file": "/path/to/ws_handler.so", "function": "message" }
}
}
}tls объект
Настройки TLS/SSL для HTTPS:
"tls": {
"fullchain": "/path/to/fullchain.pem",
"private": "/path/to/privkey.pem",
"ciphers": "TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256"
}Секция databases
Глобальная конфигурация баз данных. Поддерживается несколько подключений к каждому типу БД.
postgresql
"postgresql": [{
"host_id": "p1",
"ip": "127.0.0.1",
"port": 5432,
"dbname": "mydb",
"user": "dbuser",
"password": "dbpass",
"connection_timeout": 3
}]mysql
"mysql": [{
"host_id": "m1",
"ip": "127.0.0.1",
"port": 3306,
"dbname": "mydb",
"user": "dbuser",
"password": "dbpass"
}]redis
"redis": [{
"host_id": "r1",
"ip": "127.0.0.1",
"port": 6379,
"dbindex": 0,
"user": "",
"password": ""
}]Секция storages
Конфигурация файловых хранилищ.
Локальное хранилище
"storages": {
"local": {
"type": "filesystem",
"root": "/var/www/storage"
}
}S3-совместимое хранилище
"storages": {
"remote": {
"type": "s3",
"access_id": "your_access_id",
"access_secret": "your_access_secret",
"protocol": "https",
"host": "s3.amazonaws.com",
"port": "443",
"bucket": "my-bucket",
"region": "us-east-1"
}
}Секция sessions
Конфигурация сессий пользователей.
"sessions": {
"driver": "storage",
"host_id": "redis.r1",
"storage_name": "sessions",
"lifetime": 3600
}driver— драйвер хранения сессий (storageилиfile)host_id— идентификатор хранилища для сессийlifetime— время жизни сессии в секундах
Секция mail
Конфигурация отправки email.
"mail": {
"dkim_private": "/path/to/dkim_private.pem",
"dkim_selector": "mail",
"host": "example.com"
}Секция mimetypes
Соответствие MIME-типов расширениям файлов:
"mimetypes": {
"text/html": ["html", "htm"],
"text/css": ["css"],
"application/json": ["json"],
"application/javascript": ["js"],
"image/png": ["png"],
"image/jpeg": ["jpeg", "jpg"]
}Полный пример конфигурации
{
"main": {
"workers": 4,
"threads": 2,
"reload": "hard",
"buffer_size": 16384,
"client_max_body_size": 110485760,
"tmp": "/tmp",
"gzip": ["text/html", "text/css", "application/json", "application/javascript"],
"log": {
"enabled": true,
"level": "info"
}
},
"migrations": {
"source_directory": "/path/to/migrations"
},
"servers": {
"s1": {
"domains": ["example.com", "*.example.com"],
"ip": "127.0.0.1",
"port": 443,
"root": "/var/www/html",
"ratelimits": {
"default": { "burst": 15, "rate": 15 },
"strict": { "burst": 1, "rate": 0 }
},
"http": {
"ratelimit": "default",
"middlewares": ["middleware_auth"],
"routes": {
"/api/users": {
"GET": { "file": "handlers/libapi.so", "function": "get_users" },
"POST": { "file": "handlers/libapi.so", "function": "create_user" }
}
},
"redirects": {
"/old": "/new"
}
},
"websockets": {
"routes": {
"/ws": {
"GET": { "file": "handlers/libws.so", "function": "connect" }
}
}
},
"tls": {
"fullchain": "/path/to/fullchain.pem",
"private": "/path/to/privkey.pem",
"ciphers": "TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256"
}
}
},
"databases": {
"postgresql": [{
"host_id": "p1",
"ip": "127.0.0.1",
"port": 5432,
"dbname": "mydb",
"user": "dbuser",
"password": "dbpass",
"connection_timeout": 3
}],
"redis": [{
"host_id": "r1",
"ip": "127.0.0.1",
"port": 6379,
"dbindex": 0,
"user": "",
"password": ""
}]
},
"storages": {
"files": {
"type": "filesystem",
"root": "/var/www/storage"
}
},
"sessions": {
"driver": "storage",
"host_id": "redis.r1",
"storage_name": "sessions",
"lifetime": 3600
},
"mail": {
"dkim_private": "/path/to/dkim_private.pem",
"dkim_selector": "mail",
"host": "example.com"
},
"mimetypes": {
"text/html": ["html", "htm"],
"text/css": ["css"],
"application/json": ["json"],
"application/javascript": ["js"],
"image/png": ["png"],
"image/jpeg": ["jpeg", "jpg"]
}
}