Citrix 정책에서 NGINX Plus로 L7 로직 마이그레이션

해당 포스트에서는 Citrix, F5 iRule 등 널리 사용되는 하드웨어 ADC의 몇 가지 일반적인 유형의 정책 또는 스크립트를 NGINX 혹은 NGINX Plus 의 구성 블록으로 변환하는 방법을 설명합니다.
NGINX는 정책 변환의 명백한 어려움이 용어 또는 구현의 차이로 인해 발생하는 경우가 많다는 사실을 발견했으며, 이러한 격차를 해소하고자 합니다.

참고: 일부 스크립트와 정책은 NGINX 구성 언어로 쉽게 구현할 수 없을 정도로 복잡하거나 사용자 정의 동작이 필요한 경우가 있습니다. 이 경우 NGINX 및 NGINX Plus에서는 Lua, Perl 및 JavaScript와 같은 내장 스크립팅 언어를 사용하여 구현할 수 있습니다(NGINX Plus R10 이상에서는 NGINX JavaScript 모듈 사용).

자세한 정보와 사용 지침은 NGINX STORE 동적 모듈 카테고리를 참조하세요. 이 포스의 정보는 NGINX와 NGINX Plus 모두에 적용되지만, 간결성을 위해 게시물에서는 NGINX Plus만 언급하겠습니다.

목차

1. NGINX Plus 요청 라우팅을 위한 Citrix 마이그레이션
 1-1.URI 기반 라우팅 요청
  1-1-1. F5 iRule
  1-1-2. Citrix NetScaler 정책
  1-1-3. NGINX Plus 구성
 1-2. 예) User-agent 헤더를 기반으로 라우팅 요청
  1-2-1. F5 iRule
  1-2-2. Citrix NetScaler 정책
  1-2-3. NGINX Plus 구성
2. 요청 Redirection을 위한 로직 마이그레이션
 2-1. HTTPS로 Redirection 요청
  2-1-1. F5 iRule
  2-1-2. Citrix NetScaler 정책
  2-1-3. NGINX Plus 구성
3. 요청 Rewrite을 위한 로직 마이그레이션
 3-1.URI 구조 변경을 위한 Rewrite 요청
  3-1-1. F5 iRule
  3-1-2. CitrixNetScaler 정책
  3-1-3. NGINX Plus 구성
4. 응답 Rewrite을 위한 로직 마이그레이션
 4-1. 링크 경로 변경을 위한 응답 Rewrite
  4-1-1. F5 iRule
  4-1-2. Citrix NetScaler 정책
  4-1-3. NGINX Plus 구성
5. 결론

1. NGINX Plus 요청 라우팅을 위한 Citrix 마이그레이션

요청 라우팅은 여러 다른 애플리케이션을 동일한 완전한 도메인 이름(FQDN)에서 호스팅하면서 최종 사용자에게 단일 통합된 애플리케이션으로 보이도록 하는 방법입니다. ADC 또는 NGINX Plus는 각 요청을 헤더 또는 URI를 기반으로 적절한 업스트림 애플리케이션으로 전송합니다.

1-1. URI 기반 라우팅 요청

이 예제에서는 URI를 기반으로 한 요청 라우팅을 수행합니다. 구체적으로, URI가 /music으로 시작하면 요청은 music_backend 업스트림 그룹으로 라우팅됩니다. 다른 모든 URI는 구성된 기본 업스트림 그룹으로 전송됩니다.

1-1-1. F5 iRule

when HTTP_REQUEST {
    switch -glob [string tolower [HTTP::uri]] {
        "/music*" {pool music_backend}
        default {pool default_backend}
        }
}

1-1-2. Citrix NetScaler 정책

#> add cs vserver csapp HTTP 192.168.10.120 80 -cltTimeout 180
#> add cs policy cs_music -rule "HTTP.REQ.URL.STARTSWITH("/music")"
#> bind cs vserver csapp -policyName cs_music -targetLBVserver music_backend -priority 100
#> bind cs vserver csapp -lbvserver default_backend

1-1-3. NGINX Plus 구성

location /music {
    proxy_pass http://music_backend;
}
location / {
    proxy_pass http://default_backend;
}

1-2. User-Agent 헤더를 기반으로 라우팅 요청

다음 예제에서는 클라이언트 요청의 User-Agent 헤더를 기반으로 요청 라우팅을 수행하여 iOS 및 Android 디바이스의 요청은 별도의 백엔드 애플리케이션 서버로 보내고, 다른 모든 디바이스의 트래픽은 구성된 애플리케이션 서버로 보냅니다.

NGINX Plus의 맵 블록에서는 $http_user_agent 변수를 지정된 정규 표현식과 비교하고, $upstream_choice 변수를 일치하는 표현식과 연결된 업스트림 그룹으로 설정합니다. 그런 다음 $upstream_choice 변수는 proxy_pass 지시문에 의해 선택된 업스트림 그룹을 결정합니다.

1-2-1. F5 iRule

when HTTP_REQUEST {
    switch -glob [HTTP::header User-Agent] {
        "*iPhone*"  -
        "*iPad*"  -
        "*iPod*"  {pool iosapp}
        "*Android*"  {pool androidapp}
        default {pool musicapp}
    }
}

1-2-2. Citrix NetScaler 정책

#> add cs vserver csapp HTTP 192.168.10.120 80 -cltTimeout 180
#> add cs policy ios_agent -rule "HTTP.REQ.HEADER("User-Agent").CONTAINS("iPhone")
 || HTTP.REQ.HEADER("User-Agent").CONTAINS("iPad") || HTTP.REQ.HEADER("User-Agent").CONTAINS("iPad")"
#> add cs policy android_agent -rule "HTTP.REQ.HEADER("User-Agent").CONTAINS("Android")"
#> bind cs vserver csapp -policyName ios_agent -targetLBVserver ios_backend -priority 100
#> bind cs vserver csapp -policyName android_agent -targetLBVserver android_backend -priority 110
#> bind cs vserver csapp -lbvserver vs_default

1-2-3. NGINX Plus 구성

map $http_user_agent $upstream_choice {
  ~(iPhone|iPad|iPod) ios_backend;
  ~Android android_backend;
  default default_backend;
}

server {
  listen 80;
  location / {
    proxy_pass http://$upstream_choice;
  }
}

2. 요청 Redirection을 위한 로직 마이그레이션

클라이언트 요청을 Redirection해야 하는 경우가 종종 있습니다. 예를 들어 일반 HTTP 요청을 보내는 클라이언트를 HTTPS로 보안된 연결로 Redirection하는 경우가 있습니다. 다른 사용 사례로는 URL 단축 또는 애플리케이션 URL 구조 변경 등이 있습니다.

NGINX Plus로 요청을 Redirection하려면 return 지시문을 사용합니다. 이 지시문은 응답 코드(예: 301 또는 302)와 Redirection URL 두 가지 매개 변수를 사용합니다.

2-1. HTTPS로 Redirection 요청

다음 예제는 클라이언트를 HTTP에서 HTTPS로 Redirection하여 세션이 암호화되도록 합니다.

2-1-1. F5 iRule

when HTTP_REQUEST {
   HTTP::redirect "https://[getfield [HTTP::host] ":" 1][HTTP::uri]"
}

2-1-2. Citrix NetScaler 정책

#> add responder action ssl_redirect_act redirect ""https://" + HTTP.REQ.HEADER("Host").HTTP_HEADER_SAFE + HTTP.REQ.URL.PATH_AND_QUERY.HTTP_URL_SAFE" -responseStatusCode 301
#> add responder policy sslredirect TRUE ssl_redirect_act
#> bind lb vserver default_backend -policyName sslredirect -priority 100 -gotoPriorityExpression END -type REQUEST

2-1-3. NGINX Plus 구성

location / {
    return 301 https://$host$request_uri;
}

3. 요청 Rewrite을 위한 로직 마이그레이션

요청을 다시 작성하는 일반적인 이유는 헤더에 추가 정보를 제공하거나 URI를 변경하여 애플리케이션의 디렉토리 구조를 효과적으로 숨기거나 읽기 쉽고 기억하기 쉬운 URL을 생성하기 위해서입니다.

NGINX Plus로 요청을 조작하려면 rewrite 지시문을 사용합니다. 이 지시문은 변경할 문자열과 대체 문자열 두 가지 필수 매개 변수를 사용합니다.

3-1. URI 구조 변경을 위한 Rewrite 요청

다음 예제는 /music/artist/song 요청의 URI 구조를 /mp3/artist-song.mp3로 재작성합니다.

3-1-1. F5 iRule

when HTTP_REQUEST {
  if {[string tolower [HTTP::uri]] matches_regex {^/music/([a-z]+)/([a-z]+)/?$} } {
    set myuri [string tolower [HTTP::uri]]
    HTTP::uri [regsub {^/music/([a-z]+)/([a-z]+)/?$} $myuri "/mp3/\1-\2.mp3"]
  }
}

3-1-2. Citrix NetScaler 정책

#> add rewrite action act_rewrite_music replace "HTTP.REQ.URL.REGEX_SELECT(re!^\/music\/[a-z]+\/[a-z]+(\/)?$!)" ""/mp3/" + HTTP.REQ.URL.AFTER_REGEX(re!^\/music\/!).BEFORE_REGEX(re!\/[a-z]+(\/)?$!) + "-" + HTTP.REQ.URL.AFTER_REGEX(re!^\/music\/[a-z]+\/!).BEFORE_REGEX(re!(\/)?$!) + ".mp3""
#> add rewrite policy pol_rewrite_music "HTTP.REQ.URL.REGEX_MATCH(re!^\/music\/[a-z]+\/[a-z]+(\/)?$!)" act_rewrite_music
#> bind lb vserver music_backend -policyName pol_rewrite_music -priority 100 -gotoPriorityExpression END -type REQUEST

3-1-3. NGINX Plus 구성

location ~*^/music/[a-z]+/[a-z]+/?$ {
    rewrite ^/music/([a-z]+)/([a-z]+)/?$ /mp3/$1-$2.mp3 break;
    proxy_pass http://music_backend;
}

4. 응답 Rewrite을 위한 로직 마이그레이션 (Citrix > NGINX Plus)

응답 본문을 다시 작성하는 것은 요청 라우팅과 함께 많이 수행되며, 응답 본문의 링크를 변경하여 요청 라우팅에 의해 생성된 새 URI 구조를 반영합니다. 또한 클라이언트에 전송되기 전에 응답 본문을 다른 방식으로 변경하는 데에도 사용할 수 있습니다.

NGINX Plus로 HTTP 응답을 다시 작성하려면 sub_filter 지시문을 사용합니다. 이 지시문은 검색하여 대체할 문자열과 대체 문자열 두 가지 매개 변수를 사용합니다.

4-1. 링크 경로 변경을 위한 응답 Rewrite

다음 예제는 응답 본문에서 /mp3/ 디렉토리 요소가 포함된 링크를 검색하여 /music/으로 대체합니다.

4-1-1. F5 iRule

when HTTP_RESPONSE {
   if {[HTTP::header value Content-Type] contains "text"}{
     STREAM::expression {@/mp3/@/music/@}
     STREAM::enable
   }
}

4-1-2. Citrix NetScaler 정책

#> add rewrite action act_rewrite_body replace_all "HTTP.RES.BODY(100000)" ""/music/"" -search "text("/mp3/")"
#> add rewrite policy pol_rewrite_body TRUE act_rewrite_body
#> bind lb vserver default_backend -policyName pol_rewrite_body -priority 100 -gotoPriorityExpression END -type RESPONSE

4-1-3. NGINX Plus 구성

location / {
    sub_filter '/mp3/' '/music/';
    proxy_pass http://default_backend;
}

5. Citrix 정책에서 NGINX Plus로 마이그레이션 결론

위에서 볼 수 있듯이, NGINX 및 NGINX Plus 구성 언어는 ADC와 관련된 많은 스크립팅 사용 사례를 다룹니다. 이 강력한 도구를 사용하면 소프트웨어 기반 로드 밸런싱으로의 마이그레이션이 간단하고 쉽게 수행됩니다.

보다 복잡하거나 사용자 정의 동작이 필요한 경우에는 Lua, Perl 및 JavaScript와 같은 내장 스크립팅 언어를 사용하여 구현할 수 있습니다. (NGINX Plus R10 이상에서는 NGINX JavaScript 모듈 사용)
자세한 정보와 사용 지침은 NGINX STORE 동적 모듈 카테고리를 참조하세요. NGINX Plus를 사용해 보려면 30일 무료 평가판을 시작하거나 사용 사례에 대해 문의하세요.

아래 뉴스레터를 구독하고 NGINX와 NGINX STORE의 최신 정보들을 빠르게 전달 받아보세요.