WordPress로 홈페지를 구축했다가 구축당시의 IP가 변경될 경우 해당 WordPress 홈페이지는 웹브라우저에서 열리지를 않는다.

이때에는 WordPress의 환경 설정 값을 새로 바뀐 IP로 변경해 주어야 한다.

다음과 같은 환경이라고 가정해 보자.


ㆍ 노트북 PC Windows 10에 VirtualBox로 Ubuntu 16.04를 설치하고 여기에 WordPress로 홈페이지를 만듦


ㆍ VirtualBox의 Ubuntu에 있는 WordPress 접속 IP가 다음과 같다.

   http://192.168.0.10/wordpress


ㆍ노트북 PC를 다른 장소로 옮김으로 인해 VirtualBox의 Ubuntu IP가 다음과 같이 변경되었다.

   192.168.89.105

   이때 http://192.168.89.105/wordpress로 접속하면 해당 홈페이지가 열리지 않는다.


이 문제의 해법은 몇 가지가 있는데


(1) wp-config.php 설정 값 조정을 통해

WordPress가 설치된 경로에서 wp-config.php 파일을 열어 다음의 내용을 변경해준다. 만일 다음 내용이 없으면 해당 파일의 적당한 곳에 다음 내용을 추가해 준다.


    define('WP_HOME', 'http://192.168.89.105/wordpress');

    define('WP_SITEURL', 'http://192.168.89.105/wordpress');


(2) WordPress에서 사용하는 Database 설정 값 조정을 통해

WordPress가 사용하는 Database(여기서는 MariaDB)에 접속해서 관련 정보의 변경을 통해서 문제를 해결할수 있다.

여기서는 WordPress 홈페이지가 사용하는 Database 명이 mywp2라고 가정한다.


root@....# mysql -uroot -p

Enter password: 

Welcome to the MariaDB monitor.  Commands end with ; or \g.

Your MariaDB connection id is 55

Server version: 10.0.34-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04


Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


MariaDB [(none)]> use mywp2

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A


Database changed


WordPress 홈페이지가 사용하는 데이터베이스 mywp2에서 변경작업을 해야 할 table은 wp_options 테이블이다. 이 테이블의 구조를 보면 다음과 같다.


MariaDB [mywp2]> desc wp_options;

+--------------+---------------------+------+-----+---------+----------------+

| Field        | Type                | Null | Key | Default | Extra          |

+--------------+---------------------+------+-----+---------+----------------+

| option_id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |

| option_name  | varchar(191)        | NO   | UNI |         |                |

| option_value | longtext            | NO   |     | NULL    |                |

| autoload     | varchar(20)         | NO   |     | yes     |                |

+--------------+---------------------+------+-----+---------+----------------+

4 rows in set (0.00 sec)


이 테이블에서 option_name 필드의 값이 home인 레코드와 option_name 필드의 값이 siteurl을 값으로 갖는 레코드가 있는데 그 2 레코드의 option_value의 값을 새로 바뀐 IP주소로 변경해 주어야 한다.

즉 wp_options라는 테이블에서 option_name필드의 값이 home인 레코드와 siteurl인 레코드의 option_value 필드에 해당 홈페지의 IP 주소 값이 설정되어 있다.

이 2 레코드의 값을 새로 변경된 IP 주소로 update해 주면 된다.  먼저 현재 어떤 값이 들어 있는지 확인해 본다.


MariaDB [mywp2]> select * from wp_options where option_name='home';

+-----------+-------------+--------------------------------+----------+

| option_id | option_name | option_value                   | autoload |

+-----------+-------------+--------------------------------+----------+

|         2 | home        | http://192.168.0.10/wordpress | yes      |

+-----------+-------------+--------------------------------+----------+

1 row in set (0.00 sec)


MariaDB [mywp2]> select * from wp_options where option_name='siteurl';

+-----------+-------------+--------------------------------+----------+

| option_id | option_name | option_value                   | autoload |

+-----------+-------------+--------------------------------+----------+

|         1 | siteurl     | http://192.168.0.10/wordpress | yes      |

+-----------+-------------+--------------------------------+----------+

1 row in set (0.00 sec)


위와 같은 값을 가지고 있을 것이고 저 IP는 변경되기 이전의 IP 주소가 될 것이다.

저 두 값을 새롭게 변경된 IP로 update해 주는 것이다.

참고로 위에서 2개의 SQL 쿼리로 해당 정보를 확인했는 아래와 같이해도 동일한 결과가 나온다.


MariaDB [mywp2]> select * from wp_options where option_name in ('siteurl', 'home');

+-----------+-------------+--------------------------------+----------+

| option_id | option_name | option_value                   | autoload |

+-----------+-------------+--------------------------------+----------+

|         2 | home        | http://192.168.0.10/wordpress | yes      |

|         1 | siteurl     | http://192.168.0.10/wordpress | yes      |

+-----------+-------------+--------------------------------+----------+

2 rows in set (0.00 sec)


이제 새롭게 바뀐 IP로 변경해 주도록 하자.


MariaDB [mywp2]> update wp_options set option_value='http://192.168.89.105/wordpress' where option_name='home';

Query OK, 0 rows affected (0.00 sec)

Rows matched: 1  Changed: 0  Warnings: 0


MariaDB [mywp2]> update wp_options set option_value='http://192.168.89.105/wordpress' where option_name='siteurl';

Query OK, 0 rows affected (0.00 sec)

Rows matched: 1  Changed: 0  Warnings: 0


WordPress 홈페이지의 IP 주소가 정상적으로 변경되었는지 확인해 보도록 하자.


MariaDB [mywp2]> select * from wp_options where option_name in('siteurl', 'home');

+-----------+-------------+--------------------------------+----------+

| option_id | option_name | option_value                   | autoload |

+-----------+-------------+--------------------------------+----------+

|         2 | home        | http://192.168.89.105/wordpress | yes      |

|         1 | siteurl     | http://192.168.89.105/wordpress | yes      |

+-----------+-------------+--------------------------------+----------+

2 rows in set (0.00 sec)


이후부터는 변경 된 IP 주소로 WordPress 홈페이지가 정상적으로 잘 접속이 될 것이다. 아래와 같이 변경된 IP로 WordPress 홈페이지에 접속해 본다.


http://192.168.89.105/wordpress 



WordPress Plugin 설치시 Could not create directory라는 에러에 대한 손쉬운 해법


리눅스 Ubuntu에 WordPress를 설치하고 원하는 플로그인을 설치하다보면 Could not create directory라는 에러가 발생하면 플로그인 설치가 실패하는 경우를 종종 보게된다.


이 문제는 디렉토리의 권한 문제 때문에 발생하는 현상이다. 즉 플러그인을 설치하기 위해서 기존의 wordpress 디렉토리 안에 새로운 디렉토리나 파일을 생성해야 하는 경우가 있는데 새로운 디렉토리나 파일을 생성할 권한이 없기 때문에 발생하는 현상이다.


Wordpress를 최초 설치하면 wordpress라는 디렉토리가 생기고 이 안에 필요한 파일들이 생성이 되는데 문제는 wordpress라는 디렉토리의 소유권자가 다음과 같이 되어있다.


drwxr-xr-x  5 nobody        nogroup          4096  5월 18 13:21 wordpress/


해석해 보면

d(첫 번째 자리) : wordpress가 디렉토리라는 뜻

rwx(2~4번째 자리) : 소유자는 r(읽기), w(쓰기), x(실행)을 모두 할수 있다는 뜻

r-x(5~7번째 자리) : 그룹 사용자는 r, x만 가능하다는 뜻

r-x(8~10번째 자리) : 그외 모든 일반 사용자는 r, x만 가능하다는 뜻.


그런데 wordpress라는 디렉토리 안에 새로운 디렉토리나 파일을 생성할수 있는 권한은 이 디렉토리에 대한 소유자인 nobody라야 가능한 것이다. 그룹 사용자는 nogroup이고 이 또한 w 권한이 없으므로 어떠한 디렉토리나 파일도 wordpress 디렉토리 안에 생성할수가 없다. 따라서 현 상태에서는 WordPress의 플러그인 설치시 Could not create directory라는 에러가 발생할 수 밖에 없다.

이 경우 제일 손쉬운 방법은 디렉토리의 권한을 777로 설정해주면 간단히 해결이 된다. 그러나 이것은 보안상 심각한 설정법이므로 곤란하다.


여기서 중요한 개념을 알아야한다. 서버에서 웹 서비스의 소유권자는 누구인가하는 것이다.

즉 WordPress를 실행하는 소유권자가 누구냐 하는 것이다. Ubuntu의 경우 기본적으로 웹 서비스를 실행하는 소유권자는 로그인한 계정의 사용자도 아니고 Ubuntu 시스템이 설정한 웹 서비스를 실행하는 소유권자는 www-data이다. 

따라서 wordpress라는 디렉토리의 소유권자를 www-data로 지정해 주면 소유자의 권한이 rwx이므로 WordPress 플러그인 추가에 아무런 문제가 없다.

그룹 사용자 또한 www-data로 지정해 주면 일단 WordPress 플러그인 문제나 테마, 파일 업로드 등에서 아무런 문제가 없다.

chown 명령을 사용해서 해당 디렉토리의 소유권을 변경한다. 

chown의 사용법은 다음과 같다.


chown 사용자명:그룹사용자명 대상


# chown -R www-data:www-data /home/joe/www/wordpress/


참고적으로 여기서 -R은 Recursive를 의미하는데 적용할 디렉토리의 모든 하위 디렉토리와 파일들에도 모두 적용하겠다는 뜻이다.

따라서 위의 명령을 해석해 보면 /home/joe/www/wordpress라는 디렉토리의 모든 하위 디렉토리까지를 포함해서 소유자는 www-data로 변경하고 해당 디렉토리의 그룹 사용자도 www-data로 변경한다는 뜻이다. 이 작업을 하게 되면 다음과 같이 바뀌게된다.


drwxr-xr-x  5 www-data        www-data          4096  5월 18 13:21 wordpress/


사용자(www-data)의 권한은 rwx이므로 플러그인 설치시 새로운 디렉토리나 파일의 생성에 아무런 문제가 없다.

그런데 이렇게만 설정을 한다면 FTP 사용시 문제가 발생한다.


FTP(SFTP)의 로그인 계정이 adduser로 등록한 joe라는 사용자로 로그인했다고 할 경우 joe는 wordpress 디렉토리의 사용자(user)도 아니고 group user도 아니고 others에 해당된다(user-group-others). 따라서 wordpress의 권한이 rwxr-xr-x이므로 others가 할수 있는 것은 r-x뿐이므로 FTP로 파일 업로드가 불가능하다.

따라서 FTP 업로드도 문제가 없게 할려면 다음 2가지 방법으로 해결하는 방법을 취할수 있다(더 좋은 방법이 있을수 있겠지만 골치 아프니 이정도 수준으로...).


(1) wordpress 디렉토리의 소유자는 joe로 설정하고 그룹 사용자는 www-data로 설정한후

(2) 해당 디렉토리의 권한을 775(rwxrwxr-x)로 지정하게 되면 웹 서비스의 소유자인 www-data에게 rwx의 권한이 주어지므로 플러그인 설치 등의 작업에 문제 없을뿐 아니라 FTP 로그인을 joe로 로그인 했을 경우 디렉토리 소유자가 joe인데 소유자에게 주어진 권한이 rwx이므로 역시 FTP 업로드 또한 문제 없게 된다.

다음과 같이 변경한다


# chown -R joe:www-data /home/joe/www/wordpress/

# chmod -R 775 /home/joe/www/


소유자 및 권한 설정이 다음과 같이 변경되어 있을 것이다.


drwxrwxr-x  5 joe        www-data          4096  5월 18 13:21 wordpress/


참고로 WordPress가 설치된 디렉토리의 wp-config.php의 권한을 600으로 다음과 같이 주어졌을 경우 다른 모든 것이 정상일지라도 해당 홈페이지는 웹 브라우저에서 실행되지 않는다.


-rw-------  1 joe www-data  2988  5월 23 14:54 wp-config.php


왜냐하면 위에서 보는바와 같이 Ubuntu에서 웹 서비스를 실행시키는 소유자는 www-data인데 wp-config.php는 소유자가 joe로 되어 있고 이 사용자(joe)에 대해서만 rw의 권한이 주어져 있고 www-data를 포함한 그외의 사용자에게는 어떠한 권한도 주어져 있지 않기 때문에 이 홈페이지는 실행이 될수가 없다. 이럴 경우 다음과 같이 권한을 755로 설정해 주면 문제가 해결된다.

# chmod 755 wp-config.php

그러면 다음과 같이 되어 정상적으로 WordPress 홈페이지가 실행이 될 것이다.

-rwxr-xr-x  1 joe www-data  2988  5월 23 14:54 wp-config.php*



+ Recent posts