본문 바로가기

클라우드/Public Cloud(Naver, Amazon)

nginx 컨테이너 이미지 생성 후 ECR로 push하기

엔진엑스는 Igor Sysoev라는 러시아 개발자가 동시접속 처리에 특화된 웹 서버 프로그램이다. Apache보다 동작이 단순하고, 전달자 역할만 하기 때문에 동시접속 처리에 특화되어 있다. 동시접속자(약 700명) 이상이라면 서버를 증설하거나 Nginx 환경을 권장한다고 한다. 지금은 아파치가 시장 점유율이 압도적이지만, 아마존웹서비스(AWS) 상에서는 시장 점유율 44%에 달할정도로 가볍고, 성능이 좋은 엔진이라고 한다.

 

nginx가 돌아가는 방식으로는 Event Driven 방식을 꼽을 수 있다. Event Driven 방식은 요청이 들어오면 어떤 동작을 해야하는지만 알려주고 다른요청을 처리하는 방식이다. 흐름이 끊기지 않고 응답이 빠르게 진행되어 1개의 프로세스로 더 빠른 작업이 가능하게 될 수 있다. 메모리적은 측면에서 nginx가 System Resource를 적게 처리한다는 장점이 있다고 한다. 말이 어렵지만 간단하게 동접자 처리시 nginx가 효율이 더 좋고, 설정 값이 더 간단하다.

 

Nginx 자체는 별로 많은 연산을 하지 않는다. 주로 전달자 역할만 하며 이런 이유로 Reverse Proxy Tool 이라고도 부른다. 리버스 프록시란 그림과 같이 이해하면 된다.

 

그림과 같이 일반적인 경우에는 공유기 포트포워딩을 통해 웹 서버를 구현한다. 특정 포트를 요청하면 공유기자체에서 해당포트를 사용하는 웹서버를 요청하는 방법이다. 이 경우 URL이 난잡해지고 관리가 어려워진다.

리버스프록시는 다음과같이 리버스 프록시를 담당하는 서버가 네트워크에서 액세스를 받고 URL 매핑에 의해 동일한 Port 80으로 각각의 웹서버로 요청을 하고 응답을 받아 인터넷 상의 사용자에게 보내준다. 리버스 프록시 서버가 요청하고 응답을 보내주기 때문에 다른 포트번호를 사용한다고해서 사용자들이 그 포트번호를 알필요도 없고 관리하기도 어렵지 않아진다. 실습을 진행하겠다.

 

ec2 인스턴스를 하나 생성하여 docker를 설치한 후 nginx이미지를 가져왔다.

nginx이미지로 컨테이너를 하나 실행하였다. docker ps로 실행중인 컨테이너도 확인하였다.

docker exec -it web1 /bin/bash로 컨테이너에 접속한다.

nginx에는 vi 편집기가 없기 때문에 따로 설치해야한다.

apt-get-update

apt-get install vim 

Location 설정 파일 위치 및 mime 타입, 로그 등의 설정은 nginx.conf 파일을 수정함으로써 환경설정을 정의할 수 있다.

vi /etc/nginx/nginx.conf  (접속자 수, 동작 프로세스 수 등 퍼포먼스에 관한 설정들)

user : NGINX 프로세스가 실행되는 권한

work_processes : NGINX 프로세스 실행 가능 수

 /etc/nginx/cnf.d/default.conf  /etc/nginx/conf.d/default.conf  /etc/nginx/conf.d/default.conf 

Nginx의 Location 설정 파일은 기본적으로 /etc/nginx/conf.d/default.conf에 위치해있다. 

(index파일의 위치나 에러페이지 등을 설정한다.)

default.conf의 index파일의 경로로 index 파일이 /usr/share/nginx/html/index.html이 존재함을 알 수 있다.

 

인스턴스의 공인 ip 접속 결과 nginx의 기본페이지 나옴을 확인할 수 있다.

그 후 index.html 파일을 수정해 hello라는 간단한 웹페이지를 만들었다.

docker commit 명령어를 통해 컨테이너를 웹으로 만들었다.

그리고 AWS ECR에서 리포지토리를 생성했다. ECR은 Private Repository로서 iam과 같이 적용하면 보안성이 뛰어나다.

aws configure 명령어를 통해 설정한다.

aws ecr get-login --no-include-email --region ap-northeast-2 명령어로 로그인 할 수 있는  로그인 명령을 검색한다.

그 후 나오는 docker login -u ~~~~ 복사하여서 입력한 후 Login succed가 되었는지 확인한다.

docker tag hello:web ~~~~~~.dkr.ecr.ap-northeast-2.amazonaws.com/duck:latest (이미지 태그 지정)

docker push ~~~~~~~.dkr.ecr.ap-northeast-2.amazonaws.com/duck:latest (이미지 푸쉬)

이미지가 무사히 리포지터리에 올라갔음을 확인할 수 있다.