ft_server 는 시스템 관리 개념을 소개하기 위한 과제이다. 스크립트를 이용해 업무를 자동화하는 것의 중요성을 깨닫게 될 것이다. 이를 위해
Docker
기술을 학습하고 완전한 웹 서버를 설치해본다.
Ngnix
웹 서버를 설치해야 한다.Debian Buster
여야 한다.Wordpress
웹사이트phpMyAdmin
MySQL
: SQL 데이터베이스는 phpMyAdmin과 워드프레스에서 연동하여 사용이 가능해야 한다.SSL 프로토콜
을 사용해야 한다.URL redirection
을 처리해야 한다.autoindex
가 적용되어야 한다.아래 이미지(출처)대로 ft_server 과제를 구현하면 된다. 맨 아래부터 하나씩 개념 공부를 해보자.
도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.
기존의 가상화 방식(VM)은 주로 OS를 가상화하였지만, 컨테이너는 하드웨어를 분리하지 않고 하나의 머신 위에서 동작하며 OS 커널도 공유한다. geust OS를 통해 OS를 복제할 필요가 없어 더 효율적인 관리가 가능한 것이다.
성능에 대한 감이 잘 안잡혀 찾아보니, 하나의 VM도 버거운 노트북에서 수십 개의 컨테이너를 실행시킬 수 있을 정도라고 한다.
도커 이미지의 용량은 보통 수백 메가로 수 기가가 넘는 경우도 흔하다. 이렇게 큰 용량의 이미지를 서버에 저장하고 관리하는 것은 쉽지 않은데 도커는 Docker hub를 통해 공개 이미지를 무료로 관리해 줍니다.
Docker hub에서 공개된 이미지를 다운받아 사용하거나, Docker Registry 저장소를 직접 만들어 관리할 수 있다.
현재 공개된 도커 이미지는 50만개가 넘고 Docker hub의 이미지 다운로드 수는 80억회에 이른다고 한다. 누구나 쉽게 이미지를 만들고 배포할 수 있습니다. 이 모든게 무료.
도커는 기본적으로 이미지가 있어야 컨테이너를 생성하고 동작시킬 수 있다. dockerfile
은 필요한 패키지를 설치하고 동작하기 위한 자신만의 설정을 담은 파일이고, 이 파일로 이미지를 생성(빌드)한다. (Makefile과 비슷)
dockerfile
은 도커 명령어를 순서에 따라 빌드하며, dockerfile
을 빌드할 때(이미지 파일로 변환 시킬 때)는 layer 구조를 보인다. 이미지가 계층적으로 하나씩 쌓이면서 생성되는 것이다.
FROM debian:buster
LABEL maintainer="daelee@student.42seoul.kr"
RUN apt-get update && apt-get install -y \
nginx \
mariadb-server \
php-mysql \
php-mbstring \
openssl \
vim \
wget \
php7.3-fpm
COPY ./srcs/run.sh ./
COPY ./srcs/default ./tmp
COPY ./srcs/wp-config.php ./tmp
COPY ./srcs/config.inc.php ./tmp
EXPOSE 80 443
CMD bash run.sh
debian:buster
로 설정.이미지에 메타데이터를 추가한다.
아래 명령어로 이미지의 메타데이터를 확인할 수 있다.
docker image inspect --format="{{ .Config.Lables }}" [이미지명]
\
)를 사용하여 다음 줄에 RUN 명령을 계속할 수 있다.apt-get update
와 apt-get install
는 같은 RUN 실행줄에서 동시에 실행해 캐싱 문제를 방지. (같은 결과를 가져오더라도 RUN을 여러줄로 작성하면 image layer가 여러개 생성되고, RUN을 한줄로 작성하면 image layer가 하나 생성된다.)해당 컨테이너가 런타임에 지정된 네트워크 포트에서 수신 대기중 이라는것을 알려준다.
일반적으로 dockerfile을 작성하는 사람과 컨테이너를 직접 실행할 사람 사이에서 공개할 포트를 알려주기 위해 문서 유형으로 작성할 때 사용한다.
이 명령 자체가 작성된 포트를 실행하여 listening 상태로 올려주거나 하지는 않기 때문에, 실제로 포트를 열기 위해선 container run 에서 -p 옵션을 사용해야 한다.
docker run -p 80:80/tcp -p 80:80/udp ...
프로토콜을 지정하지 않으면 기본값은 TCP.
데비안
은 우분투 같은 리눅스 OS 종류 중에 하나다. 우분투처럼 APT를 패키지 및 소프트웨어 관리자로 사용하고 있다. 사실 우분투는 데비안에서 나온 운영체제이며, 우분투에서 볼 수 있는 대부분의 핵심 유틸리티는 데비안에서 나왔다.
데비안은 안정성을 매우 중시하는 리눅스 배포판이다. 때문에 안정성을 가장 큰 가치로 두어야 할 서버 쪽에서 상당한 인기를 끌고 있다.
2019년 7월 6일 배포된 최신 안정 버전은 10.0(Buster) 이다.
엔진엑스
는 무료로 제공되는 오픈소스 웹 서버 프로그램이다. 간단하게 웹 서버는 클라이언트로 부터 요청이 발생했을 때 요청에 맞는 정적콘텐츠을 보내주는 역할을 한다. Nginx
는 규모가 작은 서비스이면서 정적 데이터 처리가 많은 서비스에 적합하다고 한다.
![image-20200925160255258](/Users/daelee/Library/Application Support/typora-user-images/image-20200925160255258.png)
Nginx는 일반적인 HTTP의 웹서버의 역할 외에도 proxy, reverse proxy(대리 프락시) 서버의 역할 또한 가능하다.
웹 프락시 서버는 클라이언트와 서버 사이에서 트랜잭션을 수행하는 중개인이며, 같은 프로토콜을 사용하는 둘 이상의 애플리케이션을 연결한다.
프락시는 보안을 개선하고, 성능을 높여주며, 비용을 절약한다. 그리고 프락시 서버는 모든 HTTP 트래픽을 감시하고 수정할 수 있다. 프락시는 아래와 같은 일을 한다.
대리 프락시는 웹 서버인 것처럼 위장해 클라이언트의 요청을 받지만 웹 서버와는 달리 요청 받은 콘텐츠의 위치를 찾아내기 위해 다른 서버와 커뮤니케이션을 시작한다. 대리 프락시는 공용 콘텐츠에 대한 느린 웹 서버의 성능을 개선하기 위해 사용될 수 있다. 이런 식으로 사용되는 대리 프락시를 흔히 서버 가속기라고 부른다.
php를 기반으로 생성된 mySQL의 GUI로서 웹에서 실행할 수 있는 프로그램이다.
대표적인 서버 사이드 스크립트 언어.
nginx는 웹서버이기 때문에 정적 콘텐츠밖에 다루지 못한다. 동적 페이지를 구현하기 위해서는 웹 서버 대신 동적 콘텐츠를 읽은 뒤 html로 변환시켜 웹 서버에게 다시 전달해주는 외부 프로그램(php 모듈)이 필요하다. 이런 연결 과정의 방법 혹은 규약을 정의한 것이 CGI이다.
일반 GCI 보다 빠른 처리가 가능한 FastGCI. 정리하자면,
php-fpm
을 통해 nginx와 php를 연동시켜 우리의 웹 서버가 정적 콘텐츠 뿐만 아니라 동적 콘텐츠를 다룰 수 있도록 만드는 것이다.
HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)는 SSL
위에서 돌아가는 HTTP의 평문 전송 대신에 암호화된 통신을 하는 프로토콜이다.
이런 HTTPS를 통신을 서버에서 구현하기 위해서는 신뢰할 수 있는 상위 기업이 발급한 인증서가 필요로 한데 이런 발급 기관을 CA(Certificate authority)라고 한다. CA의 인증서를 발급받는것은 당연 무료가 아니다.
self-signed SSL 인증서는 자체적으로 발급받은 인증서이며, 로그인 및 기타 개인 계정 인증 정보를 암호화한다. 당연히 브라우저는 신뢰할 수 없다고 판단해 접속시 보안 경고가 발생한다.
self-signed SSL 인증서를 만드는 방법은 몇 가지가 있는데, 무료 오픈소스인 openssl
을 이용해 쉽게 만들수 있다.
개인키(.key)
, 서면요청파일(.csr)
, 인증서파일(.crt)
을 openssl이 발급해준다.autoindex 가 뭔지 알고싶다면 먼저 웹서버가 리소스 매핑과 접근을 어떻게 하는지 부터 알아야한다.
웹 서버는 어떻게 수 많은 리소스 중 요청에 알맞은 콘텐츠를 제공할까?
일반적으로 웹 서버 파일 시스템의 특별한 한 폴더를 웹 콘텐츠를 위해 사용한다. 이 폴더를
문서루트
혹은docroot
라고 부른다. 리소스 매핑의 가장 단순한 형태는 요청 URI를dotroot
안에 있는 파일의 이름으로 사용하는 것이다.만약 파일이 아닌 디렉토리를 가리키는 url에 대한 요청을 받았을 때는, 요청한 url에 대응되는 디렉토리 안에서
index.html
혹은index.htm
으로 이름 붙은 파일을 찾아 그 파일의 콘텐츠를 반환한다. 이를 autoindex 라고 부른다.
그래서 우리는 autoindex 기능을 켜줘야한다. nginx default 파일에서 location / 부분에 autoindex on
을 추가한다.
# etc/nginx/sites-available/default
# Autoindex
index index.html index.htm index.php #index.ngiinx-debian.html;
server_name ft_server;
location / {
# autoindex on 추가
autoindex on;
try_files $uri $uri/ =404;
}
만약 autoindex가 꺼져 있거나 해당 디렉토리에 index 목록에 해당하는 파일이 없다면, 웹 서버는 자동으로 그 디렉토리의 파일들을 크기
, 변경일
, 해당 파일에 대한 링크
와 함께 열거한 HTML 파일을 반환한다.
루트 디렉터리인 /var/www/html 에 존재하는 index.ngiinx-debian.html 을 주석처리해보면, 읽을 파일이 없다고 생각하고 아래처럼 전체 파일 목록을 반환하는 것을 확인할 수 있다.