EC2 인스턴스에 Nginx를 구축해 보자

Reading time ~3 minutes

시작하기에 앞서

작업하려는 구조는 이렇습니다.

하나의 EC2에 웹 서버와 WAS가 같이 있는 구조입니다.

Nginx_구조

이렇게 Nginx가 외부의 요청을 받아 뒷단 서버로 요청을 전달하는 행위를 리버스 프록시라고 합니다. 이런 리버스 프록시 서버(Nginx)는 요청을 전달하고, 실제 요청에 대한 처리는 뒷단의 웹서버들이 처리합니다. 대신 외부 요청을 뒷단 서버들에게 골고루 분배한다거나, 한번 요청왔던 js, image, css등은 캐시하여 리버스 프록시 서버에서 바로 응답을 주거나 등의 여러 장점들이 있습니다. 자세한 설명은 NginX로 Reverse-Proxy 서버 만들기 - Joinc를 참고하시면 좋습니다.

출처: http://jojoldu.tistory.com/267?category=635883 [기억보단 기록을]

학습 차원으로 Nginx를 설치하고 실행해 보는 것에 중점을 두고 진행 했습니다.

위에 보이는 것과 같이 사용자가 Nginx를 통해 80번 포트로 접속하면 동일 ec2 인스턴스 내의 8080번 포트의 웹 애플리케이션으로 연결되게 해 봅시다.


실습은 창천향로님의 Nginx를 활용한 무중단 배포 구축하기를 보고 무중단 배포를 제외 진행 하였습니다.

참고로, EC2 구성은

창천향로님 : AWS Amazon Linux EC2로 Centos 기반
저 : Ubuntu Server 16.04 LTS

워낙에 원글이 잘 되어있기 때문에 따라 하는 것은 위의 블로그를 추천하고

전 창천향로님과 조금은 다른 환경에서 작업하느라 오는 문제들에 대해 해결 한 부분 및 실습 과정을 복습하는 차원에서 작성했습니다.


설치


EC2에 접속해서 Nginx를 설치합니다.

sudo apt-get install nginx

참고로

service nginx start : 시작
service nginx stop : 정지
service nginx restart : 재시작
service nginx reload : 설정파일을 재로드
service nginx status : 현재 상태

설치가 완료되셨으면 아래 명령어로 nginx를 실행합니다.

sudo service nginx start

Nginx 잘 실행되었는지 아래 명령어로 확인해봅니다.

sudo service nginx status

Nginx_status

이제 접속해 봅니다.

Nginx_접속문제

?!

왠지 모르게 접속이 안됩니다. 설정들이 잘못되었나 계속 확인해보면서 저 화면만 한 삼십분 본 것 같군요…

당연히 따라 하기만 할 거였다면 포스팅을 안 했겠죠??

저 같은 경우 hosts 파일을 통해서 myec2라는 호스트 이름을 통해 ec2 인스턴스에 접근합니다.
그게 아니라면 EC2 Public DNS/IP를 통해 접속하시면 됩니다. (hosts 파일 수정 방법)


EC2 인스턴스의 80번 포트에 대한 접근 허용


생각해보니 제 ec2 인스턴스의 Security Group에 80번 포트에 대한 인바운드 규칙을 추가해준 기억이 없습니다….

Nginx_ec2상태

인바운드 규칙 보기를 눌러보시면

Nginx_인바운드

80번 포트에 대한 것은 없습니다.

만약 접속이 잘 되신 분이라면 80번 포트에 대한 접근이 허용되어 있었을 겁니다.

Nginx_http추가

80번 포트에 해당하는 HTTP 규칙을 추가합니다.

(나중에 확인해보니 창천향로님은 해당 시리즈 4번째 글에서 추가하셨더군요. 차근차근 따라 하는게 아니라 이렇게 하고 싶은 부분들만 자신의 환경에 맞춰서 할 때는 삽질이 필요하죠!!)

Nginx_접속완료

다시 접속해보니 이제 잘 되는군요.


Nginx와 스프링부트 프로젝트를 연결


자 그럼 다시 진행을 해 봅시다.

Nginx_창천향로님글

라는 군요.

sudo vi /etc/nginx/nginx.conf

Nginx_location_없음

아무리 눈을 씻고 찾아봐도 location / 이 존재하지 않습니다.

http 내부에 한번 server, location / 을 추가해서 진행해보니 안됩니다.(지금 보니 가능 할 것 같습니다)

이럴 때 필요한 것은 구글링!!

자료1자료2를 보니 /etc/Nginx/sites-available/default를 확인해 봐야 하겠군요.

sudo vi /etc/nginx/sites-available/default

Nginx_default_location

추가를 해줍니다.

현재 스크린샷에선 주석 처리를 안 했지만

#try_files $uri $uri/ =404;

위와 같이 주석 처리를 해 주시기 바랍니다. (try_files 관련 내용)


위에 밑줄 쳐둔 include /etc/Nginx/sites-enabled/*;로 되어 있는 부분 덕에 해당 내용이 추가되어서 되는 것 같은데 우리가 설정을 한 곳은 sites-available입니다.

왜 되는지 구글링을 하기 전에 파일 내용이 같길래 혹시나 확인해보니

Nginx_sites-enabled

심볼릭 링크라는 걸 알 수 있습니다. (간단히 바로 가기를 생각하시면 됩니다)

대강 찾아보니 데비안 계열에서는 sites-enabledsites-available를 활용하는 점에서 창천향로님이 사용하신 Centos와 조금 다른 부분이 있어 진행이 안됐더군요.

해당 내용은 여기를 참조하면 알 수 있는 것 같군요???


정말 접속


새로 설정한 내용들이 적용되게 Nginx를 재시작 한 다음

sudo service nginx restart

접속을 해봅니다.

Nginx_trello

성공!!

잘 안 보이긴 하지만 :8080 없이 접속된 것을 볼 수 있습니다.(http의 경우 기본값은 80번)

참고로 이제 80번 포트를 이용하여 Nginx를 통해 8080번 포트를 사용하는 웹 애플리케이션에 접속할 것이라 EC2 인스턴스에 8080 포트에 대한 인바운드 규칙을 제거해도 됩니다.

단, 어디까지나 하나의 EC2 인스턴스 내에 웹 서버와 was가 동시에 존재하기 때문에 가능하지 각자의 환경이나 설정에 따라 다릅니다.


요약


  1. 창천향로님의 글을 첫번재 포스팅부터 순서대로 따라하기만 하면 잘 된다.

  2. 만약 접속이 안되면 AWS EC2의 80번 포트에 대한 접근이 허용 되어있는지 확인 해 보자.

  3. Nginx에서 was로의 연결이 안되는 상황에다 우분투 사용자라면

     sudo vi /etc/nginx/sites-available/default
    

    에서 location을 변경 해 주자.


여담

사실 무중단 배포를 아직 안한 이유는….

Nginx_aws_bill

적은 돈이지만…. 잠시 보류 하기로 하였습니다.

창천향로님이 진행하는 예제에는 좀 가벼운 웹 애플리케이션을 이용하시는 것 같은데

저 같은 경우는 기존에 만들고 있던 프로젝트로 진행을 하다보니 s3에 업로딩 하고

ec2에 받아 와서 빌드하는 과정도 시간이 좀 걸려서 진행도 뚝뚝 끊기는데다가

돈도 과금이 되니 움찔하게 되는군요…방금 작업하는데도 조금씩 오르더군요.
(아직 월 말도 아니고ㅜㅜ)

이럴땐 작년 AWS한국 사용자모임 행사서 받았던 크레딧이 그립군요.

큰돈은 아니니 마저 진행을 해 볼 텐데 과금을 줄이기 위해 웹 애플리케이션을 좀 더 가벼운 녀석으로 바꾸거나 실패를 최소화해서 리소스를 덜 쓰는 방향으로 가야 할 것 같군요.


다만, 이전 TravisCI & AWS CodeDeploy로 배포 자동화 구축하기처럼 큰 문제없이 진행이 되면 따로 포스팅을 하진 않을 것 같습니다.