42 SEOUL/배운 것들 정리

ft_server 프로젝트 수행 과정

hi._.0seon 2021. 2. 1. 23:22
반응형

2021/02/01

  1. docker 홈페이지에서 docker for mac 버튼으로 설치

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

    $ docker pull debian:buster

    $ docker images
    -> 도커 이미지 파일 목록들이 뜸
  3. docker 로 debian:buster 환경에 들어가기

    $ docker run -it -p 80:80 -p 443:443 debian:buster
    -p 옵션: 포트로 외부에서 접속 가능하도록 설정
    -p (연결할 호스트의 포트번호):(컨테이너의 포트번호)
  4. nginx 설치

    $ apt-get update

    $ apt-get upgrade
    $ apt-get install nginx
  5. nginx 서버 연결 확인

    # service nginx start

    # service nginx status
     -> 인터넷 접속 (localhost:80)
      : Welcome to nginx 가 나오면 성공
    # service nginx stop // 일단 종료
  6. docker image 저장

    # exit // 도커 종료
    # docker ps -a
    -> 방금 닫힌 컨테이너 ID 복사
    # docker commit [CONTAINER ID] [이름]

    # docker images // 방금까지 한 내용이 나옴

2021/02/1 1

  1. 최근 저장한 도커 이미지 실행

    $ docker run -it -p 80:80 -p 443:443 [이미지 레포지토리 이름]:[TAG]
    // docker run -it -p 80:80 -p 443:443 ft_server:latest
  2. nginx 설치 이후부터 실행
  3. open ssl 설치

    # apt-get install -y openssl vim
  4. 개인키 & 인증서 생성

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

    - req: 인증서 요청 및 인증서 생성 유틸
    -newkey: 개인키 생성 위한 옵션
    -keyout <키 파일 이름> : 키 파일이름을 지정해 키 파일 생성
    -out <인증서 이름> : 인증서 이름을 지정해 인증서 생성
    -days 365 : 인증서의 유효기간을 작성하는 옵션
    -nodes 생략시 재부팅할때마다 수동으로 암호 입력
  5. 권한제한

    # mv  localhost.dev.crt  etc/ssl/certs/
    # mv  localhost.dev.key  etc/ssl/private/
    # chmod  600  
    etc/ssl/certs/localhost.dev.crt etc/ssl/private/localhost.dev.key
  6. nginx에 ssl 설정 및 url redirection 추가

    "etc/nginx/sites-available/default" 파일 수정

    -> default 파일에 https 연결을 위한 설정 작성
  7. nginx에 ssl 설정 및 url redirection 추가
# etc/nginx/sites-available/default

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

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

server {
	listen 443 ssl;
	listen [::]:442 ssl;

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

	# 서버의 root디렉토리 설정
	root /var/www/html;

	# 읽을 파일 목록
	index index.html index.htm index.nginx-debian.html;

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

 

    80번 포트로 수신되면 443 포트로 리다이렉션 시켜준다

    443 포트를 위한 서버 블록에는 ssl on 과 인증서의 경로를 작성해준다. 나머지는 기존 설정 그대로

 

8. 바뀐 설정을 nginx 에 적용

    # service  nginx  reload

 

9. php-fpm 설치 및 nginx 설정

    php : 서버 사이드 스크립트 언어

    nginx 는 웹서버이기 때문에 정적 콘텐츠만 다룰 수 있다. 동적 페이지 구현하기 위해서는 동적 콘텐츠를 읽고 html 로 변환시켜 웹 서버에게 다시 전달해주는 외부 프로그램(php) 필요

   이런 연결 과정의 방법을 정의한 것 == CGI

 

  # apt-get install -y php-fpm

  /etc/nginx 구성

  - sites-available : 설정파일 들어있는 곳

  - sites-enabled : 실행시킬 파일들만 symlink 로 연결해서 여기에 넣어둔다

  - nginx.conf : sites-enabled에 있는 파일들을 호출하는 파일. 서버 실행에 관한 정보를 적어둔다. 

# vim /etc/nginx/sites-available/default

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

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

server {
	listen 443 ssl;
	listen [::]:442 ssl;

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

	# Set root dir of server
	root /var/www/html;

	# Auto index # index.php 추가
	index index.html index.htm index.nginx-debian.html index.php;

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

10. nginx auto index 설정

autoindex?

    /etc/nginx/sites-available/default 파일에서 location / { } 부분에 `autoindex on` 추가

# vim /etc/nginx/sites-available/default

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

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

server {
	listen 443 ssl;
	listen [::]:442 ssl;

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

	# Set root dir of server
	root /var/www/html;

	# Auto index # index.php 추가
	index index.html index.htm index.nginx-debian.html index.php;

	server_name ft_server;
	location / {
        autoindex on;
		try_files $uri $uri/ =404;
	}

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

# service nginx reload

 

11. MariaDB 설치하기 (mysql)

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

- debian buster는 mariaDB 만을 지원한다.

- php-mysql : php에서 mysql에 접근할 수 있게 해주는 모듈

- php-mbstring : 2바이트 확장 문자를 읽을 수 있도록 해주는 모듈

 

12. 도커 종료 후 이미지 저장

 

2020/02/12

  1. 최근 저장한 도커 이미지 실행

    $ docker run -it -p 80:80 -p 443:443 mariadb-download

  2. # service nginx start

  3. php-fpm 실행


    # service php7.3-fpm start
    # service php7.3-fpm status

    php 테스트 > var/www/html/phpinfo.php
    <?php phpinfo(); ?>

    -> 127.0.0.1/phpinfo.php 로 접속하여 연동 되는지 확인
    확인 후에는 phpinfo.php를 삭제하는 것이 보안상 좋다고 한다.
    (# rm /var/www/html/phpinfo.php)
  4. phpmyadmin 설치

    # apt-get install -y wget

    // phpmyadmin 설치

    # wget https://files.phpmyadmin.net/phpMyAdmin/5.0.4/phpMyAdmin-5.0.4-all-languages.tar.gz

    // 압축 해제

    # tar -xvf phpMyAdmin-5.0.4-all-languages.tar.gz

    # rm phpMyAdmin-5.0.4-all-languages.tar.gz    // 압축파일 제거

  5. 서버가 phpMyAdmin 을 띄워줄 경로에 폴더를 통째로 올려주면 됨 (/var/www/html)

    > nginx 설정 부분에서 서버의 루트 디렉토리를 /var/www/html 로 지정함

    # mv phpMyAdmin-5.0.4-all-languages phpmyadmin
    # mv phpmyadmin /var/www/html/  => 압축해제한 파일을 이름을 바꿔서 phpmyadmin

  6. phpMyAdmin 설정

    1. phpmyadmin/config.sample.inc.php 파일을 복사해서 config.inc.php 생성
    2. config.inc.php 에 블로피시 암호를 만들어 넣기
    3. create_tables.sql을 가져와서 phpMyAdmin을 위한 테이블을 만든다

    # cp -p var/www/html/phpmyadmin/config.sample.inc.php var/www/html/phpmyadmin/config.inc.php
    # vi var/www/html/phpmyadmin/config.inc.php

    암호 생성 사이트  

    위 사이트에서 생성된 암호 복사해서 php 파일을 수정
    >> $cfg['blowfish_secret'] = '이 부분에 사이트에서 생성한 암호를 넣는다';

    create_tables.sql -> phpMyAdmin 을 위한 테이블 생성

    # service nginx reload
    # service php7.3-fpm restart
    # service mysql start
    # mysql < /var/www/html/phpmyadmin/sql/create_tables.sql -u root --skip-password

    # mysqladmin -u root -p password
    기존 패스워드 입력
    새로운 패스워드 입력

    # mysql
    mariadb > show databases;
    > CREATE DATABASE IF NOT EXISTS wordpress; // 디비 생성
    > show databases; // 생성된 디비 확인
    > exit

  7. phpMyAdmin 작동 확인

    # service mysql start
    -> localhost/phpmyadmin 접속

  8. DB 추가하기 - Wordpress 설치

    # wget https://wordpress.org/latest.tar.gz

    # tar -xvf latest.tar.gz

    # rm latest.tar.gz    -> 압축파일 삭제

    # mv wordpress/ var/www/html/

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

     - 소유자 변경

     -R : recursive, 에러메시지가 있어도 출력하지 않게 하는 커맨드

    - [owner]:[group] 변경할 유저와 그룹

  9. wordpress 설정

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

    # cp var/www/html/wordpress/wp-config-sample.php 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', 'root' );

    /** MySQL database password */
    define( 'DB_PASSWORD', 'yeosong' );

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

  10. Wordpress 작동 확인

    # service nginx reload
    -> localhost/wordpress 접속

# 마무리

추가한 기능들이 정상적으로 동작한다면, 지금까지 작업한 내용을 Dockerfile + srcs/ 에 지시문 형태로 정리하면 끝!

 

hello-bryan.tistory.com/163

 

[Docker] Docker cp : host 에서 Container 로 file copy

host , docker container file copy host filesystem 에서 docker 의 container 에 file 을 copy 하고 싶을 때 1. host -> docker container  - test file 생성  - docker cp [hostFilePath] [container_name]:[..

hello-bryan.tistory.com

docker cp [container_NAMES]:[container_file_path] [hostFilePath]

-> container names는 image 이름이 아니라 docker images 했을 때 제일 끝에 있는걸로 해야 된다.

 

- default, config.inc.php, wp-config.php

 

2020/02/13

1. run.sh에서 sql을 작성

service mysql start

echo "CREATE DATABASE IF NOT EXISTS wordpress;" \
          | mysql -u root --skip-password
echo "CREATE USER IF NOT EXISTS 'yoahn'@'localhost' IDENTIFIED BY 'yoahn';" \
          | mysql -u root --skip-password
echo "GRANT ALL PRIVILEGES ON wordpress.* TO 'yoahn'@'localhost' WITH GRANT OPTION;" \
          | mysql -u root --skip-password
echo "FLUSH PRIVILEGES" \
          | mysql -u root --skip-password

| mysql -u root --skip-password

-> 

 

"CREATE DATABASE IF NOT EXISTS wordpress;"

- wordpress DB가 존재하지 않으면 새로 생성

 

"CREATE USER IF NOT EXISTS 'yoahn'@'localhost' IDENTIFIED BY 'yoahn';"

- USER 생성

- create user 'userid'@'host = 접근권한' identified by '비밀번호';

접근권한 = localhost / % (외부 접근 권한 부여)

nickjoit.tistory.com/144

 

"GRANT ALL PRIVILEGES ON wordpress.* TO 'yoahn'@'localhost' WITH GRANT OPTION;"

- 특정 데이터베이스의 테이블 전체에 대한 사용자 추가

- ~ ON [DB이름].[테이블] TO 'mysql_ID'@'접속서버' with grant option

- grant 명령어를 사용하여 작업한 경우 flush privileges 실행할 필요 없음

 

wp-config.php 수정

/** MySQL database username */
define( 'DB_USER', 'root' );

/** MySQL database password */
define( 'DB_PASSWORD', 'yeosong' );

 

- sql로 추가한 사용자 id와 설정한 비밀번호가 wp-config.php의 설정파일과 같아야 한다

 

2. service mysql restart 를 마지막에 한번 더 하면 에러남

- restart 할 필요 없으므로 제외함

 

3. docker file 빌드하기

$ docker build . -t ft_server

-t 옵션

: 'name:tag' 포맷

 

$ docker run -it -p 80:80 -p 443:443 ft_server

-i (interactive)

-t (tty)

두 옵션을 같이 줘야 터미널 안에서 실행 가능

 

-p (host 포트):(컨테이너 포트)

호스트와 컨테이너 간의 포트 연결

호스트 컴퓨터에서 컨테이너에서 리스닝하고 있는 포트로 접속할 수 있도록 설정

 

 

nginx 설정파일 중 default파일에서 https 서버 블록에 default_server를 적으면 wordpress 에서 사용자 생성이 안된다.

 

++++

retry 하기 전에 다시 검토하다가 phpmyadmin 에서 root 계정 로그인이 안되는 문제를 해결해보려고 시도한 끝에 방법을 알아냈다!

 

먼저 tempDir 로 지정할 디렉토리가 생성되어 있지 않아서 오류가 났었다.

그래서 run.sh 파일에

mkdir /var/www/html/phpmyadmin/tmp

를 추가하고, php, nginx를 사용하는 사용자(www-data:www-data)가 해당 디렉토리에 대해 수정이 가능하도록 권한을 부여

-> 해결

 

* www-data 사용자

/etc/nginx/nginx.conf

파일에 보면 사용자 이름이 www-data로 되어있음

service php7.3-fpm start

service nginx start

하고 ps -ef 해보면 실행한 사용자 ID가 나오는데, www-data 사용자가 실행함

 

phpmyadmin 설정 스토리지가 완전히 설정되지 않아 일부 기능들이 활성화가 안됨

먼저 생성한 사용자 id / password 로 로그인 했더니 권한 관련된 오류가 나오는데 해결이 안되서 root 계정으로 로그인 가능하게 수정

 

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

 

mysqladmin -u root -p password

를 실행하면 비밀번호 변경이 가능한데, 기존 비밀번호, 새 비밀번호, 새 비밀번호 확인을 한다.

-> 엔터만 세번 눌러서 비밀번호 설정 없애기

 

service mysql restart;

mysql 재시작하여 설정 적용

 

 

reference

yeosong1.github.io/ftserver-풀이기록#-목표

 

ft_server 풀이 과정

🖥 42 학습 노트 by yeosong

yeosong1.github.io

kkim-blog.tistory.com/entry/KKIM의-ftserver-학습일지-02-Searching?category=1171564

 

KKIM의 ft_server 학습일지 - 0.2 Searching

KKIM's Study journal about FT_SERVER (42_Subject!) 0. Reference Links [ft_server] 총 정리 : 도커 설치부터 워드프레스 구축까지 과제 시작부터 마무리까지 기록한 내용들. velog.io ft_server 풀이 과정 🖥..

kkim-blog.tistory.com

velog.io/@hidaehyunlee/ftserver-총-정리-도커-설치부터-워드프레스-구축까지

 

[ft_server] 총 정리 : 도커 설치부터 워드프레스 구축까지

과제 시작부터 마무리까지 기록한 내용들.

velog.io

m.blog.naver.com/alice_k106/220340499760

 

[Docker Study] 3. 도커의 몇 몇 run 옵션들

사실 컨테이너를 올바르게 run만 하면 도커 사용방법은 절반은 익혔다고 생각합니다. 그만큼 도커를 혼자서...

blog.naver.com

 

lhb.kr/news/article.html?no=3101

 

nginx rewirte, redirect 주소변환 설정모음

nginx rewirte, redirect 주소변환 설정모음 nginx 에서 주소변경 nginx 에서 주소변환 # domain.com 으로 접속 시 newdomain.com 으로 리다이렉토 server { server_name domain.com; return 301 http://www.newdomain.com$request_uri; } #d

lhb.kr

stitchcoding.tistory.com/2

 

오십보백보 ft_server 시작하기

들어가기에 앞서 저는 웹 서버나 도커에 대한 지식이 0인 상태로 시작했습니다. 과제를 시작하기 전에는 '도커'와 '웹 서버'라는 단어만 들어봤고 이에 대한 개념은 지금도 명확하진 않습니다.

stitchcoding.tistory.com

 

반응형