Nginx 리버스 프록시, 캐시, 핫링크 문제... 해결!
2017-06-25

DarthVader

Star Wars: Episode III

보이지 않는 위험

엔진엑스 리버스 프록시 설정까진 성공적으로 끝마쳤는데, 생각지 못한 곳에서 문제가 발생했다. 현재 웹서버에서 아파치 & htaccess 파일을 이용해 핫링크 방지를 하고 있는데, 프록시 캐시를 하면 웹서버까지 가지 않고 프록시 선에서 마구마구 핫링크에 자료 제공을 해주는 것. 물론 프록시 캐시가 이런 일을 하라고 있는거긴 하지만 설정까지 무시하고 퍼주면 문제가 확실히 있다.

코드의 습격

우선 프록시 단에서 핫링크 방지를 해봤다. if문을 쓰는게 좀 꺼림칙 하지만 뭐 어쩌랴. 근데 프록시에서 핫링크 방지 코드를 넣는 순간 모든 이미지 링크가 깨진다. 내부/외부 링크를 가리지 않고 모든게 엑박처리. Curl이고 뭐고 다 404 나온다. 헐… 이거 왜 이러지?

캐시의 복수

헐… 캐시를 끄니까 핫링크 작동이 된다. 모든 것의 원흉이 이놈의 프록시 캐시. 램디스크까지 할당해 줬었는데… 이걸 살려 죽여?

새로운 합리화

곰곰히 생각을 해보자. 웹서버 트래픽은 거의 없는편. 그럼 굳이 프록시 캐시가 필요한가? 로드 밸런싱이 절실한 것도 아닌데? 오히려 누군가 외부 링크를 남용하면 그제서야 트래픽 걱정을 해야할 판이니 일단은 핫링크 방지가 우선이다. 결국 프록시 서버는 외부로 여는 포트를 최소화하고 https 서비스를 안정적으로 유지하는데만 사용하고, 캐싱 같은건 하지 않기로 결정했다. 완벽한 방법은 아니지만 현재 선택지 중에 가장 상황에 맞는 방법이라 합리화 해본다.

트래픽의 역습

그럼 김칫국 드링킹을 해보자. 만약 웹서버 트래픽이 많이 올라간다면 어떻게 할건가? 일단 이걸 제대로 적용 시킬 방법을 찾아보는거. 지금은 구글링을 해봐도 별 유익한 내용을 얻지 못하고 있지만 분명 누군가는 이렇게 쓰고 있을터이니 좀 더 자료를 모아볼 생각이다. Nginx documentation이라도 뒤져보던가… 최악의 경우엔 외부 CDN을 이용하는 방법이 있을꺼다. 워드프레스에서 Jetpack 플러그인으로 기본 제공하는 서버가 있긴 한데 미국에 위치한 서버다 보니 속도는 별로 안나온다. 트래픽 걱정 하나는 확실히 없어질 방법이다. 천천히 생각을 좀 해봐야겠다.

캐시의 귀환

이 글을 쓰며 아이디어가 떠올라 프록시 캐시를 전면적으로 개편했고, 핫링크 방지와 캐시 설정에 성공했다! 프록시 설정에서 이미지, css나 js같은 스태틱 파일, 루트 (/) 를 분리해서 각각 핫링크와 캐시를 분할적으로 적용시켰고 되는거 같다. 와우!!