m4로 OpenBSD httpd 설정의 반복 줄이기

6 hours ago 3

OpenBSD httpd에는 적합한 내장 매크로가 없어, 반복되는 서버 설정을 m4 전처리로 생성해 별도 설정 도구 없이 여러 사이트의 구성을 축약함 m4는 일반 텍스트를 그대로 출력하면서 define, 위치 인자, 재귀 평가를 지원해 차단 경로·TLS·보안 헤더·리디렉션을 재사용 가능한 매크로로 묶을 수 있음 BLOCK, BLOCKLIST, ACME, TLS, HEADERS를 조합하고 SITE(nemin.hu)처럼 호출하면 HTTPS 서버와 HTTP·www 리디렉션 설정을 한꺼번에 생성함 m4가 쉼표를 인자 구분자로 해석해 hsts {preload, subdomains} 같은 설정을 훼손하므로, 쉼표를 ~~로 치환한 뒤 sed 파이프라인으로 복원해야 함 다소 취약한 방식이지만 OpenBSD 기본 도구만으로 운영하려는 조건에는 맞으며, 다른 환경에서는 별도 매크로 처리기나 설정 축약 기능이 있는 서버가 더 적합할 수 있음 매크로의 두 가지 유형 매크로는 반복되는 코드를 줄이고 매개변수로 재사용한다는 목적은 같지만, 크게 AST 변환형과 텍스트 확장형으로 나뉨 Lisp와 Scheme의 매크로는 코드의 추상 구문 트리(AST)를 조작함 일반 함수 incr!는 값의 복사본을 받아 원래 변수 num을 바꾸지 못하지만, 매크로는 (set! num (+ num 1))로 확장돼 값을 변경함 조작 방식을 제한하면 결과가 구문 분석 가능한 코드가 되도록 보장할 수 있음 다만 구문 분석 가능성이 의도한 동작까지 보장하지는 않으므로 결과의 정확성은 사용자가 책임져야 함 C 전처리기 같은 텍스트 확장형 매크로는 대상 언어의 문법을 이해하지 않고 문자열만 변환함 자유롭게 텍스트를 바꿀 수 있지만, 구문 분석이 불가능하거나 의도와 다른 코드를 만들 수 있음 ABS(x)를 x < 0 ? -x : x로 정의하면 ABS(5 - 6)이 연산자 결합 때문에 6이라는 잘못된 결과를 냄 ((x) < 0 ? -(x) : (x))처럼 괄호를 추가해 고칠 수 있지만, 복잡한 매크로일수록 예상하지 못한 확장을 막기 어려움 이런 위험에도 C에서 실제 제네릭 지원 없이 매크로 기반 제네릭을 구현하는 등 강력하게 활용할 수 있음 m4의 동작 방식 m4는 거의 50년 된 POSIX 텍스트 전처리기로, Linux 배포판과 OpenBSD를 포함한 BSD에서 일반적으로 제공됨 특정 프로그래밍 언어에 종속되지 않은 독립 실행형 프로그램이어서 다양한 텍스트 처...

Read Entire Article