본문 바로가기
Activities/공부

[42Seoul] ft_server 개념 - Docker, Devian, Nginx, MySQL, phpMyAdmin, Wordpress, HTTPS

by 코드포휴먼 2021. 3. 25.

과제 ft_server

과제 ft_server의 목적은 아래 설명과 같이 시스템 관리를 위한 기초적인 기술 습득을 위한 것이다. 요약하자면 Wordpress로 호스팅할 웹사이트를 만들게 된다.

이미지 출처 https://stitchcoding.tistory.com/2

더보기

과제 ft_server 소개

This topic is intended to introduce you to system administration. It will make you aware of the importance of using scripts to automate your tasks. For that, you will discover the "docker" technology and use it to install a complete web server. This server will run multiples services: Wordpress, phpMyAdmin, and a SQL database.

 

 

과제 요구사항

  • You must place all the necessary files for the configuration of your server in a folder called srcs.
  • Your Dockerfile file should be at the root of your repository. It will build your container. You can’t use docker-compose. (※ docker-compose는 container 실행을 간편하게 해주는 것이다.)
  • All the necessary files for your WordPress website should be in the folder srcs.

과제 필수사항

  • You must set up a web server with Nginx, in only one docker container. The container OS must be debian buster.
  • Your web server must be able to run several services at the same time. The services will be a WordPress website, phpMyAdmin and MySQL. You will need to make sure your SQL database works with the WordPress and phpMyAdmin.
  • Your server should be able to use the SSL protocol.
  • You will have to make sure that, depending on the url, your server redirects to the correct website.
  • You will also need to make sure your server is running with an autoindex that must be able to be disabled.

 

과제 지식 정리

Docker

도커는 컨테이너(Container) 기반의 오픈소스 가상화 플랫폼이다.

컨테이너란 가상화 기술 방식 중 하나로 격리된 공간에서 프로세스가 동작하는 기술이다.

더보기

여러 자료를 읽어보고 요약 해보자면, 운영체제 관점에서 봤을 때 Image는 실행파일에, Container는 프로세스와 비슷하다.
혹은 객체지향 관점에서 봤을 때 Image는 클래스에, Container는 인스턴스에 해당할 것 같다.

컨테이너를 싣고 있는 Docker 도커 (사진 출처 도커 공식문서)

 

컨테이너(Container)

도커(Docker)는 '항만 노동자'라는 뜻으로, 항구에 있는 컨테이너들을 관리하는 사람들을 일컫는다.

이름에서 알 수 있듯 도커는 컨테이너를 관리하는 플랫폼이다.

도커를 활용해 컨테이너에 Debian OS, Nginx 웹서버, MySQL, phpMyAdmin, Wordpress를 설치하고 서브젝트 환경을 구축한다.

컨테이너 가상화는 흔히 사용해왔던 호스트형 가상화 방식과 다르다.

 

1. 호스트형 가상화 방식

  • 기존의 가상화 방식은 주로 OS를 가상화한다.
  • VMware나 VirtualBox같은 VM(Virtual Machine)은 Host OS 위에 Guest OS 전체를 가상화하여 사용하는 방식이다.
    (여기서 VM은 컴퓨팅 환경을 소프트웨어로 구현한 것을 말한다.)
  • 즉 Host OS에 가상머신을 설치하고, VM에서 가상 하드디스크 공간을 만들어 OS를 설치하면
    한 개의 운영체제 위에서 또 다른 운영체제를 사용할 수 있다. (Host OS와 독립되어 실행된다.)
  • VM은 필요한 하드웨어 자원들을 가상으로 Guest OS에게 제공하고 모든 처리는 VM이 담당한다.
  • 여러가지 OS를 가상화할 수 있고 비교적 사용법이 간단하지만, 오버헤드가 크며 무겁고 느려서 운영환경에선 사용할 수 없다.

2. 컨테이너 가상화 방식

  • 추가적인 OS를 설치하지 않고 프로세스를 격리하는 방식이다.
    (Host OS위에서 유저 공간을 가상화한다.)
  • 리눅스에서는 이 방식을 리눅스 컨테이너라고 하고 단순히 프로세스를 격리시키기 때문에 가볍고 빠르게 동작한다.
  • CPU나 메모리는 딱 프로세스가 필요한 만큼만 추가로 사용한다.
  • 가상화된 유저 공간(ex. 아래 그림의 App B)을 실행시키기 위한 바이너리, 라이브러리를 묶어 통채로 격리시킨다.
    (OS의 파일시스템까지도 격리 가능하다.)
  • 하나의 서버에 여러 개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행된다.
  • 프로그램은 마치 다른 환경에서 실행되고 있는 것처럼 보이지만, 실제 커널은 한 Host OS를 공유하고 있기 때문에
    시스템 자원의 접근이 용이하고, 일반적인 VM에 비해 속도가 월등히 빠르다.

좌 - 컨테이너 가상화(docker container)  /  우 - 호스트형 가상화(Virtual Machine)

 

 

이미지(Image)

이미지는 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것이다.

도커는 기본적으로 Image가 있어야 Container를 생성하고 동작시킬 수 있다.

  • 상태값을 가지지 않고 변하지 않는다. (Immutable)
  • 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다.
  • 같은 이미지에서 여러 개의 컨테이너를 생성할 수 있다.
  • 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.
  • 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없다.

이미지 출처 https://data-newbie.tistory.com/516

 

레이어(Layer)

도커 Image 레이어 형태로 구성되어 있다.

서브젝트의 웹 서버 이미지는 파일시스템 + 웹 서버 프로그램 + 소스코드 레이어로 이루어진 이미지라고 볼 수 있다. 
레이어 구성을 통해 이미지 일부를 수정해야할 때, 해당 레이어만 업데이트 하면 되기 때문에 오버헤드가 비교적 덜 발생한다.

예를 들어 웹 서버 Image의 경우, 웹 서버 프로그램이 동작할 OS(ex ubnutu, debian..)의 파일 시스템이 하나의 레이어가 되고,
이 파일 시스템 위에서 동작할 웹 서버(ex,, nginx, apache...)가 또 다른 하나의 레이어가 된다.
그리고 사용자에게 보여줄 웹 페이지 소스파일들이 또 하나의 레이어가 될 수 있다.

 

Docker Engine

도커 엔진은 컨테이너를 실행, 중지 및 이미지 빌드 등 전반적인 실행에 관여하는 도구이다.
일반적으로 도커라고 하면 이 도커 엔진을 일컫는 경우가 많으며 실제로 내가 설치할 프로그램은 도커 엔진이다.

 

Docker Hub

GitHub를 알고 있다면 이해가 쉽다.

Docker Hub 사용자가 만든 큰 용량의 Image를 무료로 쉽게 저장하고 관리해주는 서비스다. 

Docker hub에서 공개된 이미지를 다운받아 사용하거나, Docker Registry 저장소를 직접 만들어 관리한다.

public 이미지이므로 저장소에 push할 경우, 다른 사람들도 도커 Image를 받아서 사용할 수 있다.

private 이미지로는 하나만 업로드 가능하다대신 개인 서버가 있는 경우 도커 레지스트리 서버를 구성해서 전용 도커 허브를 만들 수 있다.

현재 공개된 도커 이미지는 50만 개가 넘고 Docker Hub의 이미지 다운로드 수는 80억 회에 이른다고 한다.

누구나 쉽게 이미지를 만들고 배포할 수 있다.

이미지 출처 https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

 

Dockerfile

도커파일은 Image를 생성(빌드)하는 단계를 모두 기록한 스크립트다. (마치 하나의 요리 레시피와 같다.)

패키지, 소스코드, 명령어, 환경변수 설정 등을 기록한 파일스크립트를 실행시키면 Image가 만들어진다. 

Image를 단순생성만 하고 사용해도 무방하지만, 도커파일로 작성해 실행한다면 아래의 장점들을 획득할 수 있다.

이때 빌드에서 제외할 파일들은 .dockerignore 파일에 명시해서 빌드에 포함되지 않도록 제외할 수 있다. (.gitignore 파일과 비슷하다)

 

[Dockerfile 작성의 장점]

  • 이미지 생성을 기록한다.
    • 어떤 과정으로 생성되었는지 알아야 수정, 관리가 용이하다.
  • 배포 자동화가 가능해진다.
    • 이미지를 배포할때, 이미지 자체를 배포하면 용량이 크다.
    • Dockerfile을 배포하면 용량도 적고 편리하다. (사용자는 Dockerfile을 실행만 시키면 된다.)

[Dockerfile 작성 시 주의 사항]

  • 파일명이 Dockerfile 이다. -> 첫글자 대문자 주의
  • 자동화한다는 점에서 bash 스크립트 파일과 유사하지만 근본적으로는 다르다.
  • Dockerfile은 도커 명령어를 순서에 따라 빌드한다.
  • Dockerfile은 스텝마다 layer를 생성한다. (이미지가 계층적으로 쌓이며 생성된다.)
  • Build 하고 나면 Run 하여 작성한 파일이 의도대로 잘 실행되었는지 확인한다.
    (이 과정을 bash스크립트 파일로 만들어 자동화할 수 있다. -> CMD 커맨드 사용)

Dockerfile의 기본 구조는 “명령어 인자”의 형식으로 이루어져 있고, 이런 명령들이 순서대로 나열되어 있다. 

이 때 각 명령어는 위에서부터 순서대로 실행되고, 각각의 명령어들이 독립적으로 실행되서 다음에 실행되는 명령어에 영향을 미치지 않는다.

파일 내에서 주석을 선언하기 위해서는 #을 사용하면 된다. 그러면 # 뒤에 나오는 구문은 주석으로 인식되서 빌드할때 영향을 미치지 않게 된다.

명령어는 대소문자를 구분하지는 않지만 가독성 때문에 가급적 대문자를 사용하는 것이 권장되고 있다.

파일 예시는 아래와 같다.

# a basis of image
FROM	debian:buster

# label
LABEL	maintainer="taeekim@student.42seoul.kr"

# update & install
RUN apt-get update && apt-get install -y \
	nginx \
	mariadb-server \
	php7.3-fpm \
    php-mysql \
    php-mbstring \
	openssl \
	vim \
	wget

# copy content
COPY	./srcs/run.sh ./
COPY	./srcs/default ./tmp
COPY	./srcs/wp-config.php ./tmp
COPY	./srcs/config.inc.php ./tmp

# port
EXPOSE	80 443

CMD 	bash run.sh

 

Devian

데비안은 Unix 계열 운영체제로, 커널에 따라 여러종류가 있다. 

그 중에 정식판이 존재하는 것은 리눅스 커널에 기반한 데비안 GNU/Linux 뿐이다.

배포되고 있는 리눅스 중 서버의 안정성과 보안이 좋은 운영체제이며, 포함하고 있는 패키지도 많다.

패키지 설치와 업그레이드 혹은 다른 패키지의 의존성 등을 apt를 이용하여 쉽게 설정할 수 있다.

그에 따라 서버에 알맞은 리눅스가 된다.

사진 출처 https://idchowto.com/?p=11690

 

Devian buster

buster는 Devian 최신 버전 10.0의 코드명으로서, 현재 안정 배포판(공식 데비안 배포판)에 해당한다.

Devian의 모든 코드명은 영화 토이스토리의 캐릭터명으로 지어졌다.

Devian 배포 역사 (출처 위키피디아)

 

buster는 아래 사진의 강아지라고 한다.

사진 출처 https://twitter.com/moviepollz/status/1066643993881075712?s=20

 

 

Nginx

무료로 제공되는 오픈소스 웹 서버다.

규모가 작은 서비스이면서 정적 데이터 처리가 많은 서비스에 적합하다.

 

웹서버

웹서버(Web Server)는 HTTP를 통해 클라이언트로 부터 요청이 발생했을 때 요청에 맞는 정적콘텐츠을 보내주는 역할을 한다.

주로 그림, CSS, 자바스크립트를 포함한 웹 페이지(HTML 문서)가 클라이언트로 전달된다.
주된 기능은 콘텐츠를 제공하는 것이지만 클라이언트로부터 콘텐츠를 전달 받는 것도 웹 서버의 기능에 속한다.

이러한 기능은 파일 업로드를 포함하여 클라이언트에서 제출한 웹 폼을 수신하기 위해 사용된다.

더보기
  1. 커넥션을 맺는다. (클라이언트의 접속을 받아들이거나, 원치 않는 클라이언트라면 닫는다.)
  2. 요청을 받는다. (HTTP 요청 메세지를 네트워크로부터 읽어들인다.)
  3. 요청을 처리한다. (요청 메세지를 해석하고 행동을 취한다.)
  4. 리소스에 접근한다. (메세지에서 지정한 리소스에 접근한다.)
  5. 응답을 만든다. (올바른 헤더를 포함한 HTTP 응답 메세지를 생성한다.)
  6. 응답을 보낸다. (응답을 클라이언트에게 돌려준다.)
  7. 트랜잭션을 로그로 남긴다. (로그파일에 트랜잭션 완료에 대한 기록을 남긴다.)

 

Proxy

Nginx는 일반적인 HTTP의 웹서버의 역할 외에도 proxy, reverse proxy(대리 프록시) 서버의 역할 또한 가능하다.

웹 proxy 서버는 클라이언트와 서버 사이에서 트랜잭션을 수행하는 중개인이며, 같은 프로토콜을 사용하는 둘 이상의 애플리케이션을 연결한다.

proxy 서버는 보안을 개선하고, 성능을 높여주며, 비용을 절약한다. 

더보기


reverse proxy는 웹서버인 것처럼 위장해 클라이언트의 요청을 받지만 웹서버와는 달리 요청 받은 콘텐츠의 위치를 찾아내기 위해 다른 서버와 커뮤니케이션을 시작한다. reverse proxy는 공용 콘텐츠에 대한 느린 웹 서버의 성능을 개선하기 위해 사용될 수 있다. 이런 식으로 사용되는 reverse proxy를 흔히 서버 가속기라고 부른다.

 

MySQL & MariaDB

MySQL은 RDBMS(Relational DataBase Management System, 관계형 데이터베이스 시스템) 중 가장 많이 쓰이는 소프트웨어다.

현재 MySQL은 오라클이 소유하고 있는데, MySQL의 창업자 몬티 와이드니어스는 회사의 방침에 대한 불만을 품고 회사를 나왔다.

"오라클 인수 후 MySQL은 발전하지 않았습니다.
오라클은 ‘MySQL을 어떻게 하면 자신들의 소유로 할 수 있을까’만 고민했고, 그래서 회사를 나왔습니다."

회사를 나온 그는 MariaDB 개발을 시작했다.
MariaDB는 MySQL과 같은 소스코드를 사용하므로 사용방법(5.5까지)과 구조, 명령어가 MySQL과 동일하다.
근본적인 차이점은 MariaDB는 GPL v2 라이선스를 따르는 순수한 오픈소스 프로젝트이기에 오라클로부터 자유롭다.
마리아DB의 모든 코드는 GPL, LGPL, LPGL, BSD의 라이선스로 만들어져 있어, 누구나 필요로 하면 커뮤니티를 통해 마리아DB를 내려받아 쓸 수 있다.

Linux에서는 이러한 완전한 호환성으로 인해 MySQL과 구별하기 위해 MariaDB를 mysqld mysql.server는 mysqld_safef로 각 각 대응되어 사용되도록 표현하기도 한다.

 

phpMyAdmin

MySQL, MariaDB 모두 GUI 관리툴이 필요할 경우 따로 설치하여 사용해야 한다. 이번 과제에서는 그 중 phpMyAdmin을 사용한다.

phpMyAdmin은 MySQL을 웹 상에서 관리할 목적으로 php로 작성한 오픈 소스 gui 도구, 즉 MySQL Client 툴이다.
데이터베이스, 테이블, 필드, 열의 작성, 수정, 삭제, SQL 상태 실행, 사용자 및 사용 권한 관리 등의 다양한 작업을 웹 상에서 편리하게 수행할 수 있다.

 

php-fpm (PHP FastCGI Process Manager)

CGI(Common Gateway Interface, 공통 게이트웨이 인터페이스)

CGI는 웹서버 상에서 사용자 프로그램 동작에 있어서, 클라이언트의 요구에 따른 정보를 동적으로 생성하고 송신하기 위한 조합이다.

Nginx는 웹서버이기 때문에 정적 콘텐츠밖에 다루지 못한다.

동적 페이지를 구현하기 위해서는 웹서버 대신 동적 콘텐츠를 읽은 뒤 html로 변환시켜 웹서버에게 다시 전달해주는 외부 프로그램(php 모듈)이 필요하다.

이런 연결 과정의 방법 혹은 규약을 정의한 것이 CGI이다.

 

php-fpm(PHP FastCGI Process Manager)

일반 CGI 보다 빠른 처리가 가능한 FastCGI다.

php-fpm을 통해 Nginxphp를 연동시켜 웹서버가 정적 콘텐츠 뿐만 아니라 동적 콘텐츠를 다룰 수 있도록 만드는 것이다.

 

Wordpress

워드프레스는 세계적으로 사랑받고 있는 CMS다. CMS란 말 그대로 콘텐츠를 관리하는 시스템이다.

웹사이트를 만들 때 코드를 직접 작성할 수도 있지만, CMS를 이용하면 웹사이트의 다양한 리소스 및 콘텐츠, 데이터를 쉽게 관리할 수 있다.

 

HTTPS 와 SSL 인증서 발급

SSL

SSL은 인터넷 상에서 데이터를 안전하게 전송하기 위한 인터넷 프로토콜이다.

  • 인터넷 사용자들에게 안전한 개인 정보를 교환하기 위한 표준 프로토콜로 인정되어 많은 온라인 상거래 등에 사용되고 있다.
  • 암호화 기법들을 사용해 세계 각국에서 사용되는 대부분의 암호화 기법을 지원할 수 있다.
  • SSL은 크게 3가지 기능들을 제공함으로 공개되어 있는 인터넷 상에서 일어나는 트랜잭션의 기밀성을 보장한다.
     Site authentication : 유저가 선택한 상대편 웹사이트를 인증한다
     Data privacy : 전달되는 데이터가 도중에 누군가에 의해 판독되지 않는다는 것을 보장한다. SSL은 다양한 암호화 알고리즘을 사용하여 인터넷을 통해 전송되는 개인의 사적인 정보를 외부로부터 불법적인 판독을 막는다.
     Data integrity : 사용자의 브라우저로부터 상대방 웹서버까지 전달되는 동안 데이터가 도중에 누군가에 의해 변경되지 않도록 보장한다.

 

HTTPS와 SSL 인증서

HTTPS는 HTTP의 평문 전송 대신, SSL 상에서 암호화된 통신을 하는 프로토콜이다.

HTTPS를 통신을 서버에서 구현하기 위해서는 신뢰할 수 있는 상위 기업(CA, Certificate authority)이 발급한 인증서가 필요하다.

HTTPS용 인증서는 "내가 이 도메인의 정당한 소유주다"라는 것을 인증하기 위해 공인 기관으로부터 확인을 받는 과정이 있다.

이것을 생략하면 브라우저는 서버를 신뢰할 수 없다는 메시지를 띄운다.

 

[CSR을 만들어 CA에 요청하여 발급받는 방법]

  • 유료
  • 무료 (ex. Letsencrypt)

CA 인증서와 달리 self-signed SSL 인증서는 자체적으로 발급받은 인증서이며, 로그인 및 기타 개인 계정 인증 정보를 암호화한다.

주로 로컬서버에서 테스트용으로 self-signed SSL 인증서를 많이 사용하며, 서브젝트에서도 self-signed SSL 인증서를 발급한다.

self-signed SSL 인증서를 만드는 방법은 몇 가지가 있는데, 무료 오픈소스인 openssl 을 이용해 쉽게 만들 수 있다.

openssl은 HTTPS를 위해 필요한 개인키(.key), 서면요청파일(.csr), 인증서파일(.crt)을 발급해준다

 

[self-signed SSL 인증서 발급 방법]

  • CSR(Certificate Signing Request) 명시적 생성 -> 인증서에 self-sign -> 인증서 완성
  • CSR을 명시적으로 생성하지 않고, key와 부가정보들을 입력하여 직접 self-sign -> 인증서 완성

나의 경우 후자의 방법을 사용했다.

 

실제 다운로드 및 실행 부분 부터는 다음 포스트에 분리해서 정리했다.


 

출처

Docker

도커 공식문서 www.docker.com/resources/what-container

블로그 서비큐라 subicura.com/2017/01/19/docker-guide-for-beginners-2.html

42Seoul yeosong님 블로그 yeosong1.github.io/%EB%8F%84%EC%BB%A4-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%AA%A8%EC%9D%8C

42Seoul hyeykim님의 자료정리 pdf

Velog hidaehyunlee velog.io/@hidaehyunlee/ftserver-%EC%84%A0%ED%96%89%EC%A7%80%EC%8B%9D-Docker-Debian-Buster-Nginx-

 

Dockerfile

도커 공식문서 docs.docker.com/develop/develop-images/dockerfile_best-practices/

velog velog.io/@ckstn0777/%EB%8F%84%EC%BB%A4%ED%8C%8C%EC%9D%BCDockerfile

티스토리 humonnom humonnom.tistory.com/entry/ftserver-%EB%8F%84%EC%BB%A4%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C?category=910757

 

Debian

위키피디아 ko.wikipedia.org/wiki/%EB%8D%B0%EB%B9%84%EC%95%88

debian 공식문서 www.debian.org/releases/index.ko.html

 

MySQL, MariaDB

위키피디아 ko.wikipedia.org/wiki/MySQL

위키피디아 ko.wikipedia.org/wiki/MariaDB

 

CGI, php-fpm

위키피디아 ko.wikipedia.org/wiki/%EA%B3%B5%EC%9A%A9_%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4_%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4

 

웹서버

위키피디아 ko.wikipedia.org/wiki/%EC%9B%B9_%EC%84%9C%EB%B2%84

 

SSL 인증서 발급

로스카츠의 AI 머신러닝 losskatsu.github.io/it-infra/ssl-auth/#ssl-%EC%9E%91%EB%8F%99-%EA%B3%BC%EC%A0%95

 

댓글