-
Nginx HTTP Upstream 알아보기Nginx 2023. 9. 16. 20:56728x90반응형
- 목차
관련된 글
https://westlife0615.tistory.com/341
Upstream 이란 ?
데이터의 흐름을 스트림이라고 부르기도 합니다.
실제 스트림의 사전적 의미는 흐르는 강물을 뜻하는데요.
데이터의 흐름이 마치 흐르는 강물과 같다고 하여 데이터 스트림이라고 불립니다.
Nginx 은 Reverce Proxy 로써 클라이언트와 어플리케이션 서버 사이에 위치하게 되는데요.
그래서 Nginx 는 거대한 강줄기의 중간에 위치한 강의 한 부분으로 볼 수도 있습니다.
일반적으로 Nginx 는 아래와 같은 구조로 적용되곤합니다.
<Nginx 적용 예시>
전류는 전압이 높은 곳에서 낮을 곳으로 흐릅니다.
물 또한 수압이 높은 곳에서 낮은 곳으로 흐릅니다.
이러한 관점에서 데이터가 많은 곳에서 데이터가 필요한 곳으로 흐른다고 할 때,
데이터베이스나 파일 스토리지를 데이터 밀집도가 높은 영역이라고 할 수 있습니다.
그리고 클라이언트는 데이터가 부족하여 필요로하는 영익이죠.
따라서 데이터베이스 -> 클라이언트를 Downstream.
클라이언트에서 데이터베이스로의 데이터를 찾기 위한 방향을 Upstream 이라고 볼 수 있습니다.
Nginx 는 Reverse Proxy 로써 서버에서 클라이언트의 요청을 전달하므로
Nginx 는 어플리케이션 서버보다 낮은 위치에 자리하고, 어플리케이션 서버는 Nginx 보다 높은 위치에 자리하게 됩니다.
또한 Nginx 는 여러 Api Server 들에게 부하 분산 (Load Balancing) 을 할 수 있습니다.
이어지는 내용에서 부하 분산 (Load Balancing) 에 대해서도 자세히 알아보겠습니다.
HTTP Upstream 이란 ?
Nginx 의 Reverse Proxy 는 3가지 네트워크 프로토콜에서 동작합니다.
3가지 프로토콜은 각각 HTTP, TCP, UDP 인데요.
이번 글에서는 HTTP 프로토콜에서의 Reverse Proxy 에 대해서 알아보고자 합니다.
이는 다른 표현으로 HTTP Upstream 이라고도 합니다.
HTTP 프로토콜은 OSI 4 계층인 TCP & UDP 와 다르게 OSI 7 계층인 Application Layer 의 프로토콜입니다.
따라서 4계층 정보인 IP 주소와 3계층 정보인 포트 정보 뿐만 아니라 그 이상의 정보를 다루고 기능을 수행합니다.
예를 들어,7계층 (Application Layer) 정보인 HTTP url Path 를 기반으로 라우팅을 적용할 수 있습니다.
/v1/login 인 경우에는 버전 1 API 를 다루는 서버로 라우팅할 수 있고,
/v2/login 인 경우에는 버전 2 API 를 다루는 서버로 라우팅할 수 있습니다.
6계층 (Presentation Layer) 단계의 압축과 관련된 작업을 진행할 수도 있습니다.
( 압축되지 않는 상태의 HTTP 요청을 새롭게 압축하는 등의 작업을 의미함.)
그 외 HTTPS 보안을 입히는 작업도 수행할 수 있습니다.
Sticky Session 또는 Hashing 기반의 Redirect 를 통해서 Session Layer 의 역할 또한 수행할 수 있죠.
예시.
Reverse Proxy 구현하기.
아래 코드는 nginx.conf 의 설정 파일입니다.
해당 내용의 파일은 /tmp/nginx/nginx.conf 위치에 생성합니다.
파일의 저장 위치는 어디든 상관없지만 저는 맥을 쓰고 /tmp 폴더가 자동으로 파일을 삭제해주기 때문에
간단한 테스트를 할떄는 tmp 디렉토리를 즐겨 사용합니다.
<nginx.conf>
user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { upstream backend { server host.docker.internal:3000; server host.docker.internal:3001; server host.docker.internal:3002; } server { location / { proxy_pass http://backend; } } }
아래 코드는 cat command 를 활용하여 nginx.conf 파일을 생성합니다.
아래 코드를 복사하셔서 터미널에서 실행하시면 /tmp/nginx/nginx.conf 파일이 생성됩니다.
<nginx.conf 파일 생성 코드>
cat <<EOF > /tmp/nginx/nginx.conf user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { upstream backend { server host.docker.internal:3000; server host.docker.internal:3001; server host.docker.internal:3002; } server { location / { proxy_pass http://backend; } } } EOF
아래 명령어를 통해서 nginx container 를 실행시킬 수 있습니다.
<docker run nginx>
docker run --platform linux/amd64 -d --rm --name nginx -v /tmp/nginx/nginx.conf:/etc/nginx/nginx.conf -p 81:80 nginx
<Nginx 와 Nodejs 서버를 연결하기>
docker run --platform linux/amd64 -d --rm --name node-server1 -p 3000:8888 westlife0615/node-server:1 docker run --platform linux/amd64 -d --rm --name node-server2 -p 3001:8888 westlife0615/node-server:1 docker run --platform linux/amd64 -d --rm --name node-server3 -p 3002:8888 westlife0615/node-server:1 curl http://localhost:3000 curl http://localhost:3001 curl http://localhost:3002 >> Hello nodejs
curl 로 nginx 에 요청을 보냅니다.curl http://localhost:81
Nginx 가 Nodejs 서버로 요청을 라우팅합니다.
그리고 hello world 텍스트를 응답합니다.
해당 응답은 nodejs 서버의 응답으로 nginx 와 어플리케이션 서버의 커뮤니케이션을 확인할 수 있습니다.Hello nodejs%
반응형'Nginx' 카테고리의 다른 글
[Nginx] Web Content Serving 알아보기 ( default.conf ) (0) 2024.03.18 Nginx 구조 알아보기 (0) 2023.10.07