ft_server

DaewoongJeon·2020년 12월 31일
1

42seoul Subject

목록 보기
1/8

1. Subject 목표

  1. Docker container를 활용하여 Nginx웹서버를 만들자. 활용 OS는 debian:buster
  2. 구축된 웹서버에서 몇가지 서비스들이 동시에 제공되어야 하는데, 서비스들은 WordpressphpMyAdmin이다. 해당 서비스들은 SQL database를 사용해야 한다.
  3. 구축된 웹서버에 SSL protocol이 적용되어야 한다.
  4. https로의 redirection기능이 추가되어야 한다.
  5. autoindex 가 추가되어야 한다.

2. 학습 방향

  1. 기본적으로 42wiki와 daelee님의 velog를 참고하여 과제의 방향을 잡음.
  2. 과제에서 핵심이 되는 개념(Docker, Debian, Nginx, SSL, php-fpm, phpMyAdmin, Wordpress, MySQL) 정리.
  3. 과제 수행에 필요한 명령어들을 Dockerfile과 src파일들에 나눠서 작성하기.

3. 핵심 개념

1) Docker

Docker는 Linux 기반의 Container RunTime 오픈소스이다. Virtual Machine과 상당히 유사한 기능을 가지면서, Virtual Machine보다 훨씬 가벼운 형태로 배포가 가능하다.

출처: https://bcho.tistory.com/805 [조대협의 블로그]

VM(Virtual Machine)과 Docker의 차이

VM
Docker

  • VM : Host OS가 깔리고, 그 위에 Hypervisor (VMWare,KVM,Xen etc)가 깔린 후에, 그위에, Virtual Machine이 만들어진다. Virtual Machine은 일종의 x86 하드웨어를 가상화 한 것이라고 보면된다. 그래서 VM위에 다양한 종류의 Linux나, Windows등의 OS를 설치할 수 있다.

  • Docker : Docker는 VM처럼 Hardware를 가상화 해주는 것이 아니라, Guest OS (Container)를 Isolation해준다.무슨 말인가 하면, Container의 OS는 기본적으로 Linux OS만 지원하는데, Container 자체에는 Kernel등의 OS 이미지가 들어가 있지 않다. Kernel은 Host OS를 그대로 사용하되, Host OS와 Container의 OS의 다른 부분만 Container 내에 같이 Packing된다.

Repository 연계

: 다음으로 Docker의 특징중의 하나는 repository 연계이다.Container Image를 중앙의 Repository에 저장했다가, 다른 환경에서 가져다가 사용할 수 있다. 마치 git와 같은 VCS (Version Control System)과 같은 개념인데, 이를 통해서 Application들을 Container로 패키징해서 다른 환경으로 쉽게 옮길 수 있다는 이야기다.

Dockerfile

: Docker의 Container Image를 packing하기 위해서, Docker는 Base Image와 Docker file이라는 두가지 컨셉을 이용한다. 쉽게 설명하면, Base Image는 기본적인 인스톨 이미지, Docker file은 기본적인 인스톨 이미지와 그 위에 추가로 설치되는 스크립트를 정의한다.

예를 들어 Base Image가 Ubuntu OS 이미지라면, Docker File은 Ubuntu OS + Apache, MySQL을 인스톨하는 스크립트라고 보면 된다.

2) Debian OS

특징

: 데비안의 특징은 패키지 설치 및 업그레이드의 단순함에 있다. 일단 인스톨을 한 후 패키지 매니저인 APT 업데이트 방식을 이용하면 소프트웨어의 설치나 업데이트에서 다른 패키지와의 의존성 확인, 보안관련 업데이트 등을 자동으로 설정 및 설치해준다. 주로 서버를 목적으로 사용한다.

장점

: 배포되고있는 리눅스OS 중 서버의 안정성이 높고, 포함하고 있는 패키지도 많음.

3) Nginx

Nginx는 Igor Sysoev라는 러시아 개발자가 개발한 동시접속 처리에 특화된 웹 서버 프로그램이다. Apache보다 동작이 단순하고, 전달자 역할만 하기 때문에 동시접속 처리에 특화되어 있다.

출처: https://whatisthenext.tistory.com/123

웹서버의 역할

  • 정적 파일을 처리하는 HTTP 서버로서의 역할
    http서버
    : 웹서버의 역할은 HTML, CSS, Javascript, 이미지와 같은 정보를 웹 브라우저(Chrome, Iexplore, Opera, Firefox 등)에 전송하는 역할을 한다. (HTTP 프로토콜을 준수)

  • 응용프로그램 서버에 요청을 보내는 리버스 프록시로서의 역할
    리버스프록시
    : 한마디로 말하면 클라이언트는 가짜 서버에 요청(request)하면, 프록시 서버가 배후 서버(reverse server)로부터 데이터를 가져오는 역할을 한다. 여기서 프록시 서버가 Nginx, 리버스 서버가 응용프로그램 서버를 의미한다. 결론, 프록시 서버는 요청을 배분하는 역할을 한다.

출처: https://whatisthenext.tistory.com/123

Apache와 Nginx의 차이

  • Apache의 동작 방식
    : Apache는 Client에서 요청을 받으면 MPM (Multi Processing Module : 다중처리모듈) 이라는 방식으로 처리를 하는데 대표적으로는 Prefork와 Worker방식이 있다.

    a. Prefork MPM
    prefork
    : 실행중인 프로세스가 복제되어 처리된다. 각 프로세스는 한번에 한 연결만 처리하고 요청량이 많아질수록 프로세스는 증가하지만 복제시 메모리영역까지 복제되어 동작하므로 프로세스간 메모리 공유가 없어 안정적이라 볼수 있다.

    b. Worker MPM
    Worker
    : Prefork 동작방식이 1개의 프로세스가 1개의 스레드로 처리가 되었다면 Worker 동작방식은 1개의 프로세스가 각각 여러 쓰레드를 사용하게 된다. 쓰레드간의 메모리를 공유하며 PreFork방식보다 메모리를 덜 사용하는 장점이 있다.

    출처: https://taetaetae.github.io/2018/06/27/apache-vs-nginx/#top
    스레드와 프로세스: https://m.blog.naver.com/crom77x/50046897200

  • Nginx의 동작 방식
    : Nginx는 요청이 들어오면 어떤 동작을 해야하는지만 알려주고 다른요청을 처리하는 방식인 Event Driven방식으로 동작한다. 프로세스를 fork하거나 쓰레드를 사용하는 아파치와는 달리 CPU와 관계없이 모든 IO들을 전부 Event Listener로 미루기 때문에 흐름이 끊기지 않고 응답이 빠르게 진행이 되어 1개의 프로세스로 더 빠른 작업이 가능하게 될수 있다. 이때문에 메모리적인 측면에서 Nginx가 System Resource를 적게 처리한다는 장점이 있다고 한다.

    출처: https://whatisthenext.tistory.com/123
    Event-Driven: https://blog.naver.com/jhc9639/221108496101

  • 기타 다른 차이
    - Apache는 과거 Java Servlet이 대중적이지 않을 당시에 웹 기반 어플리케이션을 만들수 있는 거의 유일한 대안이었다.바로 CGI를 이용하는 것인데, 이때는 많은 웹 서비스들이 C나 Perl로 만들어져 있는 CGI를 이용해서 서비스를 제공했다.( 초장기 Naver의 서비스도 거의 모두 C나 Perl로 만들어진 CGI를 통해서 서비스를 제공했다.) 이러다 보니 processe-base(fork 방식)로 개발할 수 밖에 없었고, 상대적으로 NginX는 웹 어플리케이션을 서비스하기 위한 목적보다 Http Proxy의 목적으로 개발되었기 때문에 event-base(비동기 방식의 요청 전달)방식으로 개발되어 동시 사용자에 대한 처리 능력이 더 좋을 수 있게 된것 같다. 실제로 Nginx는 FCGI, SCGI 기능은 제공하지만 CGI나 ISAPI는 제공하지 않는다.

출처: https://knot.tistory.com/88 [용이의 블로그]
Nginx와 Apache 튜닝 포인트 비교: https://duksoo.tistory.com/entry/Nginx와-Apache-튜닝-포인트-비교

4) SSL protocol

SSL(Secure Socket Layer)이란 보안 소켓 계층을 이르는 것으로, 인터넷 상에서 데이터를 안전하게 전송하기 위한 인터넷 암호화 통신 프로토콜 (HTTPS = HTTP + SSL)

출처: https://m.blog.naver.com/xcripts/70122755291
http: https://ko.wikipedia.org/wiki/HTTP

SSL 통신 절차

1) 클라이언트가 서버에 접속하면 서버인증서(서버의 공개키를 인증기관이 전자서명으로 인증한 것)를 전송받는다. (이때, 클라이언트 인증을 필요로 할 경우 클라이언트의 인증서를 전송)

2) 클라이언트는 받은 서버 인증서를 분석하여 신뢰할 수 있는 인증서인지를 검토한 후, 서버의 공개키를 추출.

3) 클라이언트가 세션키로 사용할 임의의 메세지를 서버의 공개키로 암호화하여 서버에 전송.

4) 서버에서는 자신의 개인키로 세션키를 복호화하여 그 키를 사용하여 대칭키 암호방식으로 메시지를 암호화하여 클라이언트와 통신.(https://)

SSL인증서: https://opentutorials.org/course/228/4894

5) php-fpm

php-fpm은 로그인이나 게시글 등록을 할 때마다 변하는 동적인 페이지를 구현하기 위해 필요한 CGI이다. PHP FastCGI Process Manager(php-fpm)는 FastCGI는 위에서 말한 CGI보다좀더 빠른 버전이라고 할 수 있다. FastCGI은 요청할때마다 새로운 프로세스 생성하는 것이 아니라 이미 생성한 프로세스를 재활용하는 방법을 사용하기때문에 처리가 빠르다는 장점이 있다.

출처: https://conory.com/blog/42956

6) phpMyAdmin

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

7) MySQL

MySQL은 오픈 소스의 관계형 데이터베이스 관리 시스템(RDBMS)이다.다중 스레드, 다중 사용자 형식의 구조질의어 형식의 데이터베이스 관리 시스템으로서 오라클이 관리 및 지원하고 있으며, Qt처럼 이중 라이선스가 적용된다.

데이터베이스를 관리하거나 자료를 관리하기 위한 GUI 관리툴은 내장되어 있지 않다. 따라서 이용자들은 명령 줄 인터페이스 도구들을 이용하거나 또는 데이터베이스를 만들고, 관리하고, 데이터를 백업하는데, 상태를 검사하고, 데이터베이스 구조를 생성하는데, 또는 데이터 레코더를 작성하는데 있어서 MySQL 프론트엔드 데스크톱 소프트웨어나 웹 애플리케이션을 사용해야 한다.

8) Wordpress

워드프레스(WordPress)는 세계 최대의 오픈 소스 블로그 소프트웨어이다. 테마를 설치해 자유롭게 전환할 수 있고, 테마 안의 PHP와 HTML 코드는 좀 더 세분화된 맞춤 페이지를 위해 편집할 수 있다. 사용자와 개발자는 리치 플러그인 아키텍처를 통해 기능을 확장할 수 있다. 수많은 써드파티 테마와 플러그인 제작자들에의해 제공되는 무료, 유료 플러그인을 설치해 사이트 디자인을 바꾸고 기능을 확장시키는 것이 큰 장점이다.

출처: https://namu.wiki/w/%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4

4. 과제 수행 과정

기본적으로 42 wiki https://yeosong1.github.io/%EB%8F%84%EC%BB%A4-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%AA%A8%EC%9D%8C 를 참고하여 과제를 진행.

부족한 부분은 daelee's velog https://velog.io/@hidaehyunlee/ftserver-총-정리-도커-설치부터-워드프레스-구축까지 활용

1) Docker 설치

2) Docker에서 Debian OS 실행

  1. 도커 이미지 가져오기 docker pull debian:buster
  2. debian 환경에 들어가기 docker run -it -p 80:80 -p 443:443 debian:buster
    • -i : Keep STDIN open even if not attached
    • -t : Allocate a pseudo-TTY
    • -p : 호스트와 컨테이너의 포트를 연결
    • -P : Publish all exposed ports to random ports (Dockerfile에서 포트를 열어줘야함)

3) Nginx 설치

  • debian의 패키지관리자인 apt-get를 사용하여 설치한다.
  1. apt-get update 버전문제로 설치오류가 발생하는 것을 방지
    (apt-get 사용 시, 옵션으로 -y를 붙이면 y/n 질문에 자동으로 y입력을 수행한다.)
  2. apt-get -y install nginx nginx 설치
  3. service nginx start nginx 시작
  4. service nginx status nginx 동작 상태 확인 (curl localhost를 활용하면 더욱 구체적인 상태를 확인할 수 있다.)

4) SSL protocol 적용

  1. openssl 설치 apt-get -y install openssl
  2. 코드 수정을 위한 vim 설치 apt-get -y install vim
  3. 인증서 생성 openssl req -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=Gun/CN=localhost" -keyout localhost.dev.key -out localhost.dev.crt
    • CN : 일반 이름 (인증서 고유 이름)
    • O : 기관명
    • OU : 회사/기관 내의 ‘사업부, 부문, 부서, 본부, 과, 팀’ 정도.
    • L : 시/도
    • S : 구/군
    • ST : 나머지 상세 주소
    • C : 국가를 나타내는 ISO 코드를 지정. 한국은 KR, 미국은 US 등 2자리 코드
      openssl 옵션: https://yeosong1.github.io/openssl-%EC%BB%A4%EB%A7%A8%EB%93%9C
  4. 인증서 위치 이동 mv localhost.dev.crt etc/ssl/certs/
  5. key 위치 이동 mv localhost.dev.key etc/ssl/private/
  6. 권한 설정 chmod 600 etc/ssl/certs/localhost.dev.crt etc/ssl/private/localhost.dev.key
  7. default 파일 설정 (파일 위치 etc/nginx/sites-available/)
    • return 301 : 80번 포트 요청 시, redirection (80번 포트 : HTTP, 443포트 : HTTPS)
    • ([::]:) : IPv6로 요청
    • ssl on 이하 : ssl 인증서 등록
  1 server {
  2         listen 80;
  3         listen [::]:80;
  4
  5         return 301 https://$host$request_uri;
  6 }
  7
  8 server {
  9         listen 443 ssl ;
 10         listen [::]:443 ssl ;
 11
 12         ssl on;
 13         ssl_certificate /etc/ssl/certs/localhost.dev.crt;
 14         ssl_certificate_key /etc/ssl/private/localhost.dev.key;
 									
                                    .
                                    .

5) php-fpm 설치

  1. php-fpm 설치 apt-get -y install php-fpm
  2. php-fpm, nginx 연동 (vim /etc/nginx/sites-available/default)
 26         location ~ \.php$ {
 27                 include snippets/fastcgi-php.conf;
 28                 fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
 29         }
  1. php-fpm 작동 service php7.3-fpm start
  2. php-fpm 작동 확인 service php7.3-fpm status
  3. php-fpm, nginx 연동 확인
    - /var/www/html/ 위치에 phpinfo.php 파일 생성
    - <?php phpinfo(); ?> 내용 입력
    - service nginx reload 수정사항 적용
    - localhost/phpinfo.php 접속 시, 아래와 같은 화면이 출력되면 성공

6) MariaDB(MySQL) 설치

  • 데비안 9부터 MySQL -> MariaDB를 디폴트로 사용
  • 설치 apt-get -y install mariadb-server php-mysql

7) phpmMyAdmin 설치

  • phpMyAdmin은 알집을 직접 설치하여 풀어야 함.
  1. wget 설치 apt-get install -y wget
  2. 사이트에서 알집 받아오기 wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.tar.gz
  3. 알집 풀기 tar -xvf phpMyAdmin-5.0.2-all-languages.tar.gz
  4. 폴더명 변경 mv phpMyAdmin-5.0.2-all-languages phpmyadmin
  5. 위치 변경 mv phpmyadmin /var/www/html/
  6. phpMyAdmin 설정
  7. 갱신 및 실행 service nginx reload service mysql start service php7.3-fpm restart
  8. MySQL 데이터베이스 생성 mysql < var/www/html/phpmyadmin/sql/create_tables.sql -u root --skip-password
  9. phpMyAdmin 작동 확인 localhost/phpmyadmin

8) Wordpress 설치

  1. 사이트에서 알집 받아오기 wget https://wordpress.org/latest.tar.gz
  2. 알집 풀기 tar -xvf latest.tar.gz
  3. 위치 변경 mv wordpress/ var/www/html/
  4. 리눅스 소유자 변경 chown -R www-data:www-data /var/www/html/wordpress
    • -R은 –recursive. 에러 메시지가 있어도 출력하지 않게 하는 커맨드
    • www-data는 우분투에서 Apache,PHP 실행시 수정이 가능한 권한
  5. Wordpress 설정
    • wp-config.php 파일 생성 cp var/www/html/wordpress/wp-config-sample.php var/www/html/wordpress/wp-config.php
    • wp-config.php 파일 수정 (vim var/www/html/wordpress/wp-config.php)
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );
   
/** MySQL database username */
define( 'DB_USER', 'djeon' );
	
/** MySQL database password */
define( 'DB_PASSWORD', 'djeon' );
	
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );
	
/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );
	
/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
  1. Wordpress 작동 확인
    service nginx reload -> localhost/wordpress 접속

8) autoindex 추가

  • vim etc/nginx/sites-available/default
location / {
	autoindex on;
	try_files $uri $uri/ =404;
}
  • 동작 확인 (아래 화면이 정상 출력 화면)

9) 정리

  • 지금까지의 내용을 Dockerfile과 srcs파일들에 잘 나눠서 담으면 됨.

5. 마무리

0개의 댓글