Dev/DevOps, Infra

[NGINX] EC2에 nginx 설치 및 세팅

HJChung 2021. 1. 15. 02:26

첫 번째 프로젝트로 진행한 SAFU 웹 서비스 을 배포하기 위해 서버 구축을 하려하며, 

'서버 단위의 로드 밸런서' 아키텍쳐 중 애플리케이션 서버가 (일단은)하나인 아래의 구성으로 진행하고자 한다.

순서는 

1. EC2 배포 및 inbound 설정
2. ACM 에서 SSL 인증서 발급
3. ELB 생성 및 리스너 세팅
4. Route53의 도메인과 ELB의 인스턴스 DNS 연결
5. EC2에 nginx 설치 및 세팅

으로 진행 될 것이다. 

 

이번에는 5. EC2에 nginx 설치 및 세팅 에 대해 정리해보고자 한다.

NGINX란

서버 인스턴스에는 클라이언트의 요청을 처리해주는 서버 소프트웨어가 필요하다. 서버 소프트웨어는 크게 웹 서버웹 애플리케이션 서버(WAP; Web Application Server)로 구성된다.

 

웹 서버는 클라이언트에서 HTTP 프로토콜로 요청을 받고 HTML, CSS, Javascript, 이미지와 같은 정적인 파일(즉, 데이터베이스에 쿼리문을 날려야 한다던지 로그인 기능이라던지 하는 동적인 응답이 필요한 경우가 아니라)을 응답으로 전달 할 수 있다.

반면 웹 애플리케이션 서버는 클라이언트 요청에 의해 서버의 배포된 코드를 실행시키고, 동적인 응답을 만들어준다.

 

웹 서버와 웹 애플리케이션 서버는 함께 사용되면서 웹 서버는 1. 정적인 파일을 처리하거나 2. 웹 애플리케이션 서버로 라우팅 하는 역할을 하고, 웹 애플리케이션 서버는 동적인 처리가 필요한 요청이 온 것을 처리해서 응답해주는 것들을 할 수 있다.

 

웹 서버 중 대표적인 product로 nginx와 apache가 있고, 이번 배포의 경우 웹 서버로 nginx를 사용하고자 한다.

 

그리고 앞앞 문장에서 간단하게 적어놓은 것처럼 NGINX가 '웹 애플리케이션 서버로 라우팅'해준다는 것의 의미와 필요성에 대해 알아본 것을 적어보자면,

출처: AWS ELB와 Nginx로 HTTPS 서버 구축하기

이런 식으로 nginx 웹 서버를 맨 앞단에 가짜 서버로 두고, 뒷단에 웹 서버를 두는 reverse proxy 구조로 설계하여 보안성을 강화할 수 있다.

 

2. EC2에 nginx 설치 및 세팅

1) 우선 EC2 인스턴스에 접속한 후 nginx를 설치한다. 

(나는 기존에 apache를 설치했어서, 이를 삭제하고 nginx를 설치했다.)

$ sudo apt install nginx

2) nginx 설정 바꾸기

root path에서 etc/nginx로 이동하며 설정파일인 nginx.conf파일(메인 설정 파일)이 있다. 이 파일을 수정해야한다.

※ 컴파일을 통해서 설치한 경우라면 기본적으로 /usr/local/nginx/conf 디렉토리에 위치하고, apt-get을 이용해서 우분투에 설치한 경우는 /etc/nginx에 위치한다. 설치 방법에 따라서 환경설정 파일의 위치는 다를 수 있기 때문에 아래의 명령을 이용하면 설정 파일의 위치를 쉽게 찾을 수 있다.

$ sudo find / -name nginx.conf

출처: opentutorials.org/module/384/4526

이렇게 Linux나 Unix에서 환경설정 파일 등을 수정해야 될때 vi 또는 vim을 사용한다.
들어가서 바로 무엇을 수정하려고 키보드를 치면 띵띵 소리와 함께 잘 되지 않는다. 입력모드로 전환을 하지 않아서 그렇다.

이런 환경설정 파일에서 사용할 명령어도 알아야하는데, 이 글에 잘 정리가 되어있어서 첨부한다.

 

대표적으로 입력모드 전환 명령어는 i (커서 있는데서 입력모드 전환)

파일 저장 및 불러오기 명령어는 esc 누른 후 :w(지정된 파일에 저장), :q(저장하지 않고 종료), :wq(지정된 파일에 저장하고 vi를 종료)등이 있다. 

3) 여기서 http{}안에 코드를 작성한다. 

※ 설정 파일(nginx.conf)의 구성은

worker_processes  1;
events {
    worker_connections  1024;
}
http { 
    include       mime.types;
    server {
        listen       80;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
}

이런 식이다.

1) Core 모듈 설정

위의 예의 work_processes와 같은 지시자 설정 파일 최상단에 위치하면서 nginx의 기본적인 동작 방식을 정의한다.

2) http 블록

http 블록은 이후에 소개할 server, location의 루트 블록이라고 할 수 있고, 여기서 설정된 값을 하위 블록들은 상속한다. http, server, location 블록은 계층구조를 가지고 있다. http의 내용은 server의 기본값이 되고, server의 지시어는 location의 기본값이 된다. 그리고 하위의 블록에서 선언된 지시어는 상위의 선언을 무시하고 적용된다.

3) server 블록

server 블록은 하나의 웹사이트를 선언하는데 사용된다. 가상 호스팅(Virtual Host)의 개념이다.

4)location 블록

location 블록은 server 블록 안에 등장하면서 특정 URL을 처리하는 방법을 정의한다.

여기서는 http블록 내의 server 블록과 location/ 블록에 아래와 같이 작성한다.

이때 무조건 동일하게 작성하는 것은 아니고, proxy_pass 부분을 웹 애플리케이션 서버 포트로 해주어야 한다.

만약 포트번호를 모르겠다면

$ netstat -tlpn

을 통해서 확인이 가능하다. (뭘 install해야한다고 하면 경고창에 나온 install 명령어 그대로 따라해서 설치 후 netstat -tlpn을 하면 된다.)

4) 설정 파일의 반영

설정파일을 esc+:wq을 통해 저장하고 나왔더라고 반영이 안된다고 내가 뭘 잘못한거지 2시간 동안 헤맸었다. 알고보니 설정파일의 내용을 반영을 시켜주지 않았던 것이다. 저장 후 아래의 명령어로 반영을해주자.

$ sudo service nginx reload;

그리고 나서

$ sudo service nginx status;

로 running이 정상적으로 잘 되고 있는지 확인해보자!

 

※ nginx의 기본적인 서비스 실행 명령은 아래와 같다

service nginx status
service nginx start
service nginx stop
service nginx restart
service nginx reload

 

 

여기까지하면

safu 프로젝트 배포는 완성되었다. ㅎㅎ

 

 

+ pm2를 설치하여 터미널을 나가더라도 항상 서버통신이 가능하게 해두었다. 

 

+ final 프로젝트인 약올림은 flask를 사용하여서 express미들웨어같은 역할을 해주는 uWSGI이 필요하다. 이에 관햇서 HJ님과 함께 저번주에 Flask 앱을 uWSGI와 nginx로 배포해보았는데, 이에 대해서도 조만간 정리를 해봐야 할 것 걑다. 

 

 

reference

AWS ELB와 Nginx로 HTTPS 서버 구축하기

AWS 인프라 구축 가이드 2장. 운영 서버 환경의 구성 - 김담형 지음

[AWS의 기본 09] NGINX를 node.js의 프록시로 설정하기