서버 구성도

 

NGINX - 정적 파일 연결하기 | Serving Static Content

먼저, Nginx 로 Static 파일을 반환하는 웹서버를 만들어보자.  먼저 웹서버가 하는일을 생각해보자!

  • 포트를 listen 해야한다.
  • 정적파일이 존재하는 곳에서 가져올수 있어야한다.

포트 연결하기

1. http directive 선언

포트를 연결하려면 NGINX 파일을 설정 해주어야한다. 파일이름은 nginx.conf 이고 해당 파일 위치는 /usr/local/etc/nginx (mac 기준)에 위치해 있다. nginx 를 http layer(layer 7) 에서 사용하기 위해서는 http directive 블럭 을 선언해 주어야한다.(directive 가 무엇인지 알고 싶다면 NGINX 개념과 구성 편을 참고)

 

nginx.conf 파일

http {}

2.  server directive 선언

layer 7 을 사용하는 http 블럭을 만들었다면 이제 포트를 듣고 있는 서버를 선언해 주어야한다. 8080 포트를 듣고 있는 server directive를 선언해주자.

이유는 모르겠지만.. ngnix 는 강제로 event directive를 사용하기 때문에, 일단 비어있는 events directive 도 만들어주자 

http {
    server {
        listen 8080;
    }
}

evens { }

3. 포트 연결 상태 확인

 

이제 주소창에 localhost:8080 이라고 입력해준다면 아래와 같은 페이지를 볼 수 있다.

 


정적 파일 가져오기

"난 이페이지를 만든적이 없는데...?"

 

이 페이지를 만든적이 없지만 welcome to nginx 라고 적힌 HTML 문서를 볼수 있다. 그 이유는 Nginx 는 기본적으로 root directory 에서 static 파일을 가져오고 있다. 그렇다면 root directory는 어디일까?

default root directory of nginx

/usr/local/Cellar/nginx/1.19.8/html

해당 디렉터리로들어가면 nginx 를 설치할때 함께 설치 되었던 html 파일을 찾을 수 있다.


1. root 로 사용할 디렉터리 만들기

 

해당 디렉터리를 사용해도 되지만 우리는 우리가 원하는 곳에 root directory을 만들 것이다. 먼저 root 로 사용할 directory 를 만들어주고 index.html 파일을 작성해주자.

cd /Users/Amuse/Documents/dev/server
vim index.html
<html>
  <body>
    My own content: NGNIX
  </body>
</html>

2. 디렉터리를 루트 디렉터리로 선언해주기

http {
    server {
        listen 8080;
        root /Users/Amuse/Documents/dev/server/;
        }
    }
}

 

이렇게 선언하고 localhost:8080으로 이동해보면, 내가 작성한 정적파일을 가져오는것을 볼 수 있다.

localhost:8080/


3. 여러개의 디렉터리에서 html 문서 가져오기

/Users/Amuse/documents/dev/server 를 루트 디렉터리로 설정했기때문에 이곳을 기준으로 가지치듯 다른 디렉터리도 작성해주자.

cd /Users/Amuse/Documents/dev/server
mkdir web1
mkdir web2

cd site1
vim index.html

cd site2
vim index.html

 

각 디렉터리 안에 index.html 을 만들어주자 

 

/Users/Amuse/documents/dev/server/web1/index.html

<html>
  <body>
    this is WEB 1
  </body>
</html>

/Users/Amuse/documents/dev/server/web2/index.html

<html>
  <body>
    this is WEB 2
  </body>
</html>

localhost:8080/web1/ 로 이동해보면

localhost:8080/web1/ 

localhost:8080/web2/ 로 이동해보면 

localhost:8080/web2/

모두 출력이 잘되고 있다!


3. Image 파일 가져오기

cd /Users/Amuse/Documents/dev/server
mkdir images
cd images
[이미지 넣기]

 

이미지를 넣어주고 이미지는 전용 이미지 경로를 만들어주기 위해 nginx.conf 설정을 해준다.

http {
    server {
        listen 8080;
        root Users/Documents/dev/server/;
        
        location /images {
        
            root /Users/documents/dev/server/;
            
        }
    }
}

event { }

localhost:8080/images/ 로접근한다면 forbidden 페이지가 표시될것이다. 당황하지말고 끝까지 이미지 경로를 적어준다면 이미지가 잘보일것이다. localhost:8080/images/[파일명.jpg]/ 로 설정한다면 해당 이미지가 반환될것이다.

 


 

4. 접근제어 하기 

보여주고 주고 싶지 않은 파일이 있다면 regular expression 사용도 가능하다

http {
    server {
        listen 8080;
        root Users/Documents/dev/server/;
        
        location /images {
        
            root /Users/documents/dev/server/;
            
        }
        
        location ~ .png$ {
        
            return 403;
            
        }
    }
}

event { }

location ~ 뒤에 정규표현식을 사용해서 특정파일 접근을 차단할 수도 있다.  png 로 끝나는 파일의 반환을 막고 싶다면 이렇게 설정파일을 작성하면된다. 그리고 해당 URI로 이동해본다면 forbidden 이라는 메세지를 볼수 있다


 

'WEB SERVER > nginx' 카테고리의 다른 글

2. NGINX 프록시 서버(proxy server) 만들기 -정리중  (0) 2021.03.19
NGNIX 개념과 구성  (0) 2021.03.13


NGNIX 란?

  • WEB SERVER  PROXY 기능을 동시에 제공해 주는 소프트웨어이다
  • Stream 을사용한 Layer 4 proxying
  • Http 을 사용한 Layer 7 proxying

WEB SERVER 기능

  • 정적 파일을 처리해준다.(HTML, CSS, 이미지 등)

PROXY 기능

  • Load Balance 
  • Backend Route
  • Caching

NGINX 동작 원리

  • Ngnix 는 하나의 master process 와 여러개의 worker process 들로 구성되어있다.
  • Event-based modelOS-dependent mechanism 을 기반으로 request를 worker processes  들에게 효율적이게 분배한다.
  • Configuration file 에서 worker process의 개수를 설정할 수 있으며 cpu코어 수와 맞게 적용 할 수도 있다.
  • Nginx의 기본 설정은 nginx.conf 라는 파일에 정의되어 있고, 위치는 /usr/local/nginx/conf, /etc/nginx, /usr/local/etc/nginx

Master Process

  • nginx.conf(설정파일) 을 읽고 검증한다.
  • Worker Process관리한다.

Worker Process

  • 명령을 받아 요청을 처리한다

 


 

NGINX 구조와 설정 

Nginx는 nginx.conf 에 작성된 directive 들에 의해서 작동된다. directive의 종류는 simple directive  block directive 가 있다.

 

Simple Directive

listen 9000;
  • nameparameter 로 구성되며, space 로 구분되고 끝맺음은 semicolon(;) 으로 정의된다.

Block Directive

example {}
  • Block Directive는 context를   {} 으로 감싸고 있다
  • context 밖에 선언된 Directive 들은 모두 main context 라고 한다.
  • simple directive 들을 감싸고 있다.

함께 사용된 예시

http {
    server{
        listen 8080;
    }
}

Nginx 명령어 | How to start and stop nginx, and reload its configuration

ngnix -s  명령어를 이용해 nginx 를 조작할수 있다.

  • stop — fast shutdown
  • quit — graceful shutdown
  • reload — reloading the configuration file
  • reopen — reopening the log files

안전하게 종료 | How to stop nginx

ngnix -s quit

 

모든 request 를 worker process 들이 처리한 다음에 끝내고 싶다면, ngnix -s quit 명령어를 입력하면 된다. 참고로 ngnix를 시작한 계정이 아니라면 작동하지 않는다..

 


재시작 | How to reload nginx

ngnix -s reload

configuration 파일이 수정된다면 ngnix -s reload 명령어를 입력하기 까지 적용되지 않는다. master process 는 새로운 configuration 파일에 대한 syntax validity 검사를 수행한다. syntax validity 를 통과한다면  설정이 적용된 worker process 들이 생기고 기존 worker process 들을 종료된다.

 

만약, syntax validity 를 통과 하지 못한다면 master process 는 수정되기 전 configuration 파일 값을 따르며 계속 작업을 수행시킨다. old process 들은 종료되라는 명령을 받고 수행중인 requests 들을 마무리하고 종료된다. 

 

Process ID 를 이용해서, Kill utility(Unix tool)로  직접 ngnix process 에게 신호를 전달할수 있다. Process ID 는 master process 에 작성되어 있으며 파일명은 nginx.pid 위치는  /usr/local/nginx/logs or /var/run 이다. Process ID 가 1628일 경우 프로세스를 안전하게 종료하고 싶다면:

kill -s QUIT 1628

2가지 종류 

Community Edition | Enterprise Edition

community Edition 은 공짜이고 Enterprise Edition 은 이미지 관리, 보안 등 여러 서비스들을 유료로 제공해준다.


MAC 도커 설치 2가지 방법

 

1. 도커 툴바를 이용하는 방법

2. 맥 도커 데스크탑을 이용하는 방법(최신)

 

두가지 방법다 Linux kernel 위에 도커를 돌리는 방법으로 작동하지만, 도커 툴바는 오라클 Virtual Box 을 사용하지 않고 Hyper Kit 가상화 기술을 사용한다. 


run 명령어

docker run ngnix

image 로부터 conatiner 를 인스턴스화 시킨다. 만약 image 가 docker host 에 없다면 hub에서 pull 받는다.

 

 

run -tag

docker run [이미지 이름]:4.0

특정한 버전을 받고 싶다면 tag 를 입력해주면된다. 태그를 입력하지 않으면 기본적으로 제일 최신의 버전을 다운받는다. 최신 버전의 정보는 docker hub 에서 조회해볼 수 있다.

 

 

run-STDIN

docker -it [이미지 이름]

input 값을 입력받는 스크립트 파일을 이미지로 만들었을때 컨테이너를 interactive 하게 만드려면 -i (input)과 -t (terminal) 을 넣어 주어야한다. 

 

run - PORT mapping

docker -p 80:8000 [이미지 이름]

웹서버를 컨테이너 안에 담게 되면 컨테이너 포트가 8000이 되기때문에  외부에서 접근하려면 외부포트와 컨테이너 포트를 연결해주어야한다. 외부 포트를 80으로 설정하고 8000번인 컨테이너 포트를 연결하는 명령어.

 

run - Volume mapping

 

MySQL 컨테이너를 운용한다고 했을때 모든 생성,  수정, 삭제 작업은 컨테이너 내에서만 적용된다. 즉, 컨테이너는 고립된 환경이며 컨테이너를 삭제할시 모든데이터도 함께 삭제된다. 만일의 경우를 대비해 로컬에 데이터를 백업하고 싶다면 


ps 명령어

docker ps

현재 인스턴스화 된 모든 컨테이너 리시트를 보여준다. 

docker ps -a

 모든 컨테이너들의 리스트를 보여준다. *프로세스가 끝난 컨테이너들은 모두 여기서 확인할 수 있다. 컨테이너 생명주기는 컨테이너 안의 프로세스와 같다.


inspect

docker inspect [컨테이너 ID]

만약 ps 명령어보다 자세한 명령어를 보고 싶다면 inspect 명령어를 사용하면된다. Json 포멧으로 결과가 출력된다.


logs 명령어

docker logs [컨테이너 ID]

 

해당 컨테이너에대한 로그를 보여주고 싶을때 사용한다.


stop 명령어

docker stop [컨테이너아이디]

인스턴스화된 컨테이너 정지하기

 

rm 명령어

docker rm [컨테이너ID]

컨테이너 삭제


images 명령어

docker images

만들어져 있는 모든 이미지 리스트 보기


rmi 명령어

docker rmi [컨테이너ID]

이미지 삭제, 삭제하기 전에 해당 이미지에 의존하고 있는 컨테이너를 모두 삭제해야한다. 


pull 명령어

docker pull [컨테이너 이름]

 

도커 Hub 에서 바로 pull 받아와서 컨테이너를 사용


exec 명령어

docker exec [컨테이너 ID] cat /etc/hosts

컨테이너 안의 파일을 보고 싶을때 사용한다.


attach & detach 명령어

docker run [컨테이너 ID]

컨테이너를 foreground 에서 실행한다 

docker run -d [컨테이너 ID]

컨테이너를 background에서 실행한다.

docker attach [컨테이너 ID]

컨테이너를 다시 foreground 로 가지고 오고싶을때 사용한다.


 

docker labs 를 통해 브라우져에서 연습할수 있다

kodekloud.com/p/docker-labs

'CONTAINER > docker' 카테고리의 다른 글

도커 파일만들기 nodejs  (0) 2021.05.30
[docker] 가슴이 docker docker...  (0) 2021.02.27

왜 도커가 필요한 것인가?

 

호환성과 의존성문제

1. 만약 여러 기술스택(장고, MySQL, redis 등)을 개발을 진행한다고 가정한다고 했을때 각각의 기술 스택들은 설치되있는 OS의 버전에 대한 호환성과, 의존성 문제를 가진다.

2. 서비스의 기술 스택이 업그레이드 되거나 확장으로 인해 아키텍쳐 구조를 바꿀 상황은 항상 온다. 무엇인가 바뀔때마다 각각의 기술스택의 라이브러리 호환성과 의존성 문제를 체크해주어야 하는데 이런 지옥을 "The Matrix form Hell"이라고 하기도한다. 

3 새로운 개발자가 팀에 들어올때마다 초기세팅을 도와주는것은 정말 번거로운 작업이다. 정확한 버전의 운영체제, 그리고 기술스택을 사용하고 설치하고 있는지 확인하는 작업은 엄청난 고통을 동반한다. dev, test, beta, staging, production 등 여러 환경을 운용하고 있는 조직이라면 운용하고 있는 환경마다 작업을 해주어야한다는 엄청난 부담감이 생길 것이다.

 

이러한 호환성, 의존성 문제때문에 개발에 집중할수 없고 같은 환경을 공유하는데도 많은 이슈들을 겪어야 했다. 이러한 고통들은 도커를 사용한다면 해결이 가능하다. 도커는 각 기술스택들을  분리된 컨테이너에 고립시키고 얽혀있는 호환성과 의존성 문제를 분리 시켜준다. 운영체제가 다르더라도 도커만 설치한다면 대부분의 운영체제 환경에서 호환성, 의존성 문제 없이 어플리케이션을 실행 시킬 수 있다.


컨테이너(Container)란 무엇인가?

컨테이너는 모든 요소들로부터 완전히 독립되고 고립된 환경이다. 각각의 컨테이너는 각자의 process, network, mount를 가지고 있다. 하지만 여기서 중요한점은 OS kernal을 공유한다는 것이다.

 

또한, 컨테이너 개념 도커가 만든것이 아니다! 컨테이너는 이미 10여년 전부터 활용되고 있었고(LX c, LX d 등), 도커는 LX c 컨테이너를 활용하는 tool 이다. 로우-레벨에 위치한 LX c 컨테이너 환경 설정을 보다 쉽게 하기위해 도커는 개발자들에게 쉬운  접근성을 제공해준다. 

 


운영체제(OS: Operating System)

뜬금없이 왠 운영체제? 라고 하겠지만 도커가 어떤 방식으로 운용되는지 알기 위해 기초적인 운영체제 이해가 필요하다. Ubuntu, Fedora, Centos 등 이러한 운영체제는 크게 두가지로 구성되어 있다.

 

1. OS  커널

OS Kernel 은 탑제되어있는 하드웨어와 상호작용을 책임지는 역할을 한다. 

 

2. 소프트웨어 세트

소프트웨어 세트는 User-interface, drivers, compilers, file manager, etc) 이러한 소프트웨어들로 구성되어 있다.

 

OS 커널이 리눅스라고 가정했을때 그 위에 설치된 각기 다른 소프트웨어 세트에 의해서 운영체제의 종류가 결정이된다. 즉, 운영체제들을 Linux kernel을 사용하고 있고 다른점이라곤 그 위에 설치된 소프트웨어 세트일뿐이라는 점이다.

 

그리고, 도커는 Linux kernel을 공유하고 있다!


커널 공유

 

도커가 설치된 ubuntu 운영체제를 사용하고 있다고 가정했을때, Linux kernel을 공유하고 있는 다른 운영체제 환경(Fedora, Centos)에 컨테이너 환경을 배포할 수 있다.

 

중요한 점은 우리가 많이 쓰는  Window는 Linux kernel을 공유하고 있지 않다! (hate window). 이러한 이유 때문에 윈도우 환경에서 설치된 컨테이너는 Linux kernel을 공유하고 있는 OS 위에서 동작하지 않는다. 윈도우에서 도커를 사용하려면 window docker server 가 필요하다.

 

만약 리눅스 환경에서 만들어진 컨테이너를 윈도우에 돌린 경험이 있다면, 그것은 window 가 Linux virtual machine 실행하고 그 위에 리눅스 컨테이너들을 올려 놓은 이유이기 때문이다.

 

 


 

Container VS Virtual Machine

 

Virtual Mahine 은 Hyper-V 위에서 작동하고 각 VM 안에 OS가 설치되어 있다. 이러한 이유때문에 컨테이너보다는 무겁고 용량도 많이 차지하며 자원 소모도 크다는 점이 있다.

 

그렇다고 해서 conatainer 와  vm 중에 무엇을 선택해서 써야한다는 것이 아니다! 각 기술을 다른 목적을 위해 만들어 졌기 때문에 이 두 기술의 특징을 적절이 조합해 사용한다면 분명 응용할 방법이 있을것이다. 공부해보자.

 

virtual Machine - 가상화 기술을 통해  각 운영체제와 커널을 같은 하드웨어위에  운용하는 기술

container - 컨테이너 기술은 어플리케이션을 고립시켜서 어느 환경에서든 쉽게 운용할 수 있게 해주는 기술

 


Images VS Containers

 

Image 는 하나의 템플릿이라고 볼수 있다. 도커파일로 부터 생성되며 컨테이너를 생성하기 위해 사용된다.

Container 는 작동하고 있는 이미지의 인스턴스이다. 각 컨테이너는 독립적인 프로세스 구조와 환경을 가지고 있다.

 

이미 많은 이미지들이 Docker Hub에 존재하고 있기때문에 필요한 이미지를 간단히 Hub으로부터 받아 올수 있다.

도커 파일(Docker File) 도커 이미지를 생성하기 위한 가이드 라인이다.


 

'CONTAINER > docker' 카테고리의 다른 글

도커 파일만들기 nodejs  (0) 2021.05.30
[docker] 실행해보자  (0) 2021.02.28

+ Recent posts