자습서-NGINX gRPC API Gateway 설정하기
NGINX API Gateway – gRPC API Gateway 배포 모범사례에서 다뤘던 내용을 바탕으로 NGINX gRPC API Gateway 설정을 따라할 수 있는 자습서를 제공합니다.
목차
1. 테스트 환경 설정
2. NGINX OSS 또는 NGINX Plus 설치
2-1. 도커 설치
2-2. RouteGuide 서비스 컨테이너 설치
2-3. helloworld 서비스 컨테이너 설치
3. gRPC 클라이언트 애플리케이션 설치
3-1. 설정 테스트
1. 테스트 환경 설정
다음 지침은 격리되고 반복 가능하도록 가상 머신에 테스트 환경을 설치합니다. 그러나 물리적인 “베어메탈” 서버에 설치할 수 없는 이유는 없습니다.
테스트 환경을 단순화하기 위해 Docker 컨테이너를 사용하여 gRPC 서비스를 실행합니다. 즉, 테스트 환경에 여러 호스트가 필요하지 않지만 프로덕션 환경에서와 같이 NGINX가 네트워크 호출로 프록시 연결을 만들 수 있습니다.
또한 Docker를 사용하면 코드 변경 없이 다른 포트에서 각 gRPC 서비스의 여러 인스턴스를 실행할 수 있습니다. 각 gRPC 서비스는 가상 머신의 고유한 로컬 호스트 포트에 매핑된 컨테이너 내의 포트 50051에서 수신 대기합니다. 그러면 NGINX가 수신 포트로 사용할 수 있도록 포트 50051이 해제됩니다. 따라서 테스트 클라이언트가 미리 구성된 포트 50051을 사용하여 연결할 때 NGINX에 도달합니다.
2. NGINX OSS 또는 NGINX Plus 설치
- NGINX Plus 관리자 가이드의 지침에 따라 NGINX Open Source 또는 NGINX Plus를 설치합니다 .
- GitHub Gist 리포지토리 에서 다음 파일 을 /etc/nginx/conf.d 에 복사합니다 .
- grpc_gateway.conf
- 오류.grpc_conf
참고: TLS를 사용하지 않는 경우 grpc_gateway.conf에서 ssl_* 지시문을 주석 처리하십시오.
3. NGINX 오픈 소스 또는 NGINX Plus를 시작합니다
$ sudo nginx
2-1. 도커 설치
Debian 및 Ubuntu의 경우 다음을 실행합니다.
$ sudo apt-get install docker.io
CentOS, RHEL 및 Oracle Linux의 경우 다음을 실행합니다.
$ sudo yum install docker
2-2. RouteGuide 서비스 컨테이너 설치
- 다음 Dockerfile에서 RouteGuide 컨테이너에 대한 Docker 이미지를 빌드합니다.
# This Dockerfile runs the RouteGuide server from
# https://grpc.io/docs/tutorials/basic/python.html
FROM python
RUN pip install grpcio-tools
RUN git clone -b v1.14.x https://github.com/grpc/grpc
WORKDIR grpc/examples/python/route_guide
EXPOSE 50051
CMD ["python", "route_guide_server.py"]
빌드 전에 Dockerfile을 로컬 하위 디렉토리에 복사하거나 Dockerfile에 대한 Gist의 URL을 dockerbuild
명령에 대한 인수로 지정할 수 있습니다.
$ sudo docker build -t routeguide https://gist.githubusercontent.com/nginx-gists/87ed942d4ee9f7e7ebb2ccf757ed90be/raw/ce090f92f3bbcb5a94bbf8ded4d597cd47b43cbe/routeguide.Dockerfile
이미지를 다운로드하고 빌드하는 데 몇 분 정도 걸릴 수 있습니다. 성공적으로 빌드되었다는 메시지의 표시와 16진수 문자열(이미지 ID)은 빌드 완료를 나타냅니다.
2. docker images
를 실행하여 이미지가 빌드되었는지 확인합니다.
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
routeguide latest 63058a1cf8ca 1 minute ago 1.31 GB
python latest 825141134528 9 days ago 923 MB
3. RouteGuide 컨테이너를 시작합니다.
$ sudo docker run --name rg1 -p 10001:50051 -d routeguide
$ sudo docker run --name rg2 -p 10002:50051 -d routeguide
$ sudo docker run --name rg3 -p 10003:50051 -d routeguide
각 명령이 성공하면 실행 중인 컨테이너를 나타내는 긴 16진수 문자열이 나타납니다.
4. docker ps를 실행하여 세 개의 컨테이너가 모두 작동 중인지 확인하십시오. (샘플 출력은 읽기 쉽도록 여러 줄로 나뉩니다.)
$ sudo docker ps
CONTAINER ID IMAGE COMMAND STATUS ...
d0cdaaeddf0f routeguide "python route_g..." Up 2 seconds ...
c04996ca3469 routeguide "python route_g..." Up 9 seconds ...
2170ddb62898 routeguide "python route_g..." Up 1 minute ...
... PORTS NAMES
... 0.0.0.0:10003->50051/tcp rg3
... 0.0.0.0:10002->50051/tcp rg2
... 0.0.0.0:10001->50051/tcp rg1
출력의 PORTS 열은 각 컨테이너가 다른 로컬 포트를 컨테이너 내부의 포트 50051에 매핑한 방법을 보여줍니다.
2-3. helloworld 서비스 컨테이너 설치
- 다음 Dockerfile에서 helloworld 컨테이너에 대한 Docker 이미지를 빌드합니다.
# This Dockerfile runs the helloworld server from
# https://grpc.io/docs/quickstart/go.html
FROM golang
RUN go get -u google.golang.org/grpc
WORKDIR $GOPATH/src/google.golang.org/grpc/examples/helloworld
EXPOSE 50051
CMD ["go", "run", "greeter_server/main.go"]
빌드 전에 Dockerfile을 로컬 하위 디렉토리에 복사하거나 Dockerfile에 대한 Gist의 URL을 docker 빌드 명령에 대한 인수로 지정할 수 있습니다.
$ sudo docker build -t helloworld https://gist.githubusercontent.com/nginx-gists/87ed942d4ee9f7e7ebb2ccf757ed90be/raw/ce090f92f3bbcb5a94bbf8ded4d597cd47b43cbe/helloworld.Dockerfile
이미지를 다운로드하고 빌드하는 데 몇 분 정도 걸릴 수 있습니다. 성공적으로 빌드되었다는 메시지의 표시와 16진수 문자열(이미지 ID)은 빌드 완료를 나타냅니다.
2. docker images 를 실행하여 이미지가 빌드되었는지 확인합니다.
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
helloworld latest e5832dc0884a 10 seconds ago 926MB
routeguide latest 170761fa3f03 4 minutes ago 1.31GB
python latest 825141134528 9 days ago 923MB
golang latest d0e7a411e3da 3 weeks ago 794MB
3. helloworld 컨테이너를 시작합니다
$ sudo docker run --name hw1 -p 20001:50051 -d helloworld
$ sudo docker run --name hw2 -p 20002:50051 -d helloworld
각 명령이 성공하면 실행 중인 컨테이너를 나타내는 긴 16진수 문자열이 나타납니다.
docker ps 를 실행하여 두 개의 helloworld 컨테이너가 작동 중인지 확인 합니다.
$ sudo docker ps
CONTAINER ID IMAGE COMMAND STATUS ...
e0d204ae860a helloworld "go run greeter..." Up 5 seconds ...
66f21d89be78 helloworld "go run greeter..." Up 9 seconds ...
d0cdaaeddf0f routeguide "python route_g..." Up 4 minutes ...
c04996ca3469 routeguide "python route_g..." Up 4 minutes ...
2170ddb62898 routeguide "python route_g..." Up 5 minutes ...
... PORTS NAMES
... 0.0.0.0:20002->50051/tcp hw2
... 0.0.0.0:20001->50051/tcp hw1
... 0.0.0.0:10003->50051/tcp rg3
... 0.0.0.0:10002->50051/tcp rg2
... 0.0.0.0:10001->50051/tcp rg1
3. gRPC 클라이언트 애플리케이션 설치
- 프로그래밍 언어 필수 구성 요소를 설치합니다. 그 중 일부는 테스트 환경에 이미 설치되어 있을 수 있습니다.
Ubuntu 및 Debian의 경우 다음을 실행합니다.
$ sudo apt-get install golang-go python3 python-pip git
CentOS, RHEL 및 Oracle Linux의 경우 다음을 실행합니다.
$ sudo yum install golang python python-pip git
python-pip를 사용하려면 EPEL 저장소를 활성화해야 합니다(필요한 경우 먼저 sudo yum install epel-release 실행).
2. helloworld 애플리케이션 다운로드:
$ go get google.golang.org/grpc
3. RouteGuide 애플리케이션 다운로드:
$ git clone -b v1.14.1 https://github.com/grpc/grpc
$ pip install grpcio-tools
3-1. 설정 테스트
- helloworld 클라이언트를 실행합니다.
$ go run go/src/google.golang.org/grpc/examples/helloworld/greeter_client/main.go
2. RouteGuide 클라이언트를 실행합니다.
$ cd grpc/examples/python/route_guide
$ python route_guide_client.py
3. NGINX 로그(Log)를 확인하여 테스트 환경이 작동하는지 확인하십시오.
$ tail /var/log/nginx/grpc_log.json