저번 포스팅에서는 도커 컨테이너에 데비안 버스터 운영체제를 기반으로 이미지를 생성하고, 그 컨테이너에 NginX 웹 서버를 설치하고, Self-signed SSL 인증서를 설치하는 단계까지 진행했다.
어제 밤에 localhost 80번 포트에서 phpmyadmin 화면이 뜨지 않아 학교 사람들에게 도움을 구하는 과정에서 새로운 사실을 알게 되었다. 첫째, 나는 아직 Dockerfile을 작성하지 않고 컨테이너 위에서 커맨드라인을 입력하는 방식으로 한 단계씩 진행해 왔는데, 여태까지 쉘 커맨드라인에 작성한 명령들을 Dockerfile 문법으로 바꾸어 Dockerfile에 명시할 수 있다는 점. 둘째, 그 Dockerfile 명세를 기반으로 Docker를 실행하여 원하는 환경을 구성하는 이미지를 자동으로 생성할 수 있다는 점.
왜 사람들이 Docker를 꼭 배워야 한다고 하는지 이해하지 못했는데, 수십 개의 커맨드라인, 그보다 몇 배는 많은 설정과 업데이트 등의 과정을 생략하고 원하는 환경 설정을 위해 한 번에 자동화해주는 도구라는 것을 알고 나니 이해가 된다.
...를 회고 차원에서 기록하자면, NginX configuration 파일에서, 80번 포트를 Listen하는 서버 블럭 내에 /var/www/html/
을 루트로 설정해 주는 커맨드와, php 파일들을 실행할 수 있는 설정 커맨드들이 부재했기 때문이었다. 이 부분은 PHP-fpm에 대한 이해 없이 단순히 커맨드라인만을 따라하다 보니 생긴 문제였는데, 오늘 이 내용을 보충하고 오류가 발생했던 부분들을 다시 짚어보기로 한다.
PHP-fpm에 대해 이해하려면 먼저 CGI의 개념을 알아야 한다.
CGI(Common Gateway Interface)란, 웹 서버에서 요청을 받아 외부 프로그램에 이를 넘겨주면, 외부 프로그램이 그 파일을 읽어 html 문서로 변환하는 단계를 거치는 것을 의미한다. 즉, 웹 서버와 외부 프로그램 사이에서 정보를 주고받는 방법이나 규약들을 말한다. 더 자세한 설명은 여기를 참조한다. 이 게시물에 웹 서버에 대한 기본 개념과, 정적/동적 웹 서버의 차이, 그리고 웹 서버의 통신 프로세스에 대한 내용이 잘 정리되어 있으니 나중에 다시 볼 것.
PHP-fpm은 PHP FastCGI Process Manager의 약자로, CGI보다 빠른 버전의 관리 도구이다. Fast CGI는 요청이 이루어질 때마다 이미 생성된 프로세스를 가지고 구동하기 때문에, 처리가 일반 CGI보다 빠르다. Apache 웹 서버에서는 php 모듈이 이미 포함되어 있기 때문에 그냥 처리가 가능하지만, nginx에서는 Php-fpm을 따로 설치해 연동해 주어야 한다.
apt-get install -y php-fpm
apt 도구를 사용하여 php-fpm을 설치하고, 질문에는 모두 yes로 답한다. (-y 옵션) NginX의 설정 파일은 아래 경로에 위치해 있다.
/etc/nginx/sites-available/default
나는 계속 위의 경로를 입력하여 파일에 접근했는데, /etc/nginx/sites-enabled/
에도 symbolic link가 걸려 있어서 같은 내용이 반영된다고 한다.
/etx/nginx/
파일 내부 트리 구조와 nginx 설정 파일에 대한 더 자세한 내용이 궁금하다면 여기를 참조.
localhost의 80번 포트 서버 블록 설정.
localhost의 443번 포트 서버 블록 설정.
php 블럭의 주석을 해제해 주고, php -v
를 이용하여, fastcgi_pass 옵션의 적용 사항들이 현재 설치되어 있는 PHP 버전과 동일한지 체크한다. index
명령어(지시어)에 index.php
를 마지막에 추가하여, 인덱스로 사용할 파일들을 명시해 준다. configuration 파일을 수정한 뒤에는 항상 저장하고 나간 뒤, service nginx reload
를 입력하여 입력 사항을 반영해 준다.
NginX는 설정 파일 내에, 지시어와 함께 중괄호{}로 묶인 블럭을 통해 계층 구조로 실행된다. 서버에 요청이 있을 시에는 명세에 해당되는 내용을 비교해 보고, 해당 요청을 처리할 블럭을 찾아서 결정하는 것이다.
위 이미지에서 볼 수 있는 server {...}
블록은, 가상 서버의 부분 집합으로 이해할 수 있다. 도메인 네임, IP 주소, 포트 넘버에 대한 정보를 기반으로 요청을 처리할 블럭을 찾는다. 여러 개가 동시에 존재할 수 있다. 그리고 location {...}
블럭은 서버 블럭 내에 위치한다. 서로 다른 URI(Uniform Resource Indicator)들과, 자원에 따라 들어온 요청을 처리하는 방법을 정의한다.
어제 발생했던 오류는, 80번 포트로 연결되는 서버에 root와 location을 지정하지 않아 발생한 문제였다.
저장하고 빠져나와, service php7.3-fpm start
와 service php7.3-fpm staturs
를 입력한 뒤 제대로 작동하는지 확인해 보자. OK 사인이 뜨면 성공이다.
맨 앞 포스팅에서 정리했듯, MySQL은 관계형 데이터베이스 관리 시스템 (RDBMS)이다. 표준 데이터베이스 질의 언어 SQL(Structured Query Language)를 사용하는 오픈 소스 시스템으로, 매우 빠르고 유연하며 사용하기 쉽다(???). Multi user, Multi thread를 지원하고, C, C++, Eiffel, Java, Perl, PHP, Python Script 등을 위한 응용 프로그램 인터페이스 (API)를 제공한다.
알아둘 점 우리는 현재 LEMP 스택을 구축하고 있지만, LAPM (Linux + Apache + MySQL + PHP Script) 스택 또한 웹 개발에 널리 사용되는 웹 개발 환경 구성 중 하나라고 한다.
MySQL은 데이터베이스를 효율적으로 관리해 주는 시스템 정도로 알아두자. 지금까지 진행했던 Docker X Debian:buster X NginX X PHP-fpm 에 mysql(MariaDB)를 설치해 보자.
apt-get -y install mariadb-server php-mysql
명령어로 설치한다. 이후 터미널에서 mysql
을 입력하면, MariaDB Monitor이 실행된다.
PHPMyAdmin은 MySQL을 GUI (Graphic User Interface)로 사용할 수 있도록 하는 오픈소스 도구이다. PHPMyAdmin을 사용하면, GUI를 제공하는 목적이 그렇듯, console에서 직접 커맨드를 이용하여 작업하는 것보다 훨씬 쉽게 DB 작업이 가능하다.
데비안에 phpmyadmin을 바로 다운로드 할 수 있게 하는 패키지는 현재 존재하지 않아서, wget
을 이용해서 직접 다운로드 한다. apt-get install -y wget
으로 wget
을 다운로드 해 준다.
wget이란? GNU Wget은 HTTP 통신 또는 FTP 통신을 사용해 서버에서 파일이나 컨텐츠를 다운로드할 때 사용하는 소프트웨어이다. Wget은 웹 페이지의 하이퍼링크를 순회하면서 웹 페이지의 컨텐츠를 다운로드하는 크롤링 기능을 가지고 있다.
이후, wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.tar.gz
로 phpmyadmin을 직접 다운로드 후, tar -xvf phpMyAdmin-5.0.2-all-languages.tar.gz
로 압축을 해제해 준다. (Piscine Day 00~01때 많이 봤던 Linux Shell 관련 지식들이 많이 등장한다.)
이후 관련 파일들을 phpmyadmin 폴더에 옮겨 주고, 이 폴더를 root 경로에 다시 옮겨 준다.
mv phpMyAdmin-5.0.2-all-languages phpmyadmin
mv phpmyadmin /var/www/html/
cp -rp var/www/html/phpmyadmin/config.sample.inc.php var/www/html/phpmyadmin/config.inc.php
phpmyadmin의 config.inc.php 파일을 샘플 파일을 복사해다가 생성하고 루트의 phpmyadmin 폴더에 옮겨 준다.
vi var/www/html/phpmyadmin/config.inc.php
phpmyadmin 설정 파일을 열어서, blowfish 해시 생성기를 이용해 해시 문자열을 생성해 줄 것이다.
이 단계까지 하고, localhost:80/phpmyadmin을 입력했을 때 뜨는 로그인 창에서 계속 로그인이 안 돼 애를 먹었다. 문제를 해결하려고 Password 설정 없이 root 아이디로 로그인하는 옵션을 True 값으로 바꾸었다가 mysql조차 실행이 안 되는 상황에 맞닥뜨렸다. 혹시 나와 같은 문제를 겪은 사람이 있을까봐 해결법을 공유한다. 만약 해당되지 않는다면 다음 단계로 넘어가면 된다.
발생하는 문제는 두 가지였다. (1) PHPMyAdmin 페이지에서 root ID와 설정한 비밀번호로 로그인이 안 된다. (2) 1번 문제를 해결하기 위해 비밀번호를 재설정 했는데, 이후로 mysql조차 실행이 안 된다. 그래서 위 이미지에서 볼 수 있듯, 다양한 명령어를 입력해 봤는데도 Access denied 에러가 떴다. 물론 로그인조차 제대로 안 됐다.
해결 방법은 아래와 같다. mysql -u root -p
를 입력하고, Enter Password:가 뜨면, 기존에 설정했던 비밀번호를 입력한다. 그러면 MariaDB monitor가 정상 작동되고, 이 상태에서 아래 명령어들을 입력한다.
GRANT ALL PRIVILEGES ON wordpress.* TO 'root'@'localhost' WITH GRANT OPTION;
update mmysql.user set plugin='' where user='root';
FLUSH PRIVILEGES;
CREATE DATABASE wordpress;
이후 localhost/PHPMyAdmin 페이지로 들어가서, ID: root, PW: 기존 설정한 비밀번호로 로그인을 해보면 아래와 같은 화면이 뜬다.
위 단계까지 하면 PHPMyAdmin을 통해 MySQL에 WordPress를 위해 사용할 데이터베이스 생성까지 마쳤다. 이제 WordPress가 무엇인지 알아보고 WordPress를 설치해 본다. 그 전에, CMS의 개념부터 확인하기.
WordPress는 CMS(Content Management System)의 일종이다. 말 그대로 컨텐츠를 관리하는 시스템이다. 현재 워드프레스가 압도적 비율로 1위이다. 쉽게 말해서, 나처럼 프리랜서로 일 하는 사람들이 클라이언트로 하여금 Administration을 설정하거나, 변경하거나, 컨텐츠를 업로드하고 수정하고 삭제하는 등의 기능을 이를 통해 쉽게 지원해줄 수 있다.
전통적인 CMS의 경우가 워드프레스(PHP), 드루팔(PHP), 키스톤(JavaScript), 앤듀로(JavaScript)에 속한다. 요새 인기를 얻고 있는 헤드리스 CMS의 경우가 Contentful, Prismic.io, Strapi 등이다. 아마 Contentful에 대해서 곧 공부할 일이 있을 것 같다.
설치를 해 보자.
wget https://wordpress.org/latest.tar.gz
커맨드를 입력하여 wget으로 직접 받아오고, tar -xvf latest.tar.gz
커맨드로 압축을 해제한 후, mv wordpress/ var/www/html/
로 경로를 설정해 준다.
이후 chown -R www-data:www-data /var/www/html/wordpress
커맨드를 입력하여 wordpress의 소유자와 그룹을 변경(chown)해 준다.
이후 주소창에서 localhost/wordpress로 들어가면, wordpress 생성 화면이 뜬다. 언어를 설정하고, 주의 사항을 읽은 뒤 설치를 시작하자.
사용자명은 root로 입력하고, 암호는 기존에 설정했던 PHPMyAdmin 암호와 동일하게 실행한다. 이후 WordPress 계정을 생성하고, 설치를 누르면, Dashboard 화면이 뜨면서 Admin 페이지를 볼 수 있다. 마찬가지로, localhost/phpmyadmin 으로 접속해서 wordpress DB에 접속했을 때도 여러가지 컨텐츠들이 업데이트 된 것을 볼 수 있다.