Создание заглушки#
Для того чтобы продемонстрировать возможности и способы настроек базовых конфигурационных примитивов, создадим простейшую заглушку, которая будет эмулировать бэк.
Для этого создадим в домашнем каталоге пользователя sowacfg, каталог /examples, а в нем каталог /stubs, где будем размещать наши конфигурационные файлы.
Далее создадим файл sample_stub.yml и поместим туда следующее содержимое:
profile: sample_stub
version: 2.0.3
system:
conn_count: 4096
wrk_count: 1
optional:
log_level: error
service:
!include: services/plain_service.yml
Здесь:
profile - имя профиля, которое впоследствии используется в качестве уникального идентификатора во всех операциях конфигурирования;
version - версия шаблона конфигурации, узнать версию можно с использованием команды
[sowacfg@e0085e94608b ~]$ sowa-config --version
2.0.3
system - секция системных настроек, которая распространяется на все сервисы профиля, если они не переопределены на уровне сервисов;
wrk_count - в настоящий момент обязательный параметр, определяющий количество параллельно функционирующих рабочих процессов SOWA, предназначенных для обработки запросов. В большинстве случаев рекомендуется указывать значение auto, при этом количество процессов будет равно количеству ядер процессора;
conn_count - в настоящий момент обязательный параметр, определяющий максимальное количество подключений на один рабочий процесс. Важно понимать, что данное значение в общем случае не равно максимальному количеству соединений, т.к. число соединений, создаваемых на одного клиента, зависит от конфигурации сервиса.
В простейшем случае, как в заглушке, это значение будет равно максимальному количеству клиентских подключений, в случае простого http-прокси, количество максимальных подключений клиента будет ~ 4096/2, в случае использования примитива main_proxy ~4096/3 и т.д.
В общем случае, максимальное количество одновременно обслуживаемых клиентов SOWA можно рассчитать следующим образом:
client_max_conn = wrk_count * (conn_count/(conn_for_one_client))
optional - секция опциональных параметров. В настоящий момент необходимо объявить хотя бы один опциональный параметр. В качестве примера, у нас задан параметр log_level, определяющий уровень логирования информации (может быть задано одно из значений: debug, info, notice, warn, error, crit, alert, off). Ознакомиться с параметрами, которые также могут быть использованы, можно в разделе "Базовая конфигурация".
В секции service перечисляются сервисы, которые входят в состав профиля. Чтобы не перегружать конфигурационные файлы, рекомендуется давать описания сервисов в отдельных конфигурационных файлах, которые будут располагаться в подкаталоге services, а в конфигурационном файле будет использоваться их включение с использованием директивы !include.
Создадим файл plain_service.yml, который был упомянут в конфигурационном файле профиля, в каталоге services, и поместим туда следующее содержимое:
service_static:
- id: hello_world_plain_service
optional:
response_code: 200
response_body: "Hello world"
response_headers:
- name: Content-Type
value: text/plain
url: ^/hello/world
listen:
- port: 10012
Здесь:
service_static - секция определяет, что сервис реализует поведение примитива статичного веб-ресурса. Далее идет перечисление сервисов, которые реализуют данный примитив в рамках профиля (на данный момент имеется единственный сервис с идентификатором hello_world_plain_service);
id - идентификатор сервиса внутри профиля, данное значение является обязательным и уникальным в контексте профиля;
optional - секция, определяющая опциональные параметры сервиса, в данном случае мы используем два параметра:
response_code - HTTP - статус ответа, который будет возвращен клиенту в результате обращения;
response_body - тело ответа в виде строки.
response_headers - перечисление возвращаемых заголовков ответа в виде имя/значение;
url - обязательный параметр, определяющий регулярное выражение, ограничивающее контекст сервиса (с учетом регистра символов);
listen - параметры слушателя, перечисление структур вида параметр listen, которые определяют настройки приема соединения с клиентом. В нашем случае используется только параметр port, определяющий, на каком порту будут приниматься соединения с клиентом (может использоваться и несколько портов, в этом случае должно быть соответствующее количество элементов в перечислении);
После того как изменения были сохранены, нужно добавить профиль в реестр и сконфигурировать его.
Добавить новый профиль в реестр профилей:
[sowacfg@tkle-ish0038 stubs]$ sowa-config --add-profile sample_stub
Profile "sample_stub" was successfully created
Сконфигурировать профиль:
[sowacfg@tkle-ish0038 stubs]$ sowa-config --config sample_stub.yml
Profile "sample_stub" was successfully configured.
В случае, если была допущена какая-либо ошибка, профиль не сконфигурируется и будет выдана ошибка, например, если неправильно указан файл сервиса для включения:
[sowacfg@tkle-ish0038 stubs]$ sowa-config --config sample_stub.yml --log-type=file
Inclusion of the incorrect path: services/plain_servic.yml(/home/sowacfg/examples/stubs/services/plain_servic.yml)
Проверим, что профиль корректно создался:
[sowacfg@tkle-ish0038 stubs]$ sowa-config --show-profile
Profiles:
sample_stub, configured=True, MainPID=0
Попробуем запустить профиль:
[sowacfg@tkle-ish0038 stubs]$ sowa-config --run sample_stub
Profile "sample_stub" was successfully started.
Проверим, что профиль запущен:
[sowacfg@tkle-ish0038 stubs]$ sowa-config --show-profile
Profiles:
sample_stub, configured=True, MainPID=14710
Отличное от нуля значение в MainPID говорит о том, что профиль запущен корректно.
Для проверки работоспособности нашего сервиса необходимо отправить простой GET запрос:
[sowacfg@tkle-ish0038 stubs]$ curl -v http://localhost:10012/hello/world
* About to connect() to localhost port 10012 (#0)
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 10012 (#0)
> GET /hello/world HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost:10012
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Mon, 05 Apr 2021 08:45:12 GMT
< Content-Type: text/plain
< Content-Length: 11
< Connection: keep-alive
< Server: SOWA
<
* Connection #0 to host localhost left intact