Developer

ft_server 서버 돌려보기 본문

42seoul/ft_server

ft_server 서버 돌려보기

DPhater 2020. 9. 13. 06:53

Docker 설치하기

난는 클러스터 맥, 윈도우 데스크톱,  개인 아이맥 3가지 기기에서 번갈아가면서 수행하였다.... 

 

1. Cluster Mac 

Managed Software Center에서 Docker를 설치하면 된다.

설치가 완료되면 github.com/alexandregv/42toolbox를 git clone 한 뒤 init_docker.sh쉘을 실행시키면 된다.

init_docker는 제대로 된 docker가 설치되었는지 확인해주고, goinfre로 심볼릭 링크를 생성해 Docker가 인트라 계정에 부여된 용량을 차지하지 않도록 해줘야한다.

 

2. Window 10, Mac(Not Cluster)

윈도우와 개인 아이맥에서는 docker 공식 사이트(docs.docker.com/get-docker/)에서 OS에 맞는 Docker Desktop을 설치하여 사용하였다. 위의 URL로 들어가서 원하는 OS를 선택하면 설치 전 알아야 할 것들에 대한 설명이 있으니 읽어보며 진행 하길..

 

+window에서 진행은 WSL2를 사용했다.

WSL세팅은 구글링을 통해서 하셔도 되고, nomadcoders.co/windows-setup-for-developers에서 무료 영상으로 알려주고 있으니 원하는 걸 참고해서 세팅하면 될 것 같다. WSL설정을 완료하셨으면 docker desktop setting에서 wsl관련 옵션을 체크해주면 된다.

 

Debian(buster) 사용해보기

1. Debian:buster 이미지 만들기

 

1-1 pull명령어 사용하기

docker pull debian:buster

docker hub에서 debian:buster이미지를 가져온다.

 

1-2 Dockerfile 사용하기

FROM debian:buster

위와 같이 Dockerfile을 작성해서 build 해주면 된다. 

docker build . -t test
//docker build <Dockerfile 경로> -t <이미지이름> 

 

둘 다 같은 이미지를 가져와서 차이는 없다. 나는 2번의 방법으로 진행했으며 서비스하나 설치 및 설정 완료했을 때마다 Dockerfile을 수정해 확인하며 진행하였다.

 

 

2. 컨테이너 생성 및 접속하기

docker run 명령어를 사용하면 컨테이너 생성 및 접속을 할 수 있다.(생성만 하고 싶으면 create)

docker images

위의 명령을 사용하면 현재 가지고 있는 image 목록을 확인할 수 있다. 

docker images

 

image목록을 보면 debian과 test 이미지가 있는 것을 확인할 수 있다.

1번방법

docker run -it -p 80:80 -p 443:443 debian:buster

2번방법

docker run -it -p 80:80 -p 443:443 test

-it : i 옵션은 컨테이너와 상호 입출력이 가능하게 하는 옵션이고, t옵션은 tty를 활성화해 컨테이너의 쉘을 이용 가능하도록 하는 옵션이다. 

- p : 호스트 포트와 컨테이너의 포트를 연결해주기 위한 옵션이다. -p host_port:container_port 형식으로 사용하며 http는 80번 포트를 https는 443번 포트를 사용하기 때문에 두 개의 포트를 연결해주었다. 

 

docker run

명령을 사용하면 위의 사진처럼 debian의 bash prompt가 나온다.

 

apt-get update & upgrade

가장 먼저 apt-get update명령을 수행해야 한다. 데비안은 패키지 툴로 apt를 사용하는데 apt-get update는 사용 가능한 패키지들의 목록을 업데이트해준다. apt list 명령을 사용하면 현재 설치 가능한 패키지 목록을 볼 수 있는데 이 목록을 업데이트해주는 것이다. 

이후 apt-get upgrade를 진행해주면 된다. apt-get upgade의 경우 install명령으로 설치된 패키지들을 update명령으로 최신화한 것에 맞춰서 업그레이드를 진행해준다. 

Nginx(+ openssl, php-fpm)

1. Nginx 설치

apt-get install nginx

apt-get update명령을 수행했다면 위의 명령으로 Nginx를 설치할 수 있다. 설치가 완료되었다면 

service nginx start

명령으로 nginx를 실행시키고 브라우저의 주소창에 localhost를 입력하면 nginx서버의 default 페이지가 나오는 것을 확인할 수 있다.(https로 접속하면 아직 ssl연결 관련 설정을 하지 않았기 때문에 해당 페이지가 나오지 않는다.)

HTTPS는 SSL프로토콜 위에서 동작하는 HTTP로 생각하면 된다. 이전 글에 간략하게 설명해놓았다.

 

 

2. ssl인증서 생성하기

우리는 로컬에서 테스트용으로 진행하기 때문에 실제 CA에서 인증서를 발급받는 것이 아닌 openssl을 통해 자체 서명 인증서(CA로부터 발급받은 게 아닌 직접 인증)를 발급받아 사용한다. (참고)

 

2-1 openssl 설치하기

apt-get install openssl

Nginx설치와 같은 방법으로 설치하면 된다.

이제 인증서를 위의 첨부된 URL을 참고해서 생성하면 된다.

openssl req -x509 -newkey rsa:4096 -nodes -sha256 -keyout ft_server.key -out ft_server.crt -days 365 -subj "/C=KR/ST=SEOUL/L=SEOUL/O=42/OU=gon/CN=localhost"
mkdir /etc/nginx/ssl
mv ft_server.key /etc/nginx/ssl/
mv ft_server.crt /etc/nginx/ssl/
chmod 600 /etc/nginx/ssl/*

req : 인증서 요청 및 인증서 생성 유틸

-x509 : 인증서 요청 대신 자체 서명된 인증서를 출력하는 옵션으로 테스트 인증서 혹은 자체 서명된 루트 CA를 생성하는 데 사용한다.

-newkey :  개인키를 생성하기 위한 옵션이다. 

-keyout <key_filename> : <key_filename>이란 이름으로 키 파일을 생성한다.

-out <crt_filename> : <crt_filename>이란 이름으로 인증서를 생성한다.

-days 365 : 인증서의 유효기간을 작성하는 옵션이다.

-nodes : 이 옵션은 개인키를 암호화하지 않기 위한 옵션이다. 이 옵션이 없을 경우 최소 4자의 암호를 입력해줘야 한다.

-sha256 : SHA-256 기반 인증서를 생성하기 위한 옵션이다.

-subj "" : 이 옵션은 subjcet를 입력하기 위한 옵션으로 해당 옵션과 뒤의 내용을 기입하지 않으면 표준 입력으로 입력해

주어야 한다. CN의 경우 사용하려는 domain이름과 같아야 하며 우리는 localhost로 작성하면 된다.

-subj "CN=localhost"와 같이 CN만 입력해줘도 된다.

-subj 옵션 사용하지 않았을 때

인증서와 키를 생성했다면 저장할 디렉터리를 생성해 옮겨주고, 권한 설정을 해준다(보안 및 인증 관련 파일은 권한을 root만 허용하는 것에 익숙해지자).

 

2-2 nginx ssl 설정하기

이제 과제에서 원하는 대로 https 접속을 가능하게 하고, http 접속은 https로 리다이렉션 시키기 위한 설정을 해야 한다. 위키를 참고하면 apt-get으로 nginx를 설치했을 때 어디에 설치되는지 디렉터리 구조가 어떻게 되는지 확인할 수 있다. 

 

/etc/nginx/nginx.conf 파일 : nginx 실행에 대한 설정을 담고 있다. 이 파일에서 sites-enabled에 있는 설정들을 include 해서 사용한다.

/etc/nginx/sites-available 디렉터리 : 활성화 비활성화된 모든 사이트의 설정이 들어있다.

/etc/nginx/sites-enabled 디렉터리 : sites-available의 파일의 심볼릭 링크를 만들어 저장한다. 활성화된 구성만 포함되어 있으며 sites-available의 내용을 직접 사용하지 않고 sites-enabled로 나눈 이유는 해당 파일을 삭제하는 것으로 해당 사이트의 활성화 비활성화를 쉽게 할 수 있기 때문이라고 한다. (활성화할 경우 다시 심벌 링 링크 생성하면 됨)

 

나는 새로 파일을 생성하지 않고 sites-available에 있는 default 파일을 수정해 진행했다. default 파일은 sites-enabled에 심볼릭 링크가 생성되어 있으므로 추가로 심볼릭 링크를 만들어줄 필요가 없다. 단순 테스트용이기 때문에 이렇게 한 것이고 보통 default를 복사해 새 파일을 만들어서 수정하고 해당 파일로 심볼릭 링크를 생성해 진행한다.

# Default server configuration

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                try_files $uri $uri/ =404;
        }
}

default파일의 내용이다. 나는 주석을 다 지웠지만 다양한 설정에 대한 설명들이 작성되어있으므로 한번 쭉 보는 것을 추천한다. server블록에 다양한 설정들이 있지만 우선 https연결을 위한 설정을 작성해보자

 

현재 설정에는 서버 블록이 하나이며 80번 포트만 수신대기 상태이다. 따라서 https 연결을 위해 443 포트를 수신 대기하고 있는 서버 블록을 작성해야 한다.

server {
        listen 80;
        listen [::]:80;

        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl;
        listen [::]:443 ssl;
		
        #ssl 설정
        ssl on;
        ssl_certificate /etc/nginx/ssl/ft_server.crt;
        ssl_certificate_key /etc/nginx/ssl/ft_server.key;

		#서버의 root디렉터리 설정
        root /var/www/html;
		
        #읽을 파일 목록
        index index.html index.htm index.nginx-debian.html;

        server_name ft_server;
        
        #/를 기준으로 request_uri에 해당하는 디렉터리 찾음. 기준은 location 의 "/"로 지정
        location / {
        #try_files로 $uri에 해당하는 파일과 디렉터리를 찾음
        #파일을 먼저 찾으며 파일과 디렉터리가 없다면 404에러를 보여줌
        #디렉터리는 있으나 위에있는 index로 정한 파일이없다면 403에러 출력됨
                try_files $uri $uri/ =404;
        }
}

80번 포트로 수신되면 443 포트로 redirection 시켜주기만 하면 되므로 다른 내용은 삭제하고 redirection코드만 추가하면 된다. 301은 (permanently moved)로 "이 페이지는 영구히 이동되었어.. 이 주소로 접속해.."느낌의 코드이다.

참고로 $host와  $request_uri는 nginx변수로 

http://localhost/wordpress URL로 접속했다면 $host = localhost, $request_uri는 /wordpress이다

 

80번 포트로 들어오는 요청은 https://domain..으로 이동시켜주었다. 그 아래 https요청을 처리하기 위한 서버 블록을 작성하였고, listen은 443, ssl on과 키와 인증서의 위치를 작성해주면 된다. 나머지는 기존 http서버 블록에 있던 것 그대로이다. 

service nginx reload

위의 명령어로 nginx 서버를 다시 로드해서 http://localhost로 접속을 해보면 https://로 리다이렉션 되는 것을 확인할 수 있다.

보통 인증서를 신뢰할 수 없다는 등의 이유로 해당 페이지를 보여주지 않을 거다. 그렇다면 고급에서 "안전하지 않은 페이지 이동"을 누르거나 해당 버튼이 없다면 크롬 화면을 클릭하고 "thisisunsafe"를 입력하면 된다. 이렇게 나오는 이유는 인증된 CA로부터 발급받은 인증서가 아닌 자체 서명 인증서이기 때문이다. 

 

3. php-fpm 설치 및 nginx 설정하기

이전 설명글에 작성했듯이 nginx만으로는 동적 페이지를 구현할 수 없다. 따라서 nginx에서 동적 페이지를 사용할 수 있도록 도와주는 프로그램인 php-fpm이 필요하다. php-fpm은 간단하게 nginx를 php와 연동시켜주는 녀석이라고 생각하면 편하다. (php-fpm 설명)

apt-get install php-fpm

위의 명령으로 php-fpm을 설치해주고 nginx설정에 php를 위한 설정을 추가해주면 된다. 

server {
        listen 80;
        listen [::]:80;

        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl;
        listen [::]:443 ssl;
		
        ssl on;
        ssl_certificate /etc/nginx/ssl/ft_server.crt;
        ssl_certificate_key /etc/nginx/ssl/ft_server.key;

        root /var/www/html;
		
        #index.php
        index index.php index.html index.htm index.nginx-debian.html;

        server_name ft_server;

 		location / {
			try_files $uri $uri/ =404;
		}
        
        #추가
		location ~ \.php$ {
			include snippets/fastcgi-php.conf;
			fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
		}
}

nginx에서 친절하게 default파일에 php를 사용할 때 사용하라고 주석으로 작성된 코드들을 주석을 해제해주면 된다. index에 index.php추가도 해줘야 한다(이것도 최초 default 파일에 주석으로 알려주고 있음). 위에 작성된 것처럼 두 개의 주석을 해제해주면 되고, fastcgi_pass 부분에 php-fpm을 php7.3-fpm으로 변경해줘야 한다. 변경할 경우 503 에러가 발생한다.

service php7.3-fpm start

php-fpm서비스를 실행시켜야 정상적으로 사용 가능하다. php-fpm은 start명령 후에 아무런 표시가 출력되지 않기 때문에 status명령을 통해 제대로 실행됐는지 확인할 수 있다.

 

4. autoindex 설정하기

nginx설정 마지막 단계이다. autoindex인데 URL로 접근한 디렉터리에 index목록에 해당하는 파일이 없다면 리스트 형태로 디렉터리와 파일을 보여주는 옵션이다. location / 부분에 autoindex on; 만 작성해주면 활성화된다.

 

server {
        listen 80;
        listen [::]:80;

        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl;
        listen [::]:443 ssl;
		
        ssl on;
        ssl_certificate /etc/nginx/ssl/ft_server.crt;
        ssl_certificate_key /etc/nginx/ssl/ft_server.key;

        root /var/www/html;
		
        #뒤에 주석 추가
        index index.php index.html index.htm;# index.nginx-debian.html;

        server_name ft_server;

 		location / {
        	autoindex on;
			try_files $uri $uri/ =404;
		}
        
        #추가
		location ~ \.php$ {
			include snippets/fastcgi-php.conf;
			fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
		}
}

nginx설정 파일 최종본이다. 보면 index.nginx-debian.html을 주석 처리하였는데 루트 디렉터리인 /var/www/html에 index.nginx-debian.html이 존재해서 루트에 접속을 해도 해당 파일을 읽어 화면에 보여준다. 위와 같이 작성하고

service nginx reload

명령을 수행하면 다음 그림과 같이 디렉터리 구조를 리스트 형태로 보여준다.

autoindex on;

더보기

※궁금한 것이 있습니다. "subject에는 autoindex를 off 할 수 있어야 한다."라는 항목이 있는데 위의 설정 파일에 autoindex를 제거하고 서버를 reload 해서 localhost로 접속했을 때 index에 해당하는 파일이 없어 403 forbidden 에러가 출력됩니다. 주석 처리한 index.nginx-debian.html의 주석 해제해주면 해결되지만 이게 맞는 방법인지 궁금합니다. 

Wordpress, phpmyadmin, mariadb

1. mariadb 설치

apt-get install mariadb-server
apt-get install php-mysql
apt-get install php-mbstring

과제에서는 MYSQL을 사용하라고 작성되어 있다. 하지만 debian9 버전 이후부터는 mariadb를 지원한다고 한다. 그래서 mysql은 apt-get 명령으로 받을 수 없다. mariadb도 mysql을 베이스로 만들어졌고, mysql과 호환되어 모든 명령을 mysql과 똑같이 사용할 수 있다. php-mysql은 php에서 mysql에 접근할 수 있도록 하는 모듈이다. 즉 wordpress나 phpmyadmin에서 database에 접근하기 위해 필요하다. php-mbstring은 2바이트 확장 문자를 읽을 수 있도록 하는 확장인데 없으면 이후 phpmyadmin페이지에서 경고 메시지가 나온다.

 

2. Wordpress 설치

2-1 wordpress 설정

wordpress와 phpmyadmin는 apt-get으로 설치할 수 없다. 웹 서버로부터 직접 받아와야 하는데 이 설치를 도와주는 프로그램이 wget이다. 

apt-get install wget
wget https://wordpress.org/latest.tar.gz
tar -xvf latest.tar.gz

위의 명령을 차례로 수행하면 wget프로그램이 설치되고, wordpress 사이트에서 최신 버전의 워드프레스 압축파일이 설치된다. 이후 tar 명령어로 압축 해제하면 wordpress라는 디렉터리가 생성될 것이다. 

wordpress 디렉터리

압축 해제된 디렉터리 내부 파일들이다. 우선 wp-config-sample.php 파일을 보자

wp-config-sample.php

해당 파일에서 mysql설정 부분만 수정하면 된다. DB_NAME, DB_USER, DB_PASSWORD 3가지만 수정해주면 된다.

wp-config.php

위와 같이 변경해준 뒤(username, password는 원하는 대로) wp-config.php로 파일 이름을 변경해주면 wordpress설정 파일 수정은 끝이다. 다시 wordpress 디렉터리의 파일들을 보자

 

index.php가 있다. nginx에서는 wordpress를 여기에 보이는 index.php를 읽어 화면에 띄워줄 것이다. nginx가 이 index파일을 읽기 위해서는 이 파일들이 우리 서버의 루트 디렉터리인 /var/www/html/에 한다

rm -rf latest.tar.gz  #이제 필요없으니 삭제하겠습니다.
mv /wordpress/ /var/www/html/
chown www-data:www-data /var/www/html/wordpress

chown은 권한 설정으로 wordpress의 유저, 그룹을 www-data로 설정한다(nginx.conf를 보면 user로 www-data가 작성된 것을 볼 수 있다.)

 

2-2 Database 설정

이제 워드프레스의 설정 파일에 작성한 대로 database에 wordpress를 추가해줘야 한다.

service mysql start

설정을 위해 database서비스를 실행시킨다. 이후 mysql을 실행하면 database를 설정할 수 있다.

mysql # 실행시키면 mysql로 들어가짐

#on mysql
CREATE DATABASE wordpress;
SHOW DATABASES;  #데이터베이스 목록보기

위의 명령을 실행시키면 wordpress 데이터베이스가 생성된 것을 확인할 수 있다. 이제 유저를 생성하면 된다.

#on mysql
CREATE USER 'minsokim'@'localhost' IDENTIFIED BY 'minsokim';
GRANT ALL PRIVILEGES ON wordpress.* TO 'minsokim'@'localhost' WITH GRANT OPTION;

첫 줄은 minsokim이라는 아이디를 비밀번호 minsokim으로 생성하는 것이고 두 번째 줄은 권한 부여이다.

@'localhost'는 로컬 접속만 허용하겠다는 것이고 @'%'로 작성하면 외부에서의 접속을 허용하는 것이다. 

#on mysql
USE wordpress;
SHOW TABLES;

USE wordpress; 명령으로 database를 선택해서 table을 확인해보면 비어있는 것을 확인할 수 있다. (exit로 mysql을 빠져나갈 수 있다.) 이제 wordpress 설정이 모두 끝났다. localhost/wordpress로 접속해보자

위와 같은 페이지가 나오면 된다. (만약 PHP 관련 에러가 나온다면 php7.3-fpm을 restart 시켜줘야한다. php-mysql로 php설정이 변경되기 때문인 것 같다.)

설정 및 설치를 완료하면 위의 사진처럼 관리자 페이지가 나오고 왼쪽 위의 "집"모양을 누르면 wordpress메인 페이지를 볼 수 있다. 마지막으로 database와 연결이 잘되었는지 확인을 위해 mysql에서 이전에 했던 것처럼 wordpress의 table를 보면 추가된 것을 확인할 수 있다.

이렇게 콘솔에서 확인하고 수정하는 것은 번거롭기 때문에 phpmyadmin을 통해 웹으로 쉽게 database를 관리할 수 있다.

 

3. phpmyadmin 설치

3-1 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
rm -rf phpMyAdmin-5.0.2-all-languages.tar.gz # 마찬가지로 필요없으니 삭제
mv phpMyAdmin-5.0.2-all-languages phpmyadmin

위와 같이 설치하면 된다. 참고로 wget으로 설치하기 위한 주소는 www.phpmyadmin.net/downloads/에 접속해서 원하는 버전을 우클릭 후 링크 복사를 사용하면 된다. 편의를 위해 phpmyadmin으로 디렉터리 이름을 변경

phpmyadmin

엄청 많은 파일이 있지만 config.sample.inc.php 파일만 수정하면 된다. (ls | grep conf로 설정 파일이 무엇들이 있나 쉽게 확인 가능)

phpmyadmin config

쿠키 인증을 위해 반드시 입력하라는 칸만 입력해주고 해당 파일의 이름을 config.inc.php로 변경해주면 phpmyadmin의 설정 파일 작성은 끝이다. ( blowfish 암호 생성기로 암호를 생성해 입력해주면 된다.) wordpress처럼 phpmyadmin 디렉터리를 /var/www/html/로 옮겨주자.

mv /phpmyadmin /var/www/html/

3-2 Database 설정

phpmyadmin을 위한 database 설정은 wordpress보다 쉽다. /var/www/html/phpmyadmin/sql디렉터리로 들어가면 create_tabels.sql이라는 파일이 준비되어 있는데 해당 sql파일을 mysql로 리다이렉션 시켜주면 된다.

mysql < /var/www/html/phpmyadmin/sql/create_tables.sql

phpmyadmin

localhost/phpmyadmin으로 접속해서 wordpress에서 설정한 Database의 ID와 PW를 작성하면 위의 사진처럼 Database를 관리할 수 있다.

'42seoul > ft_server' 카테고리의 다른 글

ft_server 과제 이해하기  (2) 2020.09.08
도커와 컨테이너  (1) 2020.09.07
Comments