0. 들어가기.
-. NGINX는 홈서버로 여러 도메인을 호스팅하려면 웹 애플리케이션 앞단에 라우팅으로 주로 사용한다.
-. Nginx는 각 접속 도메인에 따라 각 앱으로 전달 (proxy_pass)를 해주게 되는데, 이 경우 접속자(client)의 아이피가 전부 localhost(127.0.0.1)로 뜨는 문제가 있고, 이걸 해결하기 위한 방법.
1. NGINX 설정 예시
-. 내 경우, 하나의 메인 도메인으로 접속하는 3개의 서버를 띄워놨다. 이 경우 3개의 서버에 각각 포트를 지정해줘도 되지만, SSL (443포트)만을 열어두고 해당 포트로 들어오는 접속을 타겟 도메인별로 각 서버 포트(localhost:xxxx)로 향하게 방향지정(proxy_pass)을 해주는 것이 보안 상 안전하다고 생각된다.
-. 하지만 proxy_pass를 해주면, client의 ip가 전부 nginx의 ip (내 경우 localhost, 127.0.0.1)로 뜨는 문제가 있다.
2. NGINX 설정 만지기
-. 위와 같은 경우에 client의 ip를 http header에 포함해서 전달해줘야 하는데, 구글링을 해보니 nginx에서 $remote_addr 변수를 전달해주면 된다 한다. 그 외 변수는 아래 표 참고
항목 | nginx 구문 | http header |
접근 도메인 | - | HTTP_HOST': 'store.stocksidekick.xyz', |
클라이언트 접속 환경 (브라우저 ..) | proxy_set_header http_user_agent $http_user_agent; | HTTP_HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36' |
접속 프로토콜 | proxy_set_header request $request; | HTTP_REQUEST': 'GET / HTTP/2.0', |
proxy_set_header status $status; | HTTP_STATUS': '000', | |
서버주소:포트 | proxy_set_header X-Forwarded-By $server_addr:$server_port; | HTTP_X_FORWARDED_BY': '180.70.163.131:443', |
클라이언트 ip + 중간에 거치는 다른 라우트들 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | HTTP_X_FORWARDED_FOR': '220.118.231.200', |
http/https | proxy_set_header X-Forwarded-Proto $scheme; | HTTP_X_FORWARDED_PROTO': 'https', |
클라이언트 ip | proxy_set_header X-Real_IP $remote_addr; | HTTP_X_REAL_IP': '220.118.231.200', |
3. 서버에서 확인
-. 나의 경우는 가장 날먹에 최적화된 Flask를 사용하는데, 서버 가동 중 뜨는 로그는 여전히 ip가 보이지 않는다.
-. Flask 서버 실행 시 창에 뜨는 아이피는 http header가 아닌, 말 그대로 request를 요청한 nginx 서버의 ip가 뜨기 때문인데, 이를 해결하기 위해선 HTTP header의 값을 가져오는 두가지 방법 중 하나를 써야한다.
return jsonify({'time': datetime.datetime.now(),
'protocol': request.scheme,
'ip': request.remote_addr, #바로 직전 request 아이피를 가져옴. 출력: 127.0.0.1
'flask.request.header.X-Real-Ip': request.headers.get('X-Real-Ip'), #header의 X-Real-IP 출력
'HTTP_X_REAL_IP': request.environ.get("HTTP_X_REAL_IP") #header의 X-REAL-IP 출력 2
}), 200
-. 해당 값 출력 시 아래와 같이 의도한대로 출력됨
'Web' 카테고리의 다른 글
[vue.js + Flask + dynamodb] 게시판 만들기 (2) - validation (0) | 2022.02.18 |
---|---|
[vue.js + Flask + dynamodb] 게시판 만들기 (1) - 글 작성/출력기능 (0) | 2022.02.09 |
KAKAO API - 카카오 인증 (KAKAO auth) (0) | 2021.03.30 |
[web] 반응형 테이블 만들기 - css grid (0) | 2021.03.19 |
[Web] 네이버 주식시세 가져오기 시도중 (1) | 2021.03.05 |
최근댓글