- 웹 글을 터미널에서 바로 읽고 싶은 사용자를 위해 James' Coffee Blog는 블로그 글을 Linux 매뉴얼 페이지 형식으로도 제공함
- 같은 URL이라도 클라이언트가
Accept: text/roff를 보내면 HTML 대신 roff 문서를 받도록 HTTP 콘텐츠 협상을 사용함
- 각 글의
.man 파일은 TITLE, AUTHOR, PUBLISHED, POST, URL 섹션을 가진 템플릿으로 생성됨
- 본문에는 Markdown 원문을 넣어 HTML보다 읽기 쉽게 만들었지만, 매뉴얼 페이지에서 간격이 항상 깔끔하게 맞지는 않음
- NGINX가
text/roff 요청을 감지해 URL을 .man 파일로 재작성하므로, curl로 저장한 뒤 man./post.page처럼 열 수 있음
블로그 글을 man으로 읽기
- Linux의 매뉴얼 페이지는 명령 사용법을 터미널에서 확인하는 기본 방식이며, 보통
man <command>로 열 수 있음
- 예를 들어
tac 명령의 매뉴얼은 다음처럼 확인함
man tac
- James' Coffee Blog는 웹 블로그 글도 같은 방식으로 읽을 수 있도록, 글 URL에서
roff 버전을 내려받아 man으로 여는 흐름을 구성함
- 실제 요청 예시는 다음과 같음
curl -sL -H "Accept: text/roff" https://jamesg.blog/2024/02/28/programming-projects/ > post.page && man ./post.page
HTTP 콘텐츠 협상으로 형식 선택
- 구현의 중심은 클라이언트가 원하는 응답 형식을 서버에 알리는 HTTP 콘텐츠 협상임
Accept 헤더는 원하는 콘텐츠 타입을 전달하는 데 쓰임
- 예를 들어
Accept: image/png는 가능하면 PNG 파일을 보내 달라는 의미임
- 여러 콘텐츠 타입과 우선순위를 지정할 수도 있지만, 여기서는 특정 형식 요청만 사용함
- 블로그 글을 매뉴얼 페이지 형식으로 받고 싶을 때는
Accept: text/roff 헤더를 보냄
- 서버는 이 헤더를 보고 HTML 대신
man에서 열 수 있는 text/roff 응답을 반환함
.man 파일 생성 방식
- Linux 매뉴얼 페이지는 roff 문법으로 작성됨
- 사이트는 각 블로그 글마다
man 페이지 버전을 생성하도록 수정됨
- 사용한 템플릿 구조는 다음과 같음
.TH jamesg.blog 1 "" "jamesg.blog"
.SH TITLE
...
.SH AUTHOR
James' Coffee Blog (https://jamesg.blog)
.SH PUBLISHED
...
.SH POST
...
.SH URL
...
- 템플릿은 도메인명을 헤더로 두고 다섯 개 섹션을 만듦
- TITLE
- AUTHOR
- PUBLISHED
- POST
- URL
- 본문에는 Markdown 원문을 사용함
- 매뉴얼 페이지에서 간격이 항상 잘 맞지는 않음
- 그래도 HTML보다 읽기 쉽고, 일반 텍스트보다 제목과 문단 구분의 정보 손실이 적었음
curl로 받고 man으로 열기
- 블로그 글의
roff 버전은 다음 명령으로 요청할 수 있음
curl -sL -H "Accept: text/roff" https://jamesg.blog/2024/02/28/programming-projects/ > post.page
- 저장한 결과는 로컬 매뉴얼 페이지처럼 열 수 있음
man ./post.page
- 일반 브라우저가 같은 글 URL을 요청하면 HTML 버전을 받음
- 반면 위
curl 명령은 같은 URL에 대해 text/roff 버전을 명시적으로 요청함
NGINX에서 .man 파일로 재작성
- 서버는 NGINX 설정 몇 줄로
text/roff 요청을 별도로 처리함
/etc/nginx/nginx.conf에는 특정 콘텐츠 타입이 감지되면 플래그를 세우는 변수를 선언함
map $uri $redirect_suffix {
~^/(.*)/$ $1;
default "";
}
map $http_accept $redirect_location {
default "";
"~^text/roff" 1;
}
- 사이트 설정 파일인
/etc/nginx/sites-enabled 아래에는 roff 페이지 요청을 처리하는 규칙을 추가함
server {
...
location / {
if ($redirect_location = 1) {
rewrite ^/(.*)/$ /$1.man last;
}
...
}
}
- 이 설정은
Accept: text/roff 헤더가 있을 때 URL의 끝 슬래시를 제거하고 .man을 붙임
- 결과적으로 NGINX는 각 글의
index.html 대신 대응되는 .man 파일을 읽음
- 같은 블로그 글을 웹 브라우저에서는 HTML로, 터미널에서는 Linux 매뉴얼 페이지로 읽을 수 있는 구성이 됨