#hooks
글
-
Gradle 소스 파헤치기 5: 빌드 생명주기 — 초기화, 설정, 실행은 어디서 갈리나
데몬이 받은 빌드 요청이 실행기 사슬을 지나 빌드 생명주기에 닿는 길, 상태 전이를 지키는 StateTransitionController, init 스크립트와 settings를 읽는 초기화, 프로젝트를 설정하는 설정 단계, 설정 시간 장벽과 작업 그래프, 그리고 buildFinished와 Flow API로 끝나는 마무리까지 기준 커밋의 소스로 따라갑니다. 생명주기 훅을 모두 걸어 순서를 찍고, 빌드 오퍼레이션 나무와 세 단계에서 일부러 낸 실패로 확인합니다.
-
Apache httpd 소스 파헤치기 2: C로 짠 서버를 읽기 전에 — 구조체, 함수 포인터, 매크로
C의 구조체가 C++나 Java의 객체보다 아름답다는 말은 어디서 나왔을까요. 클래스도 인터페이스도 없는 C로 httpd가 모듈을 끼우는 방법을 실제 소스와 실행 결과로 확인합니다. 숨은 것 없는 메모리 모양, 함수 포인터로 만든 인터페이스, void * 배열과 module_index, 매크로로 찍어 내는 훅, 따로 컴파일한 .so를 믿는 MMN 검사, 그리고 C가 대신 해 주지 않는 것들까지.
-
Apache httpd 소스 파헤치기 6: 모듈과 훅 — 모듈 하나가 서버에 끼어드는 방법
httpd 의 기능은 거의 전부 모듈이고, 모듈은 훅이라는 정해진 자리에 함수를 걸어 서버에 끼어듭니다. module 구조체, 모듈이 등록되는 길(정적 모듈과 LoadModule), 훅을 만드는 매크로가 실제로 무엇으로 펼쳐지는지, RUN_FIRST 와 RUN_ALL 의 차이, 순서 값과 앞뒤 모듈 이름으로 정하는 실행 순서를 기준 커밋의 소스와 직접 만든 모듈 세 개로 확인합니다.
-
Apache httpd 소스 파헤치기 9: 연결과 요청 읽기 — 소켓 하나가 request_rec가 되기까지
MPM이 받아 넘긴 소켓 하나가 conn_rec가 되고, 요청 줄과 헤더를 읽어 request_rec가 되기까지를 httpd 소스로 따라갑니다. 코어가 훅의 맨 끝에 서는 이유, keep-alive 루프가 MPM에 따라 어디에 있는지, trunk에서 요청 줄을 읽는 일이 필터로 옮겨 간 것, 그리고 Host 헤더로 가상 호스트를 고르는 두 단계를 예제와 함께 확인합니다.
-
Apache httpd 소스 파헤치기 10: 요청 처리 단계 — URL에서 파일과 핸들러까지
GET /hello.html 한 줄이 httpd 안에서 어떤 단계를 거쳐 디스크의 파일과 그것을 내보낼 핸들러로 바뀌는지, ap_process_request_internal()의 단계 순서를 따라 소스에서 확인합니다. Location·Directory·Files 설정이 합쳐지는 세 가지 걷기, mod_dir의 서브요청, ErrorDocument의 내부 리다이렉트도 모든 단계에 로그를 찍는 모듈로 직접 봅니다.
-
Apache httpd 소스 파헤치기 12: 핸들러와 정적 파일 — 파일 하나는 어떻게 응답이 되나
SetHandler와 AddHandler가 정하는 "핸들러"가 Content-Type과 어떻게 다른지, 아무도 맡지 않은 요청을 코어의 default_handler()가 어떻게 파일 버킷 하나로 내보내는지를 소스로 따라갑니다. ETag와 304, Range와 206, 끝 슬래시 301과 DirectoryIndex, 그리고 EnableSendfile·EnableMMAP이 실제로 어떤 시스템 콜을 바꾸는지도 curl과 strace로 확인합니다.
-
Apache httpd 소스 파헤치기 13: 인증과 권한 — Require 한 줄은 어떻게 판정되나
httpd.conf 의 AuthType Basic, AuthUserFile, Require valid-user, <RequireAll> 이 소스에서 어떻게 움직이는지 따라갑니다. "누구인가"를 묻는 인증과 "들어와도 되는가"를 묻는 권한이 왜 다른 모듈로 나뉘었는지, 이름으로 갈아 끼우는 프로바이더, Require 트리와 GRANTED·DENIED·NEUTRAL 판정, 그리고 같은 판정을 두 번 돌리는 request.c 의 순서를 실제 소스와 예제 출력으로 확인합니다.
-
Apache httpd 소스 파헤치기 14: mod_proxy — 리버스 프록시와 로드 밸런서
ProxyPass 한 줄이 요청을 다른 서버로 넘기기까지를 소스로 따라갑니다. URL이 r->filename의 "proxy:..."로 바뀌는 자리, proxy_handler()가 스킴 핸들러 훅에 일을 넘기는 방식, 백엔드마다 하나씩 생기는 워커와 연결 풀, mod_proxy_http가 브리게이드로 응답을 흘려보내는 길, 그리고 byrequests 밸런서가 두 백엔드를 번갈아 고르는 계산을 컨테이너 안의 백엔드 두 대로 직접 확인합니다.
-
Apache httpd 소스 파헤치기 15: mod_ssl — TLS는 어디에 끼어드나
httpd 코어는 TLS를 모릅니다. 그런데도 SSLEngine on 한 줄이면 HTTPS가 됩니다. mod_ssl이 훅으로 기동과 연결에 끼어들고, 연결 필터와 직접 만든 BIO로 OpenSSL을 필터 사슬 사이에 끼우고, SNI로 가상 호스트와 인증서를 바꾸고, SSL_* 변수를 다른 모듈에 내주는 과정을 소스와 예제로 따라갑니다.
-
Apache httpd 소스 파헤치기 16: 로그 — 접근 로그와 오류 로그, 그리고 연재를 마치며
httpd의 두 가지 로그가 소스에서 어떻게 남는지 따라갑니다. ap_log_rerror() 한 줄이 매크로로 레벨을 거르는 방법, LogLevel을 모듈마다 다르게 거는 module_index, ErrorLogFormat과 LogFormat 문자열이 함수 포인터 배열이 되는 과정, 요청이 끝난 뒤 log_transaction 훅이 불리는 때, 파이프 로그를 다시 띄우는 구조를 예제로 확인하고, 16편 연재를 정리합니다.