나의 잡다한 노트 및 메모
nginx의 프록시 관련 내장 변수, client가 요청한 포트를 나타내려면? 본문
관련해서 내장 변수를 알아보고 싶다면 이 링크를 참고하자
https://nginx.org/en/docs/http/ngx_http_core_module.html
Module ngx_http_core_module
Module ngx_http_core_module Directives Syntax: absolute_redirect on | off; Default: absolute_redirect on; Context: http, server, location This directive appeared in version 1.11.8. If disabled, redirects issued by nginx will be relative. See also server_na
nginx.org
$host, $remote_addr, $scheme, $proxy_add_x_forwarded_for 등은 Nginx에서 미리 정의해 둔 내장 변수(built-in variables) 입니다. 이 변수들은 요청이 들어올 때 Nginx가 해당 요청의 정보를 동적으로 채워주는 역할을 합니다.
- $host:
클라이언트가 요청할 때 사용한 호스트명(도메인)을 나타냅니다. 요청 헤더의 Host 값을 기반으로 합니다. - $remote_addr:
클라이언트의 IP 주소를 나타냅니다. - $scheme:
클라이언트가 사용한 프로토콜(http 또는 https)을 나타냅니다. - $proxy_add_x_forwarded_for:
기존의 X-Forwarded-For 헤더 값에 현재 클라이언트의 IP 주소($remote_addr)를 추가한 값을 생성합니다. - $server_port
- nginx가 현재 요청을 수신한 포트를 나타내는 내장 변수. nginx가 리스닝하는 포트를 반환한다.
$remote_port
client port를 뜻한다.
그러면 client가 요청한 포트를 나타내려면?
클라이언트가 요청할 때 사용한 포트 정보를 그대로 전달하려면, 클라이언트가 보낸 Host 헤더에 포트가 포함되어 있는지 확인해야 합니다.
예를 들어:
- 클라이언트가 example.com:55330으로 접속했다면, Host 헤더에는 "example.com:55330"이 들어갑니다.
- Nginx의 내장 변수 $host는 포트 번호를 제외한 호스트명만 반환하지만, $http_host는 요청에 포함된 전체 Host 헤더 값을 그대로 제공합니다.
따라서 클라이언트가 사용한 포트 정보를 그대로 백엔드에 전달하고 싶다면, $http_host를 이용하거나, Host 헤더에서 포트 번호를 추출하는 정규식을 활용해야 합니다. 예를 들어, 아래와 같이 map 지시어를 사용해서 클라이언트가 보낸 포트를 추출할 수 있습니다:
map $http_host $client_port {
"~:(\d+)$" $1;
default "";
}
이렇게 설정하면, 클라이언트가 Host 헤더에 포트 번호를 포함해서 보냈을 경우 그 포트 번호가 $client_port 변수에 저장됩니다. 그리고 이후에
proxy_set_header X-Forwarded-Port $client_port;
와 같이 사용할 수 있습니다.
아니면
proxy_set_header Host $http_host;
이렇게 하는 것도 괜찮은듯. 저기에 port까지 포함된거라서...
'DevOps > Reverse_proxy' 카테고리의 다른 글
NGINX의 리버스 프록시 동작 원리 (0) | 2025.03.20 |
---|---|
nginx의 request rewrite, response rewrite (0) | 2025.03.19 |
nginx 설정 중 proxy 관련 설정 (0) | 2025.03.19 |