Создание заглушки#
Для того чтобы продемонстрировать возможности и способы настроек базовых конфигурационных примитивов, создайте простейшую заглушку, которая будет эмулировать 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.3system— секция системных настроек, которая распространяется на все сервисы профиля, если они не переопределены на уровне сервисов;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