나보다 더 잘 설명한 곳(본인 피셜):

https://watermelonlike.tistory.com/115

 

킹갓여름님(intra : yeosong)의 글을 참고하였습니다.

(https://yeosong1.github.io/ftserver-%ED%92%80%EC%9D%B4%EA%B8%B0%EB%A1%9D)

 

20210201 월요일, 처음부터 끝까지 따라해보면서 오류가 없는 것을 확인했습니다.

이미지가 안 보이거나 오류가 있다면 말씀해주세요.

제가 먼저번엔 말을 애매하게 해서 오류가 발생할 수도 있겠다는 생각이 들었는데, 이제는 그런 것도 다 수정했습니다.

서버 스트레스 받으시겠지만 화이팅 하시길 바랍니다.

 

 

 

1. 도커 설치

클러스터 managed software center에서 docker install

(클러스터 맥이 아닌 경우 docker 공홈 다운로드 사이트(hub.docker.com/editions/community/docker-ce-desktop-mac/)에서 다운 받자. - sujilee님의 팁) 

 

git clone https://github.com/alexandregv/42toolbox.git ~/42toolbox

echo "source ~/42toolbox/shell\_utils.sh" >> ~/.zshrc

cd 42toolbox

sh init_docker.sh

 

(여기서 클러스터 맥이 아니라 개인 맥으로 하시는 경우, 42toolbox 내 init_docker.sh 의 경로를 원하는 경로로 바꾸어주자. - sujilee 님의 팁)

 

도커가 잘 설치됐는지 확인하기

cd ../goinfre/docker/com.docker.docker/Data

docker ps (화면 오른쪽 상단에 있는 도커가 stop이면 안 됨. restart해서라도 켜기)

 

 

도커로 데비안 버스터 이미지 만들기

pwd -> /Users/your_intra_id/goinfre/docker/com.docker.docker/Data

docker pull debian:buster

docker images <- 이걸로 확인. debian buster라는 이름의 파일이 각각 하나씩 생겨있음

 

 

도커로 데비안 버스터 환경에 들어가기

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

(-i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션 (컨테이너의 표준 입력과 로컬 컴퓨터의 키보드 입력을 연결))

(-p : 호스트와 컨테이너의 포트를 연결(포워딩))

(80 포트는 http, 443 포트는 https. 암호화 방식의 차이. https가 더 안전)

(debian:buster => IMAGE:TAG)

 

결과 :

 

 

데비안 버스터에 nginx 설치

apt-get update

apt-get -y upgrade

apt-get -y install nginx

(-y 옵션은 설치할거냐라는 질문에 대해 미리 답하는 옵션)

뭔가 좌라락 설치된다.

 

 

nginx 서버 시작 및 상태 확인

service nginx start

service nginx status

이 상태에서 인터넷 url에 localhost:80 을 치면

위와 같은 화면이 나온다.

openssl로 self-signed ssl 인증서 만들기

1. apt-get -y install openssl vim (직접 입력)

(도커 컨테이너에 vim 설치.)

 

2. 다음을 입력

openssl req -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=KR/ST=Seoul/L=Seoul/O=42Seoul/OU=Lee/CN=localhost" -keyout localhost.dev.key -out localhost.dev.crt 

(복사 붙여넣기를 하되 localhost.dev.crt 앞뒤로 아무것도 붙지 않도록 유의하자.)

(아래 그림처럼 crt 뒤에 \357\273\277 이런 게 붙으면 안 된다.)

(* openssl 뒤에 따라오는게 무슨 말일까?

더보기

req

증명서 서명 요청 관리

-newkey, rsa:4096

<설명>

this option creates a new certificate request and a new private key.

The argument takes one of several forms.

rsa:nbits, wherenbitsis the number of bits, generates an RSA keynbitsin size.

Ifnbitsis omitted, i.e.-newkey rsaspecified, the default key size, specified in the configuration file is used.

이 옵션은 새로운 증서 요청을 발행하고 새로운 private키를 만든다.

인자로는 여러 가지 형태의 값을 받을 수 있다.

rsa:nbits에 대해 말하자면, nbits는 bits의 수이고, RSA key를 nbits 사이즈로 발행한다.

nbits를 써주지 않으면 설정파일에 있는 값으로 발행된다.

-days 365 // -x509

when the-x509option is being used this specifies the number of days to certify the certificate for. The default is 30 days.

-x509와 함께 쓰이는 경우 증서를 며칠 동안 유효한 상태로 만들건지 결정한다. 30일이 기본이다.

-nodes

if this option is specified then if a private key is created it will not be encrypted.

이 옵션이 쓰이면 생성되는 private키가 암호화되지 않는다.

생략시 재부팅할 때마다 수동으로 암호를 입력해야 한다는 단점.

-subj "~"

Replaces subject field of input request with specified data and outputs modified request. The arg must be formatted as_/type0=value0/type1=value1/type2=..._, characters may be escaped by \ (backslash), no spaces are skipped.

특정 데이터를 가지고 input요청의 subject 필드를 대체하고, 수정된 요청을 내보낸다.

인자는 /타입1=값1/타입2=값2/.. 와 같은 형태여야 한다.

공백문자도 생략하지 않고 보며, '\' 백 슬래쉬로 escape한다.

https://yeosong1.github.io/ftserver-%ED%92%80%EC%9D%B4%EA%B8%B0%EB%A1%9D

-keyout filename(which is localhost.dev.key)

this gives the filename to write the newly created private key to. If this option is not specified then the filename present in the configuration file is used.

이것은 새로 생성된 private 키를 쓸(저장할) 파일 이름을 준다. 만약 이 옵션이 지정되지 않는다면 파일 이름은 설정 파일에 있는 것으로 생성된다.

-out

This specifies the output filename to write to or standard output by default.

출력 파일 이름을 설정한다.

------------------------(닫으려면 위의 '닫기'클릭)------------------------------------------------------

 

 

빨간 원 안에 있는 것처럼 파일 이름이 잘못 들어가는 경우가 많다. 이렇게 되지 않도록 유의하자. 아래와 같이 되어야 한다.
3. 실행하기 전.

3. mv localhost.dev.crt etc/ssl/certs/

.crt는 인증서 파일

3. 을 실행한 후의 사진.

4. mv localhost.dev.key etc/ssl/private/

5. chmod 600 etc/ssl/certs/localhost.dev.crt etc/ssl/private/localhost.dev.key

localhost.dev.crt 뒤에 이상한 문자가 들어가면 안 된다고 했다.. 복붙만 하다간 잘 되지 않을 수 있으니 유의하자. 

 

nginx default 파일 설정을 변경하여 nginx에서 ssl 사용하기.

vim etc/nginx/sites-available/default

위 명령어를 넣으면 아래처럼 창이 뜨는데, 첫 번째 server 블록은 원래 있는 것이고

두 번째 server 블록은 우리가 추가해줘야 하는 블록이다.

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

        ...
}

server {
        listen 443;

        ssl on;
        ssl_certificate /etc/ssl/certs/localhost.dev.crt;
        ssl_certificate_key /etc/ssl/private/localhost.dev.key;

        root /var/www/html;

        index index.php index.html index.htm;

}

위와 같이 두 번째 server를 붙여넣는다. 아래 캡쳐와 같이 되게끔.

service nginx restart (또는 reload)로 수정사항 적용.

여기서 터지는 분들은 위에서 강조한 .crt 파일 앞뒤로 이상한 문자가 들어가서 그렇다.

인터넷 브라우저(크롬) 에서 localhost:80 접속

 

 

 

nginx에 성공적으로 ssl까지 올린 상태에서 php-fpm 설치하기.

apt-get -y install php-fpm

vim etc/nginx/sites-available/default

해당 파일 안에서

위 부분을 찾아서

위와 같이 바꿔준다.

 

php7.3-fpm.sock; 이 부분이 설치한 PHP 버전과 일치하는지도 확인 (php -v 로 확인가능.)

이런 버전이면 php7.3-fpm.sock으로 하면 된다.

 

추가로 필자는 방금 열어본 파일 내에 있는 index index.html index.htm index.nginx-debian.html 뒤에 index.php;도 추가시켜줬다.

여기까지 했으면 :wq로 저장하고 나오자.

 

service php7.3-fpm start

service php7.3-fpm status

로 작동을 확인해준다.

 

phpinfo()로 php-fpm과 nginx가 잘 연동되는지 확인하기

1. /var/www/html에서 vim phpinfo.php로 파일을 하나 만든다.

(cd /var/www/html; vim phpinfo.php)

 

그리고 내용을 아래와 같이 작성한다.

이 때, 공백 하나 다르게 입력하지 않도록 주의하자.

<?php phpinfo(); ?>

service nginx reload(혹은 restart) 실행.

 

여기서 터지시는 분들은 `etc/nginx/sites-available/default`이 파일에서 fastcgi_pass 가 적혀있는 줄 앞뒤로 브라켓(`{ }`) 이 잘 열리고 닫혀있는지 다시 확인하시길 ! 

 

 

이제, 웹 브라우저에서 localhost/phpinfo.php로 접속해보자.

다음 화면이 나와야 한다.

 

 

MariaDB(mysql) 설치하기

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

데비안 9버전 부터 Mysql에서 MariaDB를 디폴트로 사용한다.

 

phpMyAdmin 압축해제 + 설치

(데비안에서 phpmyadmin을 바로 다운받을 수 없음. 한줄한줄 복붙하자. 다만 복붙할 때 이상한 글자가 들어가지 않도록 유의.)

apt-get install -y wget

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/

(마지막 줄은 사실상 의미없다. 필자도 아래와 같이 나왔다.)

 

 

phpMyAdmin 세팅하기.

이 단계에서 해야할 것.

 

phpMyAdmin/config.sample.inc.php 복사

(cp -rp var/www/html/phpmyadmin/config.sample.inc.php var/www/html/phpmyadmin/config.inc.php)

이 단계에서 만약 다음과 같은 문구가 뜬다면,

현재 경로(pwd)를 다음과 같이 한 다음,

다음 코드를 입력해보자.

 

 

지금부터 할 것:

config.inc.php에 blowfish 암호 생성기에서 생성한 암호를 넣기.

create_tables.sql을 가져와서phpMyAdmin에 사용할 테이블을 만듬.

(잘 모르겠다면 아래를 따라가자.)

 

일단 vim 으로 다음 파일을 연다.

vim var/www/html/phpmyadmin/config.inc.php

(pwd가 이미 phpmyadmin에 있다면 그냥 vim config.inc.php 입력하시길 !!)

 

그리고 아래 사이트에 접속해 

 

blowfish 암호생성기 - http://www.passwordtool.hu/blowfish-password-hash-generatorhash.online-convert.com/blowfish-generator

 

Blowfish online encryption tool

Encrypt and hash your data using the Blowfish encryption algorithm with this free online tool.

hash.online-convert.com

 

blowfish 암호생성기에서 암호입력후 generate눌러서 밑에 뜨는 코드를 복사한다.

(아래와 같이 비밀번호로 사용 할 텍스트를 입력 후 convert 클릭)

 

그리고 열어놓은 파일에서 아래 부분과 같이 YOU MUST FILL 앞에 생성한 코드를 붙여넣기한다.

$cfg['blowfish_secret'] = '여기 붙여넣기하시오'; /* YOU MUST FILL...

 

 

그 다음 아래 코드 순서대로 실행

service nginx reload
service mysql start
service php7.3-fpm restart

mysql < var/www/html/phpmyadmin/sql/create_tables.sql -u root --skip-password

(여기서도 현재 pwd가 phpmyadmin인 경우
mysql < sql/create_tables.sql -u root --skip-password 만 입력하자 !! )

mysqladmin -u root -p password
기존 패스워드 없으니 일단 엔터 한 번 입력 
새 패스워드 입력
한 번 더 입력
(필자는 `새 패스워드 입력`에서
blowfish convert 하기 이전의 비밀번호인 1111을 입력했다.)

mysql
show databases;

 

아래 코드를 입력할 때 주의할 점은 user와 %, 설정한비밀번호를 둘러싼 '' 부분은 직접 입력하지않으면 오류가 발생할 수 있다는 점이다.

'' 를 인식하는게 다른건지,, 아무튼 해당 따옴표는 직접 입력하자.  

CREATE DATABASE IF NOT EXISTS wordpress; // 워드프레스를 위한 DB 만들기
GRANT ALL PRIVILEGES ON *.* TO ‘user’@‘%’ IDENTIFIED BY ‘설정한비밀번호’ WITH GRANT OPTION;
FLUSH PRIVILEGES;
SHOW DATABASES;
exit

 

 

phpMyAdmin 작동 제대로 하는지 확인하기

service mysql start

한 후에 (already running 일 수 있다.)

브라우저(크롬)에서 localhost/phpmyadmin으로 접속.

 

사용자명은 root이고 비밀번호는 아까 입력한 비밀번호.

지금까지 잘 따라왔다면 다음 창이 떠야한다.

 

 

wordpress 설치.

(pwd는 /var/www/html/phpmyadmin)

한줄씩 입력하자.

wget https://wordpress.org/latest.tar.gz
tar -xvf latest.tar.gz
mv wordpress/ ../
(윗 줄이 의미하는 것은 /var/www/html/phpmyadmin/wordpress/ 를
상대경로인 ../로 이동한다는 것이다. tmi인가요..?)

chown -R www-data:www-data /var/www/html/wordpress

위 코드블록을 잘 따라했다면 에러 없이 명령창이 뜰 것이다.

 

wordpress 설정.

var/www/html/wordpress/wp-config.php에 설정 수정하기.

현재 pwd는 아마도 "/var/www/html/phpmyadmin" 으로 되어있을 것이다.

이것을 "/"이 되게끔 cd ../../../../ 이런식으로 이동시켜주자.

 

cp var/www/html/wordpress/wp-config-sample.php var/www/html/wordpress/wp-config.php

vim var/www/html/wordpress/wp-config.php

(누누히(누누인가?) 말하지만 현재 pwd가 phpmyadmin인지 아닌지 잘 판단하자. 

현재 pwd가 phpmyadmin이라면 cd ../wordpress 로 가서 cp wp-config-sample.php wp-config.php 를 입력해주면 된다.

vim 이하도 마찬가지. vim wp-config.php 을 해준다.)

 

이제 wp-config.php 파일이 열렸을 것이다. 가운데 부분을 아래 내용처럼 맞춰주자.

(중요! 절대 아래 코드는 복붙하지 말것. 100% 오류난다. 직접 입력하자.)

// ** 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', 'root' );

/** MySQL database password */
define( 'DB_PASSWORD', 'mysql에서 입력했던 비밀번호' );

/** 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', '' );

 

 

url redirection 추가(http 주소를 https 주소로 들어오도록 리디렉션 시킨다)

vim etc/nginx/sites-available/default

(현재 경로를 cd ..을 반복하든 cd / 를 하든 해서 / 로 바꾸고 입력하자 ! 잔소리같지만 안 하면 오류다.)

 

해당 파일을 아래처럼 수정해준다.

 

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

    ...
#마지막줄에
    return 301 https://$host$request_uri;
}

server {
        listen 443;

        ssl on;
        ssl_certificate /etc/ssl/certs/localhost.dev.crt;
        ssl_certificate_key /etc/ssl/private/localhost.dev.key;

        root /var/www/html;
#여기부터 쭉
        index index.php index.html index.htm index.php;

        server_name _;

         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;
        }
}

 

return 301 뒤에 파란색 하이퍼링크 표시는 안 떠도 상관없다.

 

wordpress 작동 확인하기

service nginx reload

localhost/wordpress 접속

 

모두 정상작동 한다면, 지금까지의 내용을 Dockerfile + srcs에 정리하면 끝

 

여기까지 따라오느라 수고 많으셨습니다.

도움이 되셨다면 아래 git repo에서 star 한번씩만 부탁드립니다.

github.com/ChoiKanghun/ft_server

모두 완료하신분들은 이제 다음 포스팅에서 채점연습을 하시면 됩니다.

42kchoi.tistory.com/167?category=888384

수고 많으셨습니다!

 

* 안 된다는 사람들이 많아 오류가 발생할 여지가 있는 부분을 최대한 수정했습니다.

(pwd에 대해 신경을 썼느냐, 복붙할 때 파일명이 제대로 복사됐느냐 그리고 따옴표를 복붙해서 나는 에러 세 가지가 다 였긴 하지만요.)

만약에 2020 10 09일 이후로 이 내용을 보고 계시는데도 오류가 발생한 분이 있다면 댓글을 남겨주세요.

 

 

 

refs -

https://www.openssl.org/docs/man1.0.2/man1/openssl-req.html

https://www.openssl.org/docs/manmaster/man1/openssl.html

https://yeosong1.github.io/ftserver-%ED%92%80%EC%9D%B4%EA%B8%B0%EB%A1%9D 

http://www.passwordtool.hu/blowfish-password-hash-generatorhash.online-convert.com/blowfish-generator

 

 

 

 

'Code 42 > Ft_server' 카테고리의 다른 글

ft_server 제출하기  (2) 2020.07.10
컨테이너(Container)란?  (0) 2020.03.13
ft_server과제 해석  (0) 2020.03.13
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom