Apache httpd의 Gzip과 리버스 프록시 설정
Apache httpd에서 Gzip 압축과 리버스 프록시를 설정하며 남긴 메모입니다. 응답 크기를 줄이는 설정과 요청을 애플리케이션 서버로 전달하는 설정은 역할이 달라 나눠 정리했습니다.
텍스트 응답 압축
mod_deflate는 클라이언트가 지원하는 경우 응답을 Gzip으로 압축합니다. HTML·CSS·JavaScript 같은 텍스트 응답을 대상으로 설정할 수 있습니다.
다음은 원래 설정의 MIME 타입 목록을 줄인 예시입니다. AddOutputFilterByType을 사용하는 데 필요한 mod_filter와 mod_deflate가 활성화돼 있어야 합니다.
AddOutputFilterByType DEFLATE text/html text/plain text/css
AddOutputFilterByType DEFLATE application/javascript application/json image/svg+xml압축 여부는 응답의 Content-Encoding으로 확인할 수 있습니다. 다음 요청은 응답 본문을 버리고 헤더를 확인하는 예시입니다.
curl -sS -D - -o /dev/null -H 'Accept-Encoding: gzip' http://app.example.test/app.js설정이 있어도 해당 응답의 MIME 타입이나 클라이언트의 요청 조건에 따라 압축되지 않을 수 있습니다. mod_deflate가 추가하는 Vary: Accept-Encoding도 캐시가 압축 여부를 구분하는 데 사용됩니다.
HTTP 리버스 프록시
프록시는 브라우저의 요청을 뒤쪽 애플리케이션으로 전달합니다. HTTP 프록시에는 mod_proxy와 mod_proxy_http가 필요합니다.
<VirtualHost *:80>
ServerName app.example.test
ProxyRequests Off
ProxyPass "/sysmon/" "http://127.0.0.1:5000/"
ProxyPassReverse "/sysmon/" "http://127.0.0.1:5000/"
ProxyPass "/" "http://127.0.0.1:38080/"
ProxyPassReverse "/" "http://127.0.0.1:38080/"
</VirtualHost>주소와 포트는 설명용입니다. 구체적인 경로를 /보다 앞에 둬야 먼저 적용할 수 있습니다. 경로 앞뒤의 /도 함께 맞춰야 합니다.
ProxyPassReverse는 백엔드 응답의 리디렉션 관련 헤더를 조정합니다. HTML 본문에 적힌 모든 링크나 쿠키의 도메인까지 바꾸는 설정은 아닙니다.
WebSocket 경로 분리
원래 구성에는 일반 HTTP로 처리하는 /websocket/info와 WebSocket 연결 경로가 함께 있었습니다. 당시 방식은 mod_proxy_wstunnel을 사용해 다음 규칙을 기본 / 규칙보다 앞에 두는 구성이었습니다.
ProxyPass "/websocket/info" "http://127.0.0.1:38080/websocket/info"
ProxyPassReverse "/websocket/info" "http://127.0.0.1:38080/websocket/info"
ProxyPass "/websocket" "ws://127.0.0.1:38080/websocket"
ProxyPassReverse "/websocket" "ws://127.0.0.1:38080/websocket"현재 Apache httpd 2.4.47 이후에는 mod_proxy_http에서도 프로토콜 업그레이드를 처리할 수 있습니다. WebSocket은 반드시 이 설정 하나로만 연결해야 한다고 일반화하기보다, 설치된 버전과 사용하는 모듈에 맞춰 구성해야 합니다.
설정 적용과 확인
설정을 반영하기 전에는 httpd -t로 문법을 확인하고, httpd -M으로 필요한 모듈이 로드됐는지 볼 수 있습니다. 배포판에 따라 실행 파일이나 서비스 명령의 이름은 다를 수 있습니다.
반영 후에는 압축 응답과 일반 HTTP 요청, WebSocket 연결을 따로 확인합니다. 기본 화면이 열린다는 사실만으로 다른 경로의 프록시까지 정상이라고 판단하기는 어렵습니다.