WebtoB 프로세스 구조

WebtoB는 안정적인 서비스를 위해 프로세스가 비정상적으로 종료되면 자동으로 재기동합니다. 이때 기본적으로 Manager 프로세스와 Engine 프로세스를 함께 기동합니다.

프로세스 종류

다음은 WebtoB의 프로세스 종류에 대한 설명입니다.

프로세스 이름 설명

Manager

비정상 종료된 Engine 프로세스를 재기동합니다.

Engine

HTTP 요청을 처리합니다.

Manager와 Engine의 설정은 반드시 일치해야 합니다.

이미 기동된 프로세스의 설정과 새로 적용할 설정이 다를 경우, 변경된 설정으로 프로세스를 재기동할지 여부를 선택할 수 있습니다.

Manager 프로세스

Manager 프로세스는 HTTP 요청을 처리하는 웹 서버 프로세스(Engine)를 관리하는 역할을 합니다. Engine 프로세스를 모니터링하다가 비정상 종료될 경우 자동으로 재기동하며, 이미 기동 중인 Engine이 있을 때는 해당 Engine을 관리합니다.

Manager는 하나만 기동할 수 있습니다. WebtoB의 기본 기동 방식은 Manager와 Engine을 함께 기동하지만, 필요 시 다음 명령으로 Manager만 단독 기동할 수 있습니다.

> webtob -a start-manager

또한 Rest API를 통해 Admin API를 제공합니다. Manager 포트는 NODE 절에서 설정하며 주요 API는 다음과 같습니다.

API 이름 설명

/config

환경 설정 내용을 조회합니다.

/shutdownmanager

WebtoB Manager를 종료합니다.

환경 설정 조회 (/config)

현재 동작 중인 시스템의 환경 정보를 조회합니다. 이 과정에서는 환경 설정 파일에서 지정한 값뿐만 아니라 기본적으로 적용되는 값까지 확인할 수 있습니다.

  • 사용법

    {
        "path": string
    }
    옵션 설명

    path

    환경 설정 파일의 JSON 경로를 지정합니다. 이때 경로는 항상 /로 시작해야 합니다.
    경로를 생략하거나 /로 설정하면 현재 설정된 모든 환경 설정을 가져옵니다.

  • 예시

    다음은 NODE 절 환경 설정을 "/config" Admin API로 확인한 예시입니다. NODE 절의 설정 항목에 대한 자세한 설명은 NODE 절 설정 항목을 참고합니다.

    [Request]
    {
        "path": "/node"
    }
    
    [Response]
    {
        "result": {
            "cache_entry": 128,
            "cache_key": "HOST_URI",
            "cache_max_file_size": 8192,
            "connection_pool_size": 8192,
            "graceful_shutdown_timeout": 5,
            "hth_count": 1,
            "hth_schedule": "RR",
            "limit_request_body_size": 0,
            "limit_request_header_field_count": 100,
            "limit_request_header_field_size": 8190,
            "limit_request_line_size": 8190,
            "listen_backlog": 4096,
            "max_cache_memory_size": 100,
            "name": "webtob-server",
            "system_filters": [],
            "worker_threads": 1
        }
    }

WebtoB Manager 종료 (/shutdownmanager)

동작 중인 WebtoB Manager를 종료합니다.

  • 사용법

    {
       "timeout": integer
    }
    옵션 설명

    timeout

    graceful shutdown 과정의 타임아웃을 초 단위로 지정합니다. 지정된 시간이 지나도 WebtoB Manager가 종료되지 않으면 강제 종료됩니다.
    생략 시 /node/graceful_shutdown_timeout에 설정된 값이 적용됩니다.

  • 예시

    다음은 30초 동안 graceful shutdown을 시도한 후 WebtoB Manager가 종료되지 않으면 강제 종료하도록 "/shutdownmanager" Admin API를 호출하는 예시입니다.

    [Request]
    {
       "timeout": 30
    }
    
    [Response]
    {
       "result": {}
    }

    응답은 WebtoB에서 명령을 수신한 직후 반환됩니다. 단, 응답을 받은 후에도 WebtoB Manager 프로세스가 동작 중일 수 있으며, 만약 WebtoB Manager를 종료하더라도 Engine은 종료되지 않습니다.

Engine 프로세스

Engine 프로세스는 실제로 HTTP 요청을 처리하는 역할을 합니다. 각 프로세스는 인덱스를 가지며, 인덱스 번호는 0부터 시작합니다. 실행할 프로세스의 개수는 /node/process_count에서 설정할 수 있습니다.

WebtoB가 기동 중인 상태에서도 process_count 값을 변경한 후 WebtoB를 재기동하면 Engine 프로세스의 개수를 조정할 수 있습니다.

WebtoB의 기본 기동 방식은 Manager와 Engine을 함께 기동하지만, 필요 시 다음 명령으로 Engine만 단독 기동할 수 있습니다.

> webtob -a start-engine

또한 REST API를 통해 Admin API를 제공합니다. 자세한 내용은 Admin API 문서를 참조합니다.

로그 파일 이름에 %fullname% 또는 %pid%를 지정하면 각 프로세스별로 개별 로그 파일이 생성됩니다. 만약 %name%만 지정할 경우 Manager와 Engine 단위로만 로그 파일이 생성됩니다.

프로세스 권한 및 Privileged 포트

웹 서버에서 일반적으로 HTTP는 80 포트, HTTPS는 443 포트를 기본값으로 사용합니다. 이 포트는 Privileged 포트로, 루트 권한을 가진 프로세스만 사용할 수 있습니다.

따라서 WebtoB에서 해당 포트를 사용하려면 루트 권한으로 실행해야 하며, 환경 변수도 루트 권한으로 설정해야 합니다.

다음은 Privileged 포트를 사용하는 설정으로 WebtoB를 기동하는 명령 예시입니다.

> sudo -E WEBTOB_HOME=/home/webtob/ ./webtob

루트 권한으로 바이너리를 실행하면 Manager와 Engine이 모두 루트 권한으로 기동됩니다. 하지만 HTTP 요청을 직접 받는 Engine이 루트 권한을 가지면 보안상 취약해질 수 있습니다.

이 문제를 보완하기 위해 /node/user 설정을 사용할 수 있습니다. 해당 설정은 Engine의 권한을 설정한 값으로 변경합니다. 단, 바이너리를 실행한 권한보다 낮은 권한만 지정할 수 있습니다.

예를 들어 /node/user에 낮은 권한의 사용자를 지정하고, 루트 권한으로 바이너리를 실행하면 Manager는 루트 권한을 가지고 Engine은 지정된 낮은 권한으로 실행됩니다. 이렇게 하면 Manager는 Privileged 포트를 열 수 있고, Engine은 낮은 권한으로도 Privileged 포트를 사용할 수 있습니다. 결과적으로 Engine이 공격을 받더라도 시스템 전체 권한에는 영향을 주지 않습니다.

/destination/jeus/enable_block_listen을 true로 설정하면 포트를 다시 열 때 Engine이 열기 때문에 Engine도 루트 권한을 가져야 합니다.