저번 포스팅에서 무중단 배포를 구현하면서 blue-green / rolling / develop 세가지 방식의 배포를 전부 구현했었는데, 그중에 develop 배포 방식은 기존 브랜치의 배포(8080, 8081 포트)를 중단하고 8082 포트에서 develop 브랜치를 배포 새롭게 배포를 하는 식으로 동작했었다. 이것도 무중단으로 동작하긴 하지만 사실 개발 단계의 서버를 그대로 노출하게 되므로 아무 의미가 없는 배포 방식이었다.
개발용 서버는 개발자나 QA 같은 특정 집단의 사람들만 이용할 수 있도록 하고, 기존 서비스는 그대로 유지해야 제대로 된 동작 방식이라는 생각이 들었다. 그래서 이렇게 바꿔봤다.
1. Nginx 설정
1) 요청 식별
특정 ip 만 특정 업스트림으로 보내도록 Nginx 설정을 수정했다. 일단 요청 ip 를 알기 위해서 로그를 확인했다.
보다시피 내 ip 주소는 로그의 맨 뒤에 뜨고 있다. (컨테이너 시각 설정 잘못한 것은 그냥 넘어가자)
이걸 확인해 보니 http_x_forwarded_for 라는 헤더이다. 사실 이 헤더는 클라이언트나 프록시에서 조작할 수 있기 때문에 신뢰 할 수가 없다. (IP Spoofing) 실제 현업에서는 적절한 보안조치를 할테지만, 나는 일단 이 헤더에 담긴 IP 주소를 이용해서 라우팅을 하기로 했다.
2) 업스트림 라우팅 설정
나는 미리 작성한 스크립트를 실행해서 수동으로 서버를 조작하고 있기 때문에 작업량을 최소화 하기 위해서는 분기처리를 최대한 간단하게 해야한다. 나는 별도의 설정파일인 develop_servers.conf 를 만들고 map 이라는 맵핑 문법을 통해 간단하게 구현했다.
# nginx.conf 파일의 http 블록 내부
map $http_x_forwarded_for $developer {
"xxx.xxx.xxx.xxx" 1; # 개발자 ip
"yyy.yyy.yyy.yyy" 1; # 관련자 ip
#...
default 0;
}
이렇게 설정하게 되면 developer 라는 변수가 http_x_forwarded_for 의 값에 따라 맵핑되는데 개발자의 경우 1이, 그외의 경우는 0이 할당되게 된다. 나는 이걸 다시 주소 값으로 맵핑했다.
# develop_server.conf 파일
map $developer $proxy_location {
1 "http://xxx.xxx.xxx.xxx:8082"; # 개발 포트
0 "http://naejango-server"; # 기존 배포 서버 업스트림
}
이렇게 하면 sh 파일에서 한줄 (1 "http://xxx.xxx.xxx.xxx:8082") 만 수정하면 라우팅 설정을 변경 할 수 있게 된다.
2. 라우팅 확인
라우팅이 제대로 되고 있는지를 확인하기 위해서 로그에 upstream_addr 을 추가했다. 이 변수는 이름에서도 알 수 있듯 어떤 업스트림을 프록시 하게 되었는지를 알려준다.
결과는 아래와 같이 다른 ip 는 라운드 로빈 방식에 따라서 8080 과 8081 을 적절히 번갈아 가면서 요청을 보내주는 반면, 내 ip 는 모두 8082 로 보내지고 있다. 사실 별로 연연하지 않는데 왠지 개발자가 ip 주소를 그냥 공개해 버리기는 좀 그래서 가렸다.
좀 더 직관적으로, 8082 포트를 내리고 접속한 해보았는데 아래와 같이 에러 페이지를 띄운다.
3. 결론
Nginx 가 생각보다 간단하게 작동하고 있는 것 같다는 느낌이 들었다. 물론 좀더 현업에서 직접 서버 튜닝을 하는 사람들은 더 많은 것을 알고 있겠지만... 점점 친숙해지다보면 나도 그렇게 되겠지