Создание заглушки#

Для того чтобы продемонстрировать возможности и способы настроек базовых конфигурационных примитивов, создайте простейшую заглушку, которая будет эмулировать backend.

Для этого создайте в домашнем каталоге пользователя 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
     allowed_queries:
       - method: get
       - method: post
     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 — идентификатор сервиса внутри профиля, данное значение является обязательным и уникальным в контексте профиля;

  • allowed_queries — обязательный параметр, использующийся для указания разрешенных методов запроса и параметров запроса;

  • 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-запрос. В результате выполнения команды будет получен код-статус 200 и тело ответа «Hello world», которое было задано в параметре response_body.

[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
<
Hello world
* Connection #0 to host localhost left intact