웹으로 RDP/VNC 원격제어 개발 중 VNC WS(Websocket) M/W(MiddleWare) 오픈소스인 noVNC 사용할 때 였습니다.
VNC서버의 RFB 프로토콜 메시지를 WS으로 웹브라우저에 전달해주는 M/W 입니다.
VNC서버와 1:1 연결로 N개의 VNC서버를 연결해야 한다면 N개의 M/W 프로그램을 실행해야 하는데 29000포트로 M/W를 실행하면 http://localhost:29000 URL로 원격제어가 가능했습니다.
DB에 저장된 원격제어 정보로 M/W 프로세스를 실행하고 iframe에 해당 URL로 제어하려 했으나...
당시 적용된 cors 정책에 M/W 포트를 모두 추가할 수는 없었고
보안상 NGINX에 등록한 인증서로 HTTPS 통신 했어야 했기에
http://localhost:29000 # 이 URL을
https://localhost/vnc/29000 # 이렇게 바꿔 매칭하고자 했습니다.
location을 정규식으로 작성할 때 패턴 그룹을 proxy_pass에 활용할 수 있습니다.
location ~* "^/vnc/(?<vnc_port>[0-9]+)/(?<others>.*)$" {
proxy_pass http://127.0.0.1:${vnc_port}/${others}$is_args$args;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
(?<vnc_port>[0-9]+)
부분에서 ?<vnc_port>
는 패턴 그룹의 이름(변수명)입니다.
proxy_pass에서 ${vnc_port}
로 패턴 그룹에 매칭된 값을 전달할 수 있습니다.
만약 패턴 그룹의 이름을 지정하지 않고 사용하고 싶다면 왼쪽 기준부터 순서대로 $1 $2 $3 ...
으로 사용할 수 있습니다.
- location 정규식에 패턴 그룹이 있을 때 사용하지 않을 경우 NGINX 문법 오류가 발생합니다.
참조 - http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
성능상 TPS요구조건이 높은 곳에서는 권장하진 않으니 적절히 활용하는게 중요합니다.