[42Seoul] 인셉션

오젼·2022년 10월 29일
0

[42Seoul]

목록 보기
21/24

VM 세팅(UTM)

https://velog.io/@zhy2on/Ubuntu-20.04-for-ARM-설치해보기

ubuntu 20.04 desktop 최소설치 & firefox 설치 환경으로 세팅했다.

Common Ground

docker

https://velog.io/@zhy2on/Docker-간단-정리

environment

  • docker에서는 컨테이너에서 사용할 환경변수를 미리 지정하고, 파일로 넣어줄 수 있다.
  • 대신 image 단계에서 들어가는 게 아니라 container 단계에서 들어가기 때문에 환경변수를 사용하려면 ENTRYPOINT나 CMD에서 사용 해줘야 했었다. (RUN에서 환경변수 사용하면 적용 안 됨)
  • 때문에 COPY로 이미지 단계에서 복사할 파일에는 {$환경변수} 와 같이 치환해야할 부분을 써주었고
  • ENTRYPONIT나 CMD에서 스크립트 안에 sed -i로 치환해야 할 부분을 환경변수로 바꿔줬다.
    (처음엔 그냥 $환경변수 이렇게 써줬는데, 이러면 생기는 문제가 $wpdb, $wpdb_user 이렇게 있다고 치면 sed를 할 때 $wpdb_user의 $wpdb까지 치환 하고 _user를 남기는 경우가 발생)

ex)
mariadb dockerfile에서 COPY했던 sql 파일

CREATE DATABASE IF NOT EXISTS {$WP_DB_NAME};
CREATE USER IF NOT EXISTS '{$WP_ADMIN}'@'%' IDENTIFIED BY '{$WP_ADMIN_PASSWORD}';
GRANT ALL PRIVILEGES ON {$WP_DB_NAME}.* TO '{$WP_ADMIN}'@'%';
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('{$WP_ADMIN_PASSWORD}');
FLUSH PRIVILEGES;

ENTRYPOINT 스크립트에서 환경변수로 치환해줬던 부분

sed -i s/'{$WP_DB_NAME}'/$WP_DB_NAME/g /tmp/db-config.sql
sed -i s/'{$WP_ADMIN}'/$WP_ADMIN/g /tmp/db-config.sql
sed -i s/'{$WP_ADMIN_PASSWORD}'/$WP_ADMIN_PASSWORD/g /tmp/db-config.sql

daemon

  • 데몬은 대개 부모 프로세스를 갖지 않으며, 즉 PPID가 1이며, 따라서 프로세스 트리에서 init 바로 아래에 위치한다. 데몬이 되는 방법은 일반적으로 자식 프로세스를 포크(fork)하여 생성하고 자식을 분기한 자신을 죽이면서 init이 고아가 된 자식 프로세스를 자기 밑으로 데려가도록 하는 방식이다. 이러한 방법을 ‘fork off and die’라 부르기도 한다. (참고)
  • 컨테이너에서 daemon을 foreground로 계속 실행시켜 놓을 때 먼저 service start, service stop으로 각 서비스를 한 번 실행했다 종료시켜줘야 끊김이나 에러 없이 사용이 가능했다. service start를 하면 daemon이 작동할 때 필요한 파일들을 먼저 생성하는 경우가 있었고, running 중인 service를 stop 해야 daemon이 에러 없이 작동할 수 있었다. (참고)

PID1 & dumb-init

  • Docker container는 CMD 혹은 ENTRYPOINT로 실행하는 프로세스가 PID1이 되게 된다.
  • 이 때 문제는 원래 init process로 설계되지 않은 프로세스가 PID1을 맡게 되면서 PID1에 대한 SIGTERM등의 시그널이 들어왔을 때 제대로 핸들링을 하지 못하게 되는 일이 발생하게 된다는 것이다.
  • 이를 해결하기 위해 dumb-init이 만들어졌다.
  • dumb-init이 PID1이 되도록 실행하고, dumb-init이 나머지 프로세스를 관리할 수 있도록 해주면 위와 같은 문제를 해결할 수 있게 된다. (참고, 참고)

MariaDB Container

mariadb 서버 역할을 한다.

과정

  • mariadb-server를 apt-get install로 설치한다.
  • mariadb를 실행한 후 sql문을 넣어 wordpress에 필요한 데이터베이스와 user를 생성한다.
    mariadb 실행: service mysql start
  • mysqld 커맨드를 입력하면 mysqld server가 실행된다. 이 때 먼저 mariadb 서비스를 종료해줘야 mysqld가 꾸준히 작동한다. (참고)
    mariadb 종료: service mysql stop

configuration

  • mariadb를 설치하면 /etc/mysql/mariadb.conf.d/50-server.cnf 파일이 생긴다.
    이 파일에서 mysqld server관련 configuration이 가능하다.
  • 바꿔줘야 할 부분은 bind-address 관련 부분이다. bind-address0.0.0.0으로 바꿔주면 다른 모든 ip에서 mariadb 서버에 접속하는 것을 허용할 수 있다. (참고)
  • 포트는 mariadb의 기본포트를 그대로 둔다. 50-server.cnf에서 확인할 수 있듯 mariadb의 기본포트는 3306이다. (참고)
  • 추가로 다른 ip에서 데이터베이스에 접근을 할 수 있게 하려면 mariadb에서 데이터베이스에 대한 접근권한을 줘야 한다. (참고)
  • mariadb에 root password를 설정해줘야 한다. SET PASSWORD FOR 'root'@'localhost' = PASSWORD('{$WP_ADMIN_PASSWORD}');로 설정해주고 /etc/mysql/debian.cnf에서 password에 바꾼 root password를 추가해준다.

NGINX Container

nginx 서버 역할을 한다.

과정

  • nginxopenssl을 apt-get install로 설치한다.
  • openssl로 tls에 필요한 certification을 만든다. (참고, 참고)
    대신 self certification이라 공인인증된 것은 아니어서, 웹페이지를 접속할 때 warning이 뜬다. 파이어폭스 기준 Advancced 클릭후 Accept 눌러주면 됨
  • nginx를 과제에서 요구하는대로 세팅한다. 허용 포트, 도메인 네임, ssl 설정 등을 토대로 server block을 만든다.
  • nginx를 foreground로 실행한다. nginx -g 'daemon off';

configuration

  • nginx를 설치하면 /etc/nginx/sites-available/default이 생긴다.
    default 파일을 원하는 내용으로 바꾼다.
    (default 파일 말고 새로운 파일을 만들어 설정을 해주고 싶다면 만든 파일을 ln -s을 사용해 /etc/nginx/sites-enable 에도 심볼릭 링크를 걸어줘야 한다. default는 원래 있던 파일이기 때문에 심볼릭 링크가 이미 걸려있음.)
  1. 포트 관련 설정. 443포트로 ssl 접속을 하게 한다.
listen 443 ssl;
listen [::]:443 ssl;
  1. ssl(tls) 관련 설정. ssl certification과 certificate key 위치를 적는다. ssl protocol을 지정한다.
ssl_certificate /etc/ssl/certs/nginx.crt;
ssl_certificate_key /etc/ssl/private/nginx.key;
ssl_protocols TLSv1.3;
  1. 기본 디렉토리와 index, 서버 네임을 설정한다.
root /var/www/html/wordpress;
index index.php index.html index.htm;
server_name {$DOMAIN_NAME};
  1. location block을 설정한다. wordpress는 php파일 기반인데 nginx는 php파일을 처리하지 못한다. 때문에 fastcgi와 php-fpm을 이용해 처리해줘야 된다. 방법은 워드프레스 컨테이너에서 php-fpm을 설치하고 php 서버를 열어준 다음 fastcgi_pass로 보내주면 된다. (참고, 참고)
location ~ \.php$ {
		include /etc/nginx/fastcgi_params;
		fastcgi_split_path_info ^(.+\.php)(/.+)$;
		fastcgi_pass wordpress:9000;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_index index.php;
}

Wordpress+PHP Container

워드프레스 사이트 frontend 담당.

과정

  • php-fpm, mariadb-client를 apt-get install로 설치한다. 추가로 redis-cache 플러그인 사용을 위해 redis-tools도 설치한다.
  • 이 때 debian:buster 기반 apt는 php-fpm7.3 패키지가 제일 최신임. but wordpress에서 7.4 이상 사용하라고 경고 뜸
  • 그래서 현재 최신 버전인 php-fpm8.1을 설치해 주기 위해 이걸 참고
  • WP-CLI를 설치해준다. (참고)
  • wp command를 이용해 wordpress 기본 파일을 다운로드 하고, configuration 파일을 설정해준다. 이후 wordpress를 설치해주고 user를 생성하고, reids 플러그인도 설치해준다.
  • php-fpm을 9000 포트에서 listen하도록 설정해주고, php-fpm을 foreground로 실행시켜준다.

configuration

  • php-fpm을 설치하면 /etc/php/7.3/fpm/pool.d/www.conf 파일이 생긴다.
  • 해당 파일에서 9000포트를 listen할 수 있도록 listen = 9000으로 바꿔준다.
  • wordpress 관련 configuration은 wp-config.php에서 하게 된다.
  • wp core download를 하고 wp config createwp-config.php 파일을 생성해준다. 이 때 dbname, dbuser, dbpass를 mariadb container에서 설정해줬던 wordpress 관련 db 설정으로 적어준다. dbhost는 mariadb container 이름인 mariadb로 해준다.(참고) (컨테이너가 같은 네트워크에 연결되어 있을 때 호스트 name은 container name과 같음)
  • wp config set으로 redis-cache를 사용하기 위한 configuration을 설정해준다. (참고, 참고)
  • configuration 설정 후엔 redis 플러그인을 설치하고 활성화 해준다.
  • 마지막으로, nginx 서버로 정상 운영 할 수 있도록 워드프레스 디렉토리, 파일들의 소유자, 소유그룹을 www-data로 바꿔줬다. (chown -R은 하위 디렉토리, 파일에도 적용하는 옵션)

ex) wp command example

wp core download --allow-root

wp config create --dbname=$WP_DB_NAME --dbuser=$WP_ADMIN --dbpass=$WP_ADMIN_PASSWORD --dbhost=mariadb --allow-root
wp config set WP_REDIS_HOST redis --allow-root
wp config set WP_REDIS_PORT 6379 --raw --allow-root
wp config set WP_CACHE_KEY_SALT $DOMAIN_NAME --allow-root
wp config set WP_CACHE true --raw --allow-root

wp core install --url=$DOMAIN_NAME --title="$WP_TITLE" --admin_user=$WP_ADMIN --admin_password=$WP_ADMIN_PASSWORD --admin_email=$WP_ADMIN_EMAIL --skip-email --allow-root
wp user create $WP_USER $WP_USER_EMAIL --user_pass=$WP_USER_PASSWORD --role=author --allow-root
	
wp plugin install redis-cache --activate --allow-root
wp plugin update --all --allow-root
wp redis enable --allow-root

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

이제부턴 보너스다.
보너스는 redis-cache를 설치하고, adminer를 설치하고, ftp server를 구축하고, 유용하다고 생각되는 서비스를 하나 더 구현하고, simple한 static website를 만드는 것이었다.


Redis Container

redis server를 담당할 컨테이너.
요청에 대한 결과를 미리 저장해두고 빠르게 사용할 수 있게 해주는 것이 cache이다.
redis는 cache 사용을 지원해주는 서비스.

과정

  • redis-server를 apt-get install로 설치해준다.
  • 관련 설정 후 foreground로 redis-server를 실행해준다.
    redis-server /etc/redis/redis.conf

configuration

  • redis-server를 설치하고 나면 /etc/redis/redis.conf 파일이 생긴다.
  • 해당 파일에서 다른 클라이언트의 접속을 허용해주기 위해 bind 0.0.0.0 ::1로 바꿔준다.
  • daemonize no로 바꿔주어 foreground에서 실행될 수 있게 해준다. (참고)

FTP Container

ftp server를 담당할 컨테이너.
ftp란 file transfer protocol로 서버와 클라이언트 사이의 파일 교환을 담당한다.

과정

  • vsftpd를 설치해준다. ftp container에선 추가로 dumb-init을 설치해줬다. (vsftpd 데몬이 SIGTERM에 대한 처리가 제대로 안 돼있어, PID1로 실행할 때 문제가 생겼었음. 이를 해결하기 위해 dumb-init 사용.)
  • ftp에 사용할 user를 생성해준다.
  • ftp에 접속할 user에 관한 설정들을 해준다.
  • vsftpd를 실행해준다.

configuration

  • ftp를 설치하고 나면 /etc/vsftpd.conf 파일이 생긴다.
  • ftp 접속 유저를 생성해주고, userlist를 설정해준다. 해당 파일을 필요한 내용대로 수정해준다. (참고)
  • wordpress 디렉토리에 대한 소유자 권한을 변경해준다.

ex) ftp 접속할 때 사용할 user는 wordpress 파일들의 소유자인 www-data로 해주었다. 대신 www-data의 shell과 기본 디렉토리를 변경해주고 비밀번호를 설정해줬다.

chsh -s /bin/bash www-data #user의 shell변경
usermod -d /var/www/html/wordpress www-data #user default directory 변경
echo "www-data:$FTP_PASSWORD" | chpasswd #user password 변경
chown -R www-data:www-data /var/www/html/wordpress
echo www-data | tee -a /etc/vsftpd.userlist > /dev/null 2>&1

Adminer Container

adminer 서비스를 담당할 컨테이너.
adminer는 php-myadmin과 같은 데이터베이스 관리 도구이다.
데이터베이스를 웹에서 관리할 수 있음. php-myadmin보다 보안적으로 우세해서 Adminer가 더 권장된다고 한다.

설치

  • php-fpmphp-mysqli를 apt-get install로 설치한다.
  • adminer를 설치한다. (참고)

과정

adminer도 php 기반이기 때문에 php-fpm을 사용해주고(www.conf에서 listen port 수정해주고 php-fpm daemon으로 돌리면 됨), nginx에서 fastcgi를 사용해 넘겨준다. 워드프레스와 비슷함.

GoAccess Container


goaccess server를 담당할 컨테이너
goaccess는 서버 log를 실시간 대시보드로 확인할 수 있는 서비스.

과정

configuration

  • nginx로 간단하게 서버 설정을 해준다. goaccess 서버는 nginx container에서 프록시패스로 넘겨줄 것이고 해당 uri를 그대로 사용할 거라 defulat_server;와 server_name _;을 사용해줬다. (참고, 참고)
  • goaccess --dcf 명령어를 실행하고 나면 /usr/local/etc/goaccess/goaccess.conf 파일이 생긴다. 설정파일에서 time-format, date-format, log-format 부분을 파싱할 log format에 맞게 주석해제해준다. (참고)
  • 나머지 설정은 goaccess를 실행할 때 옵션으로 넣어줬다.
    f: goaccess로 통계낼 로그파일을 지정해준다.
    o: output html파일을 지정해준다.
    --ws-url: goaccess는 자체적으로 websocket server를 열 수 있기 때문에 리얼타임 html을 구현할 수 있게 된다. 기본은 loclhost ws를 사용하게 되는데, 내 경우 nginx container에서 https 설정을 하고 프록시로 넘겨준 거라 ws가 아니라 wss로 웹소켓 url을 사용해줘야했다.
    tz: timezone 설정.
    real-time-html: websocket server를 사용해 real-time html을 생성한다.
    daemonize: damon으로 돌린다. 내 경우 nginx를 foreground로 돌려 컨테이너를 켜둘 것이기 때문에 goaccess는 백그라운드에서 돌아가게 해주었다.
goaccess \
		-f /var/log/nginx/access.log \
		-o /var/www/html/wordpress/goaccess/index.html \
		--ws-url=wss://$DOMAIN_NAME/goaccess/ws:443 --port 7890 \
		--tz="UTC/GMT +9" --real-time-html --daemonize

Simple-Static-Web Container

간단한 정적 웹사이트를 만들고 띄울 컨테이너. ex) 포트폴리오 사이트

과정

  • 깃에 html, css로 static-website를 작성해 올려두었다.
  • node.js, express를 사용해 서버를 실행할 수 있게 해두었음
  • git clone을 하고 nodejs를 apt-get install 설치한 다음 node로 실행하면 됨.
node /simple-static-web/index.js;

끝 ㅠㅠㅠㅠ 뻘짓 목록

메모장
https://velog.io/@zhy2on/Inception-Nginx-공부

utm error
https://velog.io/@zhy2on/UTM-errorCould-not-set-up-host-forwarding-rule

컨테이너 데몬실행 전 service start stop 해야함 ex) php-fpm
https://velog.io/@zhy2on/컨테이너에서-데몬을-작동시킬-때

docker-vm-mac 으로 연결해서 사용하던 도중 wordpress domain name 설정 관련 오류 -> 걍 vm desktop 모드로 변경
https://velog.io/@zhy2on/wordpress

server의 index 제대로 설정 안 해줘서 생긴 오류 + directory는 indexing이 안 된다. (autoindex on을 하면 되긴 함. 근데 그럼 디렉토리 구조가 출력됨)
https://velog.io/@zhy2on/wordpress-403-forbidden-error

container PID1 관련 문제. dumb-init으로 해결
https://velog.io/@zhy2on/vsftpd-container-kill-SIGTERM이-안-먹음

container가 중간에 0으로 종료하지 않을 때 생기는 에러.
https://velog.io/@zhy2on/Error-response-from-daemon-No-such-container

nginx server block에서 server_name 으로 _; 사용하고 싶을 때 default_server랑 같이 써줘야 하는 거였음
https://velog.io/@zhy2on/rewrite-or-internal-redirection-cycle-while-internally-redirecting-to-server

mariadb의 root password 변경하면 /etc/mysql/debian.cnfpassword= 부분에 변경한 패스워드 추가해줘야 함
https://velog.io/@zhy2on/usrbinmysqladmin-connect-to-server-at-localhost-failed

0개의 댓글