Skip to Content
Infra & DevOpsApache httpd의 Gzip과 리버스 프록시 설정
☁️ Infra & DevOps2018년 5월 18일

Apache httpd의 Gzip과 리버스 프록시 설정

#apache#httpd#web-server#infra-devops#proxy

Apache httpd에서 Gzip 압축과 리버스 프록시를 설정하며 남긴 메모입니다. 응답 크기를 줄이는 설정과 요청을 애플리케이션 서버로 전달하는 설정은 역할이 달라 나눠 정리했습니다.

텍스트 응답 압축

mod_deflate는 클라이언트가 지원하는 경우 응답을 Gzip으로 압축합니다. HTML·CSS·JavaScript 같은 텍스트 응답을 대상으로 설정할 수 있습니다.

다음은 원래 설정의 MIME 타입 목록을 줄인 예시입니다. AddOutputFilterByType을 사용하는 데 필요한 mod_filter와 mod_deflate가 활성화돼 있어야 합니다.

apache
AddOutputFilterByType DEFLATE text/html text/plain text/css AddOutputFilterByType DEFLATE application/javascript application/json image/svg+xml

압축 여부는 응답의 Content-Encoding으로 확인할 수 있습니다. 다음 요청은 응답 본문을 버리고 헤더를 확인하는 예시입니다.

bash
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가 필요합니다.

apache
<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을 사용해 다음 규칙을 기본 / 규칙보다 앞에 두는 구성이었습니다.

apache
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 연결을 따로 확인합니다. 기본 화면이 열린다는 사실만으로 다른 경로의 프록시까지 정상이라고 판단하기는 어렵습니다.

참고 자료

Last updated on