Ubuntu Server(18.04) + LAMP + WordPress

이글루스에 있는 VirtualBox + Ubuntu Server(16.04) + LAMP + WordPress 를 가져왔다. 불필요한 부분/잘못된 부분을 수정했고, 추가된 내용도 있다.
이전 글은 VBox 에서 사용함을 전제로 했지만, 이 글은 꼭 그렇지는 않다.

지난 번과 마찬가지로 다음 글을 참고했다.

How To Install WordPress with LAMP on Ubuntu 18.04


진행을 위해, 우분투 서버 관리자의 ID 는 serveradmin 이라고 하기로 한다.

우분투 서버 설치 중 openssh 만 선택한다. Apache, MariaDB, PHP 는 수동으로 설치한다.

수동 설치는 역시 위의 digitalocean.com 에 있는 다른 글을 참고한다.

How To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 18.04

위 글에선 MySql 을 사용했지만, 이 글에선 MariaDB 를 사용한다.
일단, 모두 합쳐 설치는 이렇게 할 수 있다.

sudo apt install apache2 mariadb-server php libapache2-mod-php php-mysql php-gd php-xml

ufw 를 사용한 방화벽 설정법도 나오는데, 아직 사용해보지 않아서 이 부분은 그냥 넘긴다.

웹서버가 잘 설치되었는지 확인하고자 하면, 웹브라우저를 열고 서버 ip 주소를 쳐보면 된다. 서버주소가 192.168.0.2 라고 했을 때, 웹브라우저 주소창에 http://192.168.0.2 라고 입력해서 환영문구가 나오면 성공한 것이다.
이젠 서버에 터미널로 접속해서 나머지 (다소 복잡한) 작업들을 해줘야 한다. 터미널을 열고 서버에 할당된 IP로 ssh 접속을 한다.

ssh serverid@ip주소
 ex) ssh serveradmin@192.168.0.2

서버 설정

1. Update & Upgrade

위에서 처럼 서버에 접속하고 난 뒤, update && upgrade 를 해준다.

$ sudo apt update && sudo apt upgrade

2. MariaDB 설정.

MariaDB 에 관해서는 ‘Nextcloud 설치를 위한 데비안/우분투용 mariadb에서 mysql root 권한(Authentication) 이해.’MariaDB; 인증(Authentication) 문제를 참고하라.
간단하게 말하자면, ‘설치 후 mysql_secure_installation 을 실행하고, MySql root 용 Password 인증은 사용하지 말라’ 가 되겠다. 자세한 이유는 위 글들에 정리되어 있다.
이렇게 하면 결국 시스템 root 가 mysql root 가 되어버리고, 이게 MariaDB 개발진의 의도다. (digitalclean.com 에 따르면, MySql 도 같은 상황으로 보인다.)

그런데, 이 상태라면 phpMyAdmin 을 root 로 접근할 방법이 없어진다. 이 내용도 역시 위 문서에 나와있다.

“This(To authenticate using the auth_socket plugin) allows for some greater security and usability in many cases, but it can also complicate things when you need to allow an external program (e.g., phpMyAdmin) to access the user.”


Complicated 라고만 써놨고, 어떻게 해야 하는 지에 대해선 답이 없다.
아마도, mysql 관리자를 만드는 방법이 해법이 될 듯 한데, Nextcloud 설치를 위한 데비안/우분투용 mariadb에서 mysql root 권한(Authentication) 이해. 마지막(세번째) 항목(DBA 생성)에 방법을 적어놓았다.

3. WordPress 내려 받고, 설치.

서버에 로그인한 상황에서, 다음과 같이 명령을 내리면 WP 최신판을 받을 수 있다. 아래 WP 는 영문판이다.

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

다음, 압축을 풀어준다.

$ tar xvzf latest.tar.gz

(한국어판을 받으려면 ‘워드프레스 한국어 홈페이지‘에서 다운로드 주소를 알아낸 뒤 wget 이후에 써줘야 한다.)

압축을 해제하면, wordpress 라는 디렉토리가 생기는데, 이걸 그대로 쓰지 말고, 여기에 약간 ‘조작’ 을 해줘야 한다.
먼저, WordPress 가 사용할 .htaccess 파일을 WordPress root 에 생성하고 권한을 조정한다. 이 파일이 있어야 WordPress 가 원활히 작동한다.

$ touch ./wordpress/.htaccess
$ chmod 660 ./wordpress/.htaccess

다음은, 업그레이드판을 저장할 공간을 만들어줘야 한다.

mkdir ./wordpress/wp-content/upgrade

조작은 여기까지. 이 디렉토리를 웹서버가 인식하는 위치로 옮긴다.
위에서 아파치를 설치했고, 우분투 아파치가 인식하는 웹디렉토리는 /var/www 이므로, 그 아래로 적절히 복사해준다. (여기선 /var/www/wordpress 디렉토리를 사용하기로 한다.)

복사가 끝났으면, 소유권을 현재 사용자와 www-data 그룹으로 바꾼다.

$ sudo cp -a ./wordpress /var/www
$ sudo chown -R serveradmin:www-data /var/www/wordpress

위에 연결해놓은 Tutorial 에서는 바로 복사하지 않고, wp-config.php 를 생성한 후에 복사했는데, 여기서는 그렇게는 하지 않기로 한다. 다만, FTP 를 사용하지 않게하는 설정인 define('FS_METHOD', 'direct'); 만 나중에 추가할 예정이다.

이 부분, 즉 웹서버 관리권한을 어떻게 처리하는 게 좋을지에 대한 여러 의견이 있는데, 그냥 간단하게 이렇게 하기로 했다. 소유권을 사용자에게 주는 게 큰 의미가 있는지도 확신은 들지 않는다. 소유권, 권한을 어떻게 처리해야 하는지, 왜 그렇게 해야하는지에 대해서는 다음 글에 좀 더 복잡하게(?) 정리해놓았다.

남은 작업은 wordpress 디렉토리에 적절한 권한을 주는 일이다. 아래와 같이 해줘야 WordPress 실행시 발생할 수도 있는 문제를 방지할 수 있다.

여기서 갈림길이 나온다. 워드프레스 업그레이드를 ‘자동’으로 할 것인지, ‘수동’으로 할 것인지. ….. 내가 참고한 원문에선 ‘수동‘을 택했다.

$ sudo find /var/www/wordpress -type d -exec chmod g+s {} \;
$ sudo chmod g+w /var/www/wordpress/wp-content
$ sudo chmod -R g+w /var/www/wordpress/wp-content/themes
$ sudo chmod -R g+w /var/www/wordpress/wp-content/plugins
$ sudo chmod -R g+w /var/www/wordpress/wp-content/languages

여기까지만 해주면, 테마설치, 언어팩 설치, 플럭인 설치 등등에는 전혀 문제가 없는 상태가 된다.
첫번째 명령은, wordpress 이하 모든 디렉토리를 찾아서 그룹 권한에 Setgid 를 준다.
다음 명령들은 wp-content 디렉토리 및 그 이하 디렉토리들에 ‘그룹 쓰기’권한을 준다.
위에 연결된 원문에서는 language 디렉토리가 빠져있는데, 그건.. 작성자가 ‘영어’를 모국어로 쓰는 까닭이리라..

이렇게 하고 진행하면, 워드프레스에 최초 접속 시 wp-config.php 관련 오류가 발생한다. 권한 문제 때문이다. 화면에 나오는 대로, 표시된 내용을 복사한 뒤 /var/www/wordpress 디렉토리에 파일을 만들어주면 된다.

…..

만약, 워드프레스 업그레이드를 ‘자동‘으로 하기 위해서는?
그냥 모든 파일/디렉토리에 그룹 쓰기 권한을 주면 된다.

$ sudo find /var/www/wordpress -type d -exec chmod g+s {} \;
$ sudo chmod -R g+w /var/www/wordpress

이렇게, wordpress 디렉토리 이하 모든 파일/디렉토리에 그룹 쓰기 권한을 주면 따로 신경쓸 일이 없다. wp-config.php 도 문제없이 잘 만들어진다.

이 방식을 쓰면 주의할 일이 하나 있다.
이렇게 생성된 wp-config.php 의 소유권은 www-data:www-data 가 된다.

$ ls wp-config.php
        -rw-rw-rw-  1 www-data www-data  3135  9월  3 20:50 wp-config.php

결국, 이 파일을 편집하기 위해선 sudo 의 힘이 필요하게 되어 약간 번거로울 수도 있다. 이게 싫으면 사용자를 www-data 그룹에 참여 시켜야 하는데, 때에 따라선 www-data(사용자)에게만 쓰기 권한이 생길 수도 있으니 이것도 완전한 해결책은 안된다

참고로, 앞에서 만든 wp-content/upgrade 디렉토리는 이미 774 권한이 부여되어 있다. 이건 상위 디렉토리 권한과는 관계가 없고, umask 설정을 따른다. (복잡하지? ^^)

여기까지 완료했으면, WordPress 디렉토리에서 더 이상 처리할 것은 없다. (한가지가 남긴 했는데, 그건 아래 WordPress 설정에서 다룬다.)
이젠 아파치를 건드려야할 차례다.

4. Apache 설정

원문에서는 아파치 메인 설정파일을 수정했는데, 여기선 그것보다는 /etc/apache2/sites-available 디렉토리를 이용하도록 한다. 이 디렉토리에는 000-default.conf 파일이 있는데, 이걸 적당한 이름으로 바꿔서 복사한다.

$ sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-wordpress.conf

그리고 이 파일(001-wordpress.conf)을 다음과 같이 편집한다. 만약, 80 포트가 아닌 다른 포트를 쓰고 싶다면, 앞에 Listen 항을 추가하고, 아래 부분에 대략 다음과 같이 내용을 덧붙인다.

Listen 8181
  <VirtualHost *:8181>

  	ServerAdmin webmaster@localhost
  	DocumentRoot /var/www/wordpress
  	<Directory /var/www/wordpress/>
      		AllowOverride All
  	</Directory>

  	ErrorLog ${APACHE_LOG_DIR}/error.log
  	CustomLog ${APACHE_LOG_DIR}/access.log combined
  </VirtualHost>

Listen 8181 등등이 기본값과 다른 부분이므로, 주의깊게 설정한다.
만약 같은 포트를 쓰는 설정파일이 이미 있다면, 아파치 서버가 실행될 때 오류가 발생한다. 같은 포트를 쓰면서 디렉토리만 달리 할 경우에는 포트를 쓰지 않도록 한다. (사실 이럴 경우는 아예 설정을 달리 해야한다.)

어쨌든 포트 부분은 원할 경우만 바꾸도록 하고, DocumentRoot 항목과 AllowOveride All 부분은 반드시 추가를 해줘야 WordPress 가 제대로 작동하게 된다. DocumentRoot 와 Directory 항목에는 워드프레스가 설치된 디렉토리를 정확하게 지정해줘야 한다.
아파치 세부 설정은 전혀 모르지만, 그저 막연하게 짐작하면, DocumentRoot 를 /var/www/wordpress 으로 설정하면, www.aaabbb.com 등으로 바로 접근이 가능하게 된다. 즉, 접속주소가 www.aaabbb.com/wordpress 가 아니고, www.aaabbb.com 이 된다.

sites-available 디렉토리에 파일을 추가했으므로, 이 파일을 sites-enabled 에 링크를 시켜줘야만 아파치가 제대로 인식을 한다. 수동(ln -s)으로 해줄 수도 있지만, 우분투 아파치에는 다음과 같은 명령이 있어서 간단하게 수행할 수 있다.

$ sudo a2ensite 001-wordpress.conf

000-default.conf 는 불필요하므로 해제해준다. (a2ensite, a2dissite 뒤에서 Tab 키를 누르면 쉽게 파일 선택을 할 수 있다.)

sudo a2dissite 000-default.conf

AllowOveride 는 아파치 기본 제공 기능은 아니고 모듈이 하나 필요한데, 그건 다음 명령으로 추가할 수 있다.

$ sudo a2enmod rewrite

모든 수정/추가가 끝났으면, 아파치 설정에 문제가 없는지 확인한다.

sudo apache2ctl configtest

“Syntax OK” 가 나왔다면 설정은 끝. 다음 명령으로 아파치를 재시작한다.

$ sudo systemctl reload apache2.service

원문에는 restart 로 되어 있으나, reload 로도 충분하다고도 한다. reload 나 restart 나 별 시간 차이는 안나는데, 큰 시스템에선 다를 수도 있겠다.

이 시점부터 웹서버/워드프레스 접속은 가능하다. http://192.168.0.2 로 접속해본다. (port 가 80일 경우.)

자.. 설치는 잘 됐다. 다음으로 진행하기 위해선 Database 가 필요하다. 이를 위해 두가지 방법이 존재한다. 하나는 mysql 을 직접 실행하는 방법, 다른 하나는 phpmyadmin 을 설치하는 방법.

5. DB 생성

5.1 mysql 명령어로 DB 생성

phpmyadmin 없이 직접 DB 를 만든다. DB 만을 설치하기 위해선 굳이 phpmyadmin 을 설치할 필요는 전혀 없다.
먼저 WordPress 가 사용할 DB(wordpress_db)를 만들고, 그 DB 를 관리할 사용자도 생성한다.
DB 명, 관리자명은 모두 마음대로 정하면 된다.

$ sudo mysql
MariaDB> CREATE DATABASE wordpress_db DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
MariaDB> GRANT ALL ON wordpress_db.* TO 'wp_dba'@'localhost' IDENTIFIED BY '비밀번호';
MariaDB> FLUSH PRIVILEGES;

끝. 6 단계로 넘어간다.

5.2 phpmyadmin 설치 후 DB 생성

phpmyadmin 설치

$ sudo apt install phpmyadmin

phpmyadmin 설치 시엔 두가지를 설정해줘야 한다.
첫번째는 phpmyadmin 과 연동시킬 웹서버를 선택해준다. Apache 를 택하면 된다.
두번째는, 다음 화면과 같은 상황에서, ‘아니오’를 택한다.

여기에서 Yes 를 해야할지, No 를 해야할지는 이견이 많다. 사실, 뭘로 하는게 좋은지 전혀 모르겠다. 그냥~ No 를 해버렸다.

WordPress 설치 전, 접속을 먼저 해보도록 한다.
IP/phpmyadmin 으로 접속하면 다음과 같은 화면을 볼 수 있다.

일반 설정은, 보통 여기서 mysql root 로 로그인하게 되어 있다.
그러나 최근 데비안 계열에서는 이게 불가능하므로, 위 글에서와 같이 새로운 DBA 를 만들어서 그 ID 와 PW 를 넣도록 한다.

$ sudo mysql

MariaDB [(none)]> CREATE USER 'dbadmin'@'localhost' IDENTIFIED BY 'some_pass';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'dbadmin'@'localhost' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;

** phpmyadmin 접속 제한

phpmyadmin 을 로컬네트웍으로만 접속하게 하려면 다음과 같이 설정한다.

# /ete/phpmyadmin/apache.conf 를 열고,
# <Directory /usr/share/phpmyadmin> 항목을 찾아 다음 내용을 추가한다.

    Order Deny,Allow
    Deny from All
    Allow from 192.168.0.0/24

Allow from 은 자신의 IP/Netmask 상황에 따라 적절히 변경해야 한다.
이와 같이 설정하면, 서버와 같은 대역에 있는 IP 에서만 phpmyadmin 접근이 가능해진다.

phpmyadmin 을 통한 DB 생성

접속 : http://ip/phpmyadmin

여기에서 입력해야하는 id 와 암호는, 바로 위에서 생성한 DB 관리자(id: dbadmin)의 ID/PW 이다. root 를 넣으면 접속이 되지 않는다.

이제 접속하고 나서, WordPress 가 사용할 DB 를 만들어야 한다.
DB를 만들면서 동시에 그 DB를 관리할 MySql 관리자(뭔 관리자가 이리 많아..)도 만들어줘야 한다. 보통은 관리자명과 DB 이름을 같게끔 하는 듯 하다. (달리 해도 전혀 관계없다.)

phpmyadmin 의 사용자 계정 메뉴에 가면, 아래 부분에 ‘New – 사용자 추가’ 가 있다. 클릭 한 뒤, 몇가지 사항을 입력해야 한다. (mysql 명령어로 하면 두 줄로 끝나는데..)

[로그인 정보] 사용자명 : WordPress 가 사용할 Mysql DB의 관리자. ex) wpress_db 호스트명 : localhost 로 설정 암호 : 적절히 입력하거나, 아니면 Generate PW 를 택한 뒤 반드시 적어놓을 것.

[Database for User account] 동명의 데이터베이스를 생성하고 모든 권한을 부여 – 선택. 위에서 설정한 ID와 같은 이름으로 DB를 만들겠다는 것이다. 다르게 해도 되지만, 일괄작업을 위해서 이것을 선택한다.

[전체적 권한] 모두 체크 – 선택. (관리자이므로 모든 권한이 있어야 한다.)

아래 오른쪽에 ‘실행’ 을 선택해주면 끝. 이제 phpmyadmin 으로 할 작업은 끝났다.

6. WordPress 설정

웹브라우저를 사용해서 WordPress 로 접속한다. (ex. http://192.168.0.2) 위 화면을 참고하고, 맨 아래 ‘Let’s go!’ 를 누른다.

영문판(최신판)으로 설치한 후 한국어판으로 바꾸고 싶다면, 다음 글을 참고하라.

다음 화면에서, 이런 식으로 입력하고 ‘저장하기(Submit)’를 누른다.
DB이름, 사용자명등은 아래 그림에는 제대로 넣어놓지 않아 좀 헷갈릴 수 있는데, 위에서 예로 만든 사용자명을 사용하면 다음과 같다.

  • 데이터베이스 이름 : wordpress_db
  • 사용자명 : wp_dba
  • 비밀번호 : wp_dba 에 대한 PW

여기서, 아까 /var/www/wordpress 디렉토리 권한을 어떻게 줬느냐에 따라 오류가 발생할 수도 있고, 아닐 수도 있다. 오류 발생 시에는 WordPress 가 해결방법을 제시해주므로 그대로 따르면 된다.
이 현상의 원인은, Apache 를 실행하는 주체가 /var/www/wordpress 에 쓰기 권한이 없기 때문이다. 따라서 수동으로 저 위치에 wp-config.php 를 만들고, WordPress 가 표시해준 내용을 붙여넣으면 된다. 오류가 발생하지 않았다면, 다음과 같은 화면이 나타난다.

FTP 사용하지 않음을 명시!

오류가 발생했든 그렇지 않았든, 여기까지 작업을 완료한 후 ‘설치 실행하기’를 누르기 전에(누른 다음에 해도 별 관계는 없으나..), wp-config.php 파일에 한가지를 추가해줘야 한다.
FTP 를 사용하지 않고 WordPress(다시 말하면, 아파치, 또 다시 말하면 www-data(사용자 및 그룹))가 각종 파일(업그레이드, 테마, 플럭인 등등)을 직접 받아서 설치할 수 있게 해주는 작업이 필요하다.

/var/www/wordpress/wp-config.php 에 다음 내용을 추가.
define('FS_METHOD', 'direct');

wp-config.php 허가권을 400 으로!

WordPress 에서는 이 파일의 허가권을 400/440 으로 하라고 권장하고 있다. 그도 그럴 것이, 이 파일엔 DB 사용자명/비밀번호/테이블명이 고스란히 담겨있기 때문이다.
하고 말고는 자유지만, 하는 편이 그나마 조금이라도 보안에 도움이 되겠지?

sudo chmod 400 /var/www/wordpress/wp-config.pgp

환경에 따라서 400, 또는 440 으로 결정해야 한다. 또, ‘4’ 는 Read Only 이므로, 혹여라도 이 파일을 수정할 일이 생기면 허가권 변경을 먼저 해야 한다.

그리고 난 뒤, ‘설치 실행하기’로 돌입한다. 이제 최종 관문이 남았다.

사이트 제목은 말 그대로 제목이다.

다음.. 헷갈리는게 또 나오는데, 바로 사용자명이다. 뭔 사용자명이 또 나오나??

이것은 워드프레스 관리자라 할 수 있다. 즉, 위에서 얘기했던 관리자(서버접근계정, MySql DBA, MySql WordPress DB관리자 등)들은 눈에 직접 보이진 않는 숨은(?) 관리자라 할 수 있지만, 여기에 나오는 관리자야말로 홈페이지(워드프레스)를 관리하는 마지막이자 실질적인 일꾼이라 할 수 있겠다. (예를 들어, wpadmin 을 ID 로 정해본다.)

적절한 ID 와 비밀번호를 주고 나면, 드디어… 워드프레스를 맛볼 수 있게 된다. 만약 현재 설치한 판본보다 더 최신판이 있다면, 업그레이드가 가능하다는 알림이 뜬다.

wordpress 디렉토리에 쓰기 권한을 줬고, define('FS_METHOD', 'direct'); 행을 wp-config.php 에 추가했다면, 그냥 이 메뉴에서 업그레이드를 실행해버리면 된다. 만약 저 행을 추가하지 않았다면, 업그레이드 단추를 눌렀을 때 FTP ID/PW 를 입력하라고 나오게 된다.


** ID 정리

이 글에 ID 가 여러 개 나오기 때문에 정리를 해봤다.

우분투 서버 관리자:
serveradmin : 우분투 서버 전체와 /var/www/wordpress 를 관리. (그러나 우분투 특성 상 root 는 아니다. 즉, root 권한을 갖는 사용자. sudo 가능자.)

MySql 관리자: (phpmyadmin 을 사용할 때 필요.)
dbadmin : MySql 전체를 관리하는 DBA. MySql root 를 일반 사용자가 사용하지 못함으로 인해 만들어준 사용자. MySql 내에서는 무소불위의 권력. phpmyadmin 을 통해 워드프레스용 DB 를 최초 생성하기 위해서 필요.

워드프레스 DB 관리자:
wp_dba : MySql 내에 생성된, 워드프레스용 DB만을 관리하기 위한 ID.

원드프레스 관리자:
wpadmin : 웹에서 워드프레스를 관리하기 위한 ID.

끝!
phpmyadmin 은, 관리할 때만 사용하는게 더 편하고 좋다. DB 생성을 위해서라면 그냥 mysql 명령어를 쓰는게 훨씬 편하다.

One Comment

안녕하세요. 글 남겨주셔서 고맙습니다.