[TIL] 24.12.03 TUE

GDORI·2024년 12월 3일
0

TIL

목록 보기
121/143
post-thumbnail

nginx conf 파일 건들기

현재 분산서버 구조로 변경하기 위하여 헬스체크 서버를 구축하는 단계에서 고민에 빠졌다.
헬스체크 서버가 게임서버 최초 구동 시 날라오는 노티를 기준으로 nginx 서버에게 해당 아이피와 포트를 전달하여
자동으로 매핑되게 구현하고 싶었다.
그러려면 우선 conf 파일을 읽어서 stream 블록에 서버 아이피와 포트를 추가해주는 작업을 해야하는데, 방법은 정규식을 이용해서 수정하는 방법이랑 conf를 json으로 파싱하고 객체 수정 후 다시 conf 파일로 바꿔서 적용하는 방법이 있다.
후자를 선택했고, 아직 적용은 안했지만 바뀌는 것은 확인됐다.

stream 클래스 메서드 일부 - configToJson

configToJson(config) {
    const lines = config.split('\n');
    const temp = [];
    let currentObj = { _typeName: 'root', _children: [] };
    const root = currentObj;

    lines.forEach((line) => {
      // 양 끝 공백 삭제
      line = line.trim();
      // 주석이나 빈 줄 건너뛰기
      if (line.startsWith('#') || line === '') return;

      // 블럭 시작일 경우
      if (line.endsWith('{')) {
        const blockName = line.slice(0, -1).trim();
        const newBlock = { _typeName: blockName, _children: [] };
        // 참조관계 형성
        currentObj._children.push(newBlock);
        // 잠시 저리로 가있어
        temp.push(currentObj);
        currentObj = newBlock;
      } else if (line === '}') {
        // 블럭 종료일 경우 다시 원복
        currentObj = temp.pop();
      } else {
        // 일반 라인일경우 ex: worker_processes auto;
        const [key, ...value] = line.split(' ').filter((e) => e !== '');
        currentObj[key] = value.join(' ').replace(';', '');
      }
    });

    return root;
  }

stream 클래스 메서드 일부 - jsonToConfig

jsonToConfig(json, depth = 0) {
    const jump = ' '.repeat(depth);
    let result = '';

    // 루트 블럭이 아니면, 타입명 및 열린 괄호를 적고 개행 ex ) stream {
    if (json._typeName !== 'root') result += `${jump}${json._typeName} {\n`;

    // json 한바퀴 돈다.
    for (const [key, value] of Object.entries(json)) {
      if (key === '_typeName' || key === '_children') continue;
      if (json._typeName === 'root') {
        result += `    ${key} ${value};\n`;
      } else {
        result += `${jump}  ${key} ${value};\n`;
      }
    }

    // 만약 children 객체가 있다면, ex) stream 안에 server
    if (json._children) {
      // 각각의 children
      json._children.forEach((children) => {
        result += this.jsonToConfig(children, depth + 4);
      });
    }
    // 블럭 마무리
    if (json._typeName !== 'root') result += `${jump}}\n`;

    return result;
  }
profile
하루 최소 1시간이라도 공부하자..

0개의 댓글