배포 후 팀원들이 테스트하는 동안에 허용된 IP만 접근 가능하도록 하고, 그 이외의 IP 접근은 점검중 페이지로 가도록 하고 싶다.
# nginx.conf
http {
...
map $remote_addr $maintenance {
default on;
127.0.0.1 off; # 원하는 IP 기입
}
server {
...
proxy_intercept_errors on;
location / {
...
if ($maintenance = on) {
return 503;
}
}
error_page 503 /maintenance.html;
location = /maintenace.html {
root /home/ec2-user/web;
internal;
}
}
}
=> 결론: default 설정은 잘 적용됨. 내 ip를 잘못 기입한 것 같았다.
IP를 찾아서
서칭을 하다 보니, ipconfig에 찍히는 ip랑, https://whatismyipaddress.com/ 에 찍히는 ip가 달랐다. 후자의 ip는 ISP의 ip, 즉 라우터의 ip인것 같았다. 이곳에 찍히는 ip를 nginx설정에 추가해주었지만 역시 제대로 동작하지 않았다.
netstat 명령어도 찍어보며 이리저리 찾아보았지만, 제대로 동작하지 않았다.
access_log
nginx로 들어오는 로그를 찍어봐야겠다!라고 생각하고 log를 찍는 법을 찾아보았다. 로깅은 아래와 같이 설정해주면 되었다.
# nginx.conf
http {
...
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
...
}
참고 Nginx에서 클라이언트 IP를 확인하는 법 ($http_x_forwarded_for)
1) Proxy 모드 로드밸런서 이용시 클라이언트 IP 로깅하기(TOAST 서비스 들여다보기)
2) ELB를 기반으로 하는 웹 서버 로그에서 클라이언트 IP 주소를 캡처하려면 어떻게 해야 합니까?
nginx 설정파일에서 $remote_addr를 $http_x_forwarded_for로 바꾸니 잘 동작하는 것을 확인할 수 있었다.
# nginx.conf
http {
...
map $http_x_forwarded_for $maintenance {
default on;
127.0.0.1 off; # 원하는 IP 기입
}
server {
...
proxy_intercept_errors on;
location / {
...
if ($maintenance = on) {
return 503;
}
}
error_page 503 /maintenance.html;
location = /maintenace.html {
root /home/ec2-user/web;
internal;
}
}
}
위의 TO-BE를 위해서는, 빌드 후 배포 전에 nginx.conf 설정에 mapping을 넣어주고, 배포 후 테스트 후에는 nginx.conf 설정에 mapping을 빼줘야 한다.
# 배포 전에는 이 부분을 넣고, 테스트 후에는 이 부분을 빼줘야 한다.
map $http_x_forwarded_for $maintenance {
default on;
127.0.0.1 off; # 원하는 IP 기입
}
빌드 -> 특정 IP 접근만 허용하는 nginx.conf 설정 -> 배포 -> 테스트 -> IP 제한 정보가 빠진 기본 nginx.conf 설정
고민하다가 nginx.conf 파일을 교체해주는 쉘 스크립트를 짜서, jenkins로 실행해주기로 했다.