https://velog.io/@zhy2on/Ubuntu-20.04-for-ARM-설치해보기
ubuntu 20.04 desktop 최소설치 & firefox 설치 환경으로 세팅했다.
https://velog.io/@zhy2on/Docker-간단-정리
sed -i
로 치환해야 할 부분을 환경변수로 바꿔줬다.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
자식 프로세스를 포크(fork)하여 생성하고 자식을 분기한 자신을 죽이면서 init이 고아가 된 자식 프로세스를 자기 밑으로 데려가도록
하는 방식이다. 이러한 방법을 ‘fork off and die’라 부르기도 한다. (참고)service start
, service stop
으로 각 서비스를 한 번 실행했다 종료시켜줘야 끊김이나 에러 없이 사용이 가능했다. service start를 하면 daemon이 작동할 때 필요한 파일들을 먼저 생성하는 경우가 있었고, running 중인 service를 stop 해야 daemon이 에러 없이 작동할 수 있었다. (참고)SIGTERM
등의 시그널이 들어왔을 때 제대로 핸들링을 하지 못하게 되는 일이 발생하게 된다는 것이다.dumb-init
이 만들어졌다.dumb-init
이 PID1이 되도록 실행하고, dumb-init이 나머지 프로세스를 관리할 수 있도록 해주면 위와 같은 문제를 해결할 수 있게 된다. (참고, 참고)mariadb 서버 역할을 한다.
mariadb-server
를 apt-get install로 설치한다. service mysql start
mysqld
커맨드를 입력하면 mysqld server가 실행된다. 이 때 먼저 mariadb 서비스를 종료해줘야 mysqld가 꾸준히 작동한다. (참고)service mysql stop
/etc/mysql/mariadb.conf.d/50-server.cnf
파일이 생긴다.bind-address
관련 부분이다. bind-address
를 0.0.0.0
으로 바꿔주면 다른 모든 ip에서 mariadb 서버에 접속하는 것을 허용할 수 있다. (참고)SET PASSWORD FOR 'root'@'localhost' = PASSWORD('{$WP_ADMIN_PASSWORD}');
로 설정해주고 /etc/mysql/debian.cnf
에서 password에 바꾼 root password를 추가해준다.nginx 서버 역할을 한다.
nginx
와 openssl
을 apt-get install로 설치한다.nginx -g 'daemon off';
/etc/nginx/sites-available/default
이 생긴다./etc/nginx/sites-enable
에도 심볼릭 링크를 걸어줘야 한다. default는 원래 있던 파일이기 때문에 심볼릭 링크가 이미 걸려있음.)listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/ssl/certs/nginx.crt;
ssl_certificate_key /etc/ssl/private/nginx.key;
ssl_protocols TLSv1.3;
root /var/www/html/wordpress;
index index.php index.html index.htm;
server_name {$DOMAIN_NAME};
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;
}
워드프레스 사이트 frontend 담당.
php-fpm
, mariadb-client
를 apt-get install로 설치한다. 추가로 redis-cache 플러그인 사용을 위해 redis-tools
도 설치한다.php-fpm7.3
패키지가 제일 최신임. but wordpress에서 7.4 이상 사용하라고 경고 뜸php-fpm8.1
을 설치해 주기 위해 이걸 참고WP-CLI
를 설치해준다. (참고)/etc/php/7.3/fpm/pool.d/www.conf
파일이 생긴다.listen = 9000
으로 바꿔준다.wp core download
를 하고 wp config create
로 wp-config.php
파일을 생성해준다. 이 때 dbname
, dbuser
, dbpass
를 mariadb container에서 설정해줬던 wordpress 관련 db 설정으로 적어준다. dbhost
는 mariadb container 이름인 mariadb로 해준다.(참고) (컨테이너가 같은 네트워크에 연결되어 있을 때 호스트 name은 container name과 같음)wp config set
으로 redis-cache를 사용하기 위한 configuration을 설정해준다. (참고, 참고)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 server를 담당할 컨테이너.
요청에 대한 결과를 미리 저장해두고 빠르게 사용할 수 있게 해주는 것이 cache이다.
redis는 cache 사용을 지원해주는 서비스.
redis-server
를 apt-get install로 설치해준다.redis-server /etc/redis/redis.conf
/etc/redis/redis.conf
파일이 생긴다.bind 0.0.0.0 ::1
로 바꿔준다.daemonize no
로 바꿔주어 foreground에서 실행될 수 있게 해준다. (참고)ftp server를 담당할 컨테이너.
ftp란 file transfer protocol로 서버와 클라이언트 사이의 파일 교환을 담당한다.
vsftpd
를 설치해준다. ftp container에선 추가로 dumb-init
을 설치해줬다. (vsftpd 데몬이 SIGTERM
에 대한 처리가 제대로 안 돼있어, PID1로 실행할 때 문제가 생겼었음. 이를 해결하기 위해 dumb-init
사용.)vsftpd
를 실행해준다./etc/vsftpd.conf
파일이 생긴다.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 서비스를 담당할 컨테이너.
adminer는 php-myadmin과 같은 데이터베이스 관리 도구이다.
데이터베이스를 웹에서 관리할 수 있음. php-myadmin보다 보안적으로 우세해서 Adminer가 더 권장된다고 한다.
php-fpm
과 php-mysqli
를 apt-get install로 설치한다.adminer
를 설치한다. (참고)adminer도 php 기반이기 때문에 php-fpm을 사용해주고(www.conf
에서 listen port 수정해주고 php-fpm daemon으로 돌리면 됨), nginx에서 fastcgi를 사용해 넘겨준다. 워드프레스와 비슷함.
goaccess server를 담당할 컨테이너
goaccess는 서버 log를 실시간 대시보드로 확인할 수 있는 서비스.
/usr/local/etc/goaccess/goaccess.conf
파일이 생긴다. 설정파일에서 time-format
, date-format
, log-format
부분을 파싱할 log format에 맞게 주석해제해준다. (참고)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
간단한 정적 웹사이트를 만들고 띄울 컨테이너. ex) 포트폴리오 사이트
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.cnf
의 password=
부분에 변경한 패스워드 추가해줘야 함
https://velog.io/@zhy2on/usrbinmysqladmin-connect-to-server-at-localhost-failed