Ft_server
요약: 이번 프로젝트의 과제는 시스템 관리입니다. 여러분은 도커를 발견하고 여러분의 첫 번째 웹 서버를 구축할 것입니다.
Introduction
이번 주제는 여러분에게 시스템 관리에 대해서 소개하려 합니다. 스크립트를 사용하여 업무를 자동화하는 것이 중요하다는 것을 깨닫게 될 것입니다. 이를 위해, 여러분은 "도커"라는 기술을 발견하여 그것을 완전한 웹 서버를 설치하는 데 사용할 것입니다. 이 서버는 여러 서비스를 실행할 것입니다: Wordpress, phpMyAdmin, 그리고 SQL database.
General instructions
- 서버 구성에 필요한 모든 파일을 srcs 폴더 안에 넣어놔야 합니다.
- 도커파일은 저장소의 루트에 있어야 합니다. 그것은 여러분의 컨테이너를 만들 것입니다. 도커-컴포즈를 사용할 수 없습니다.
- WordPress 웹 사이트에서 필요한 모든 파일은 srcs 폴더 안에 있어야 합니다.
Mandatory part
- 오직 하나의 도커 컨테이너에만, Ngnix로 웹 서버를 구축해야 합니다. 그 컨테이너 OS는 debian buster이어야 합니다.
- 웹 서버는 동시에 여러 서비스를 실행시킬 수 있어야 합니다. 이 서비스는 WordPress 웹 사이트, phpMyAdmin 그리고 MySQL이 될 것입니다. SQL 데이터베이스가 WordPress 및 phpMyAdmin과 함께 연동되어 작동이 잘 되는지 확인해야 할 것입니다.
- 여러분의 서버는 SSL 프로토콜을 사용할 수 있어야 합니다.
- URL에 따라 서버가 올바른 웹 사이트로 이동하는지 확인해야 할 것입니다.
- 당신의 서버가 autoindex로 실행 중인지 확인해야 하며, 그 autoindex는 비활성화가 가능해야 합니다.
1. Docker 란?
hyos-inside.tistory.com/entry/%EB%8F%84%EC%BB%A4Docker-%EB%9E%80
[Docker] 🐳 도커란? 입문하기
1. Docker 란? Docs에서 말하는 Docker는 클라우드 또는 온-프레미스로 실행될 수 있는 이식 가능하고 문제를 스스로 해결할 수 있는 컨테이너로서 애플리케이션 배포를 자동화하기 위한 오픈 소스 프
hyos-inside.tistory.com
2. Debian buster
우리의 과제는 데비안 버스터라는 os 위에서 실행을 시켜야 합니다.
데비안은 OS 중 하나이며 1993년 9월 첫 버전 이후 우분투를 비롯한 수많은 리눅스 배포판의 모체가 되었습니다.
현재 최신 안정 버전은 2019년 배포된 buster 입니다.
✔️ debian buster 이미지 다운
docker pull debian:buster
docker run -it --name debian -p 80:80 -p 443:443 debian:buster
- -p 80:80 호스트의 80번 포트를 컨테이너의 80번 포트와 연결 (http 프로토콜의 기본 포트는 80)
- -p 443:443 호스트의 443번 포트를 컨테이너의 443포트와 연결 (추후 적용시킬 ssl을 사용할 https의 기본 포트)
3. Nginx
nginx 는 Apache과 같은 웹 서버 소프트웨어입니다.
nginx 설치
apt-get update && apt-get -y install nginx
- 도커파일 내에서는 yes 를 누를수 없음으로 -y 플래그를 붙여줍니다.
Nginx 명령어
service nginx start
service nginx status
service nginx reload
nginx 를 start 한 뒤 localhost에 들어가 Welcome to nginx가 뜨면 정상 작동 된 것 입니다.

4. MariaDB(mySQL)
mySQL은 관계형 데이터베이스 관리 시스템입니다. 서브젝트에서는 mysql을 요구하지만
데비안 버스터에서는 mariaDB만을 지원하기 때문에 mysql과 완전 호환되는 mariaDB를 설치할 것입니다.
MariaDB 설치
apt-get -y install mariadb-server
# mysql 실행 및 서버 재실행
service mysql start
service nginx reload
mysql 계정 권한 설정과 데이터 베이스 생성
# mysql 실행
mysql;
# wordpress 데이터베이스 생성
CREATE DATABASE wordpress;
# 사용자 계정 생성
CREATE USER IF NOT EXISTS 'hyospark'@'localhost' IDENTIFIED BY 'hyospark';
# 권한 설정
GRANT ALL PRIVILEGES ON wordpress.* TO 'root'@'localhost' WITH GRANT OPTION;
5. PHP
PHP
server side script 로 서버 쪽에서 동작하는 언어입니다. php와 nginx를 연동하기 위해 알아야 할 몇가지 개념들이 있습니다.
php 같은 다양한 동적인 파일을 보내기 위한 과정에서 개발된 CGI & FastCGI 표준이 있습니다.
CGI(common gateway interface)
공통 게이트웨이 인터페이스의 약어로, 웹서버와 외부프로그램을 연결해주는 인터페이스입니다.
아래 이미지를 보면 데이터를 주고 받을때의 CGI 동작 방식을 볼 수 있습니다.

FastCGI
느린 CGI를 개선하기 위해 등장한 것으로 CGI는 하나의 요청에 하나의 프로세스를 생성합니다.
프로세스를 생성하고 삭제하는 과정에서 많은 부하가 발생하여 속도가 느려지는 단점이 있었는데 FastCGI는 만들어진 프로세스가 계속해서 새로운 요청들을 처리하여 부하가 줄어들게 만들었습니다.
PHP-FPM
PHP FastCGI Process Manager의 약자로 PHP를 FastCGI 모드로 동작하도록 해줍니다.
apt-get -y install php-fpm php-mysql php-mbstring curl wget vim
vim /etc/nginx/sites-available/default 파일에서 php 부분 주석을 해제하고 index를 추가해 줍니다.
index index.htm index.html index.php #index.nginx-debian.html;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
5. phpMyAdmin
phpMyAdmin은 MySQL을 웹 상에서 관리할 목적으로 PHP로 작성한 오픈 소스 도구입니다.
즉 Mysql을 웹상에서 GUI로 관리할 수 있는 오픈소스를 php언어로 개발한 MySQL Client 툴입니다.
아까 만든 wordpress 데이터 베이스를 phpmyadmin을 통해 관리할 수 있도록 연결을 해주겠습니다.
phpMyAdmin 설치
파일 디렉토리 생성과 파일 이동
wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.tar.gz
tar -xvf phpMyAdmin-5.0.2-all-languages.tar.gz
mv phpMyAdmin-5.0.2-all-languages phpmyadmin
mv phpmyadmin /var/www/html/
6. WordPress
홈페이지 제작을 할 수 있는 웹사이트
wordpress 설치
wget https://wordpress.org/latest.tar.gz
tar -xvf latest.tar.gz
mv wordpress/ var/www/html/
chown -R www-data:www-data /var/www/html/wordpress
cp var/www/html/wordpress/wp-config-sample.php var/www/html/wordpress/wp-config.php
vim var/www/html/wordpress/wp-config.php 파일에서 아까 생성한 데이터 베이스 명과 유저 비밀번호로 수정해줍니다.
7. SSL protocol
SSL(Secure Socket Layer)는 보안계층 프로토콜 입니다.
응용계층과 전송 계층 사이에 속하는 프로토콜로 SSL 위에 응용 프로토콜이 올라가는 것입니다. 즉 HTTP 뿐만 아니라 다른 프로토콜에도 적용할 수 있습니다.
handshake 나 cipher 같은 프로토콜은 이곳에서는 설명하지 않겠습니다.

HTTPS(HyperText Transfer Protocol over Secure Socket Layer) 는 http의 보안이 강화된 버전으로 SSH와 HTTP가 결합된 것을 의미하는 것입니다. 위에 말했듯이 HTTPS의 기본 TCP/IP 포트는 443입니다.
https는 소켓통신에서 일반 텍스트를 이용하는 대신에 SSL / TLS 프로토콜을 통해 세션 데이터를 암호화합니다.
대칭키
대칭키는 암호화 할 수 있는 키를 가지고 그 키로 복호화도 할 수 있는 방식입니다. 대칭키는 공개키 방식에 비해 빠르다는 장점이 있지만 대칭키의 한계는 키를 전송할때 안전하지 않다는 것과 전부 키를 따로 키교환을 해야하기 때문에 관리해야 할 키가 많아진다는 점이 있습니다.
공개키
대칭키의 키교환 문제를 해결하기 위해 나온 공개키 방식은 두개의 키를 가지고 하나는 비공개키(private key)라 부르고 나머지를 공개키(public key)로 지정해 하나의 키가 복호화 혹은 암호화만 할 수 있도록 지정하는 방식입니다.
우리는 무료 오픈소스인 openssl 을 이용해 키를 발급 받아보겠습니다.
openssl 설치하기
apt-get -y install openssl
개인 키 (.key) 와 인증서 서명 요청 파일 (.csr)을 생성해보겠습니다.
rsa: 는 키의 크기로 보안의 정도를 지정할 수 있고 -days는 인증서의 유효기간을 -nodes는 개인키를 암호화하지 않음을 설정합니다.
개인키 및 인증서 생성
mkdir /etc/nginx/ssl
openssl req -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=Lee/CN=localhost" -keyout /etc/nginx/ssl/localhost.key -out /etc/nginx/ssl/localhost.crt
chmod 600 /etc/nginx/ssl/localhost.crt /etc/nginx/ssl/localhost.key
vim /etc/nginx/sites-available/default 파일에 ssl 을 활성화 시켜주고 443포트와 리다이렉션을 추가해줍니다.
server {
listen 80;
listen [::]:80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
# ssl setting
ssl on;
ssl_certificate /etc/nginx/ssl/localhost.crt;
ssl_certificate_key /etc/nginx/ssl/localhost.key;
# 서버 루트 경로 지정
root /var/www/html;
index index.htm index.html index.php index.nginx-debian.html;
server_name ft_server;
location / {
try_files $uri $uri/ =404;
}
# PHP 추가
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
}
}
생성 후에는 한번 nginx를 재실행 해줍니다.
service nginx reload
다시 localhost 로 들어갔을 때 해당 경고창이 뜨고 고급 -> localhost 들어가면 ssl 적용이 완료된 것이다.

8. autoindex
오토인덱스는 root 디렉토리에 있는 파일들을 리스트로 보여주는 기능
vim etc/nginx/sites-available/default 에 해당 내용을 추가하고 index.nginx-debian.html 를 주석 처리해줍니다.
location / {
autoindex on;
try_files $uri $uri/ =404;
}
localhost 접속하면 리스트가 나오는 것을 확인 할 수 있습니다.
ft_server 과제 목표
- Docker이미지로 debian buster 환경 만들고 접속해보기
- nginx 설치하고 로컬호스트에서 접속해보기(docker port 설정)
- Nginx에 php실행시켜 띄워보기(php설치 및 nginx conf 설정)
- mysql 실행해보기(db를 하나 만들어보기)
- phpmyadmin 접속할수 있게 설정해보기(설치 및 conf 설정)
- wordpress 접속할수 있게 설정해보기(설치 및 conf 설정)
- wordpress에 db적용시켜보기
- 지금까지 해온걸 dockerfile로 자동화 시키기
📍참고자료
How To Install Linux, Nginx, MariaDB, PHP (LEMP stack) on Debian 10 | DigitalOcean
The LEMP software stack is a group of software that can be used to serve dynamic web pages and web applications. This is an acronym that describes a Linux operating system, with an Nginx web server. The backend data is stored in the MariaDB/MySQL data
www.digitalocean.com
opentutorials.org/module/384/4332
NGINX-PHP-MySQL 설치 - NGINX
CGI CGI는 Common Gateway Interface의 약자로 웹서버와 외부 프로그램을 연결해주는 표준화된 프로토콜이다. 웹이 처음 등장했을 때는 HTML과 이미지를 전달해주는 웹서버 밖에 없었다. 하지만 웹에 대
opentutorials.org
'42Seoul' 카테고리의 다른 글
[42Seoul] Philosophers : 뮤텍스와 세마포어 (0) | 2021.08.14 |
---|---|
[42 Seoul] Minitalk : signal 함수로 IPC(Inter-Process Communication) 구현 (0) | 2021.07.02 |
[42Seoul] Push_Swap : 정렬 알고리즘 구현 (0) | 2021.06.16 |
[42Seoul] ft_printf - 나의 printf 구현하기 (0) | 2021.02.06 |
[42Seoul] Netwhat - 네트워크 및 시스템 관리 (0) | 2021.01.23 |