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 



Ubuntu 16.04에서 SFTP 접속 포트 변경하기


SFTP(Secure File Transfer Protocol)의 디폴트 접속 포트는 22번이다. SFTP는 SSH 접속시 사용하는 포트를 사용하므로 SSH의 설정 값에서 원하는 포트를 변경하는 작업을 하면된다.


Ubuntu의 경우 아래 경로의 파일에서 접속 포트의 설정 값을 변경할수 있다. vi로 아래 파일을 연다.

만일 /etc/ssh/ 경로에서 sshd_config 파일이 보이지 않는다면, 즉 ssh_config는 있는데 sshd_config 파일이 없다면 아래 패키지를 설치해 주어야 한다.


# apt-get install openssh-server


# vi /etc/ssh/sshd_config


파일을 열어보면 다음 항목이 있을 것이다.


Port 22


이 항목의 값을 원하는 숫자로 설정하고 파일을 저장한다.

변경된 내용을 적용하기 위해서 ssh를 재시작해 준다.


# service ssh restart


이제부터 FileZilla의 SFTP로 접속시 포트 번호를 변경된 값으로 서버로 접속이 가능해진다.

동시에 PuTTY를 이용해서 SSH 접속시에도 포트 번호는 여기서 변경한 값으로 접속해야 된다.



Ubuntu 16.04에서 vsftpd를 이용하여 FTP 접속 포트 변경하기


FTP의 디폴트 접속 포트는 21번이다. FTP 자체가 보안상 약점이 있는데 포트 번호가 21이라는 것까지 기본적으로 알려진 정보이다 보니 FTP의 기본 포트 21번을 다른 포트로 변경하는 작업은 보안상의 기본적인 작업이 되겠다. 물론 FTP보다는 SFTP를 사용해야겠지만 아무튼...


전제조건으로 vsftpd가 설치되어있다고 가정한다. 만일 설치되지 않았다면


# apt-get install vsftpd로 해당 패키지를 설치해야 한다.


Ubuntu의 경우 vsftpd의 환경 설정 파일은 아래 경로에 있다. 이를 vi로 열어서 특정 설정 값을 변경한다.


# vi /etc/vsftpd.conf


파일을 열어보면 listen=NO라는 항목이 있을텐데 그 아랫쪽에 다음 내용을 추가해 준다.


listen_port=1234 (원하는 포트 번호로 설정)


이때 listen=YES로 하면 FTP 접속이 되지않는다. listen의 값은 NO로 해두어야 한다.

이상의 작업이 끝났으면 파일을 저장하고 vsftpd를 재실행해 준다.


# service vsftpd restart


이제부터 FTP 접속은 21이 아닌 1234로 접속이 가능해 진다.




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*



하나의 서버(하나의 IP)에 여러 개의 도메인이 접속시 각 해당 웹 서비스가 실행되게 하는 가상 호스트(Virtual Host)에 대해


하나의 웹 서버가 있을 경우(당연히 이 서버에 하나의 IP)가 할당되어 있을 것인데 이 웹 서버에 aaa.bbb.com, ccc.ddd.co.kr, eee.fff.org 등 여러 개의 도메인으로부터 접속해 들어올때 각각에 해당하는 웹 서비스가 실행되도록 할려면 가상 호스트(Virtual Host)를 적용해서 원하는 기능을 구현해 낼수 있다.


이 실험을 테스트한 상황(혹은 이를 위해 필요한 조건)

 -. Windows 10에 VirtualBox를 통해 Ubuntu 16.04 설치

 -. VirtualBox의 Ubuntu 서버에 apache2 설치

 -. VirtualBox의 Ubuntu 서버에 Php 7.0 설치

 -. 지금은 가상 호스트가 정상적으로 작동하는 것이 목적이므로 DB 연결까지 하지 않을 것이므로 MySQL은 설치하지 않음

 -. VirtualBox에 설치된 Ubuntu의 IP를 ipTIME 공유기에서 Static IP로 고정 할당

 -. ipTIME의 관리자 모드에서 '고급 설정' - 'NAT/라워 관리' - '포트포워드 설정'을 통해 외부의 80 포트로 들어오는 연결을 VirtualBox의 Ubuntu 16.04의 IP(위에서 Static으로 할당한 IP)로 포워딩 되도록 설정

 -. ipTIME의 DDNS 기능을 이용하여 2개의 도메인 네임을 생성하면서 각각의 해당 웹 서비스를 선택해서 실행

여기서는 ipTIME의 관리자 모드로 집입해서 '고급 설정' - '특수 기능' - 'DDNS 설정'을 이용해 아래와 같이 2개의 DDNS를 번갈아 설정하면서 Ubuntu에 설정한 2개의 가상 호스트로의 접근을 테스트 할 것이다.


fullstack.iptime.org  ⇒ VirtualBox Ubuntu 16.04에 있는 /home/fullstack/www/html/joe.php를 실행

joekog.iptime.org  ⇒  VirtualBox Ubuntu 16.04에 있는 /home/joekog/www/index.php를 실행


위와 같이 2개의 도메인이 동일한 서버(여기서는 VirtualBox Ubuntu 16.04)에 접속시 각각 서로 다른 웹 서비스가 실행되도록 구현하고자 한다. 


먼저 아래와 같이 사용자를 등록한다


root@gsoft:/home# adduser joekog

'joekog' 사용자를 추가 중...

새 그룹 'joekog' (1005) 추가 ...

새 사용자 'joekog' (1005) 을(를) 그룹 'joekog' (으)로 추가 ...

'/home/joekog' 홈 디렉터리를 생성하는 중...

'/etc/skel'에서 파일들을 복사하는 중...

새 UNIX 암호 입력: 

새 UNIX 암호 재입력: 

passwd: 암호를 성공적으로 업데이트했습니다

joekog의 사용자의 정보를 바꿉니다

새로운 값을 넣거나, 기본값을 원하시면 엔터를 치세요

이름 []: joekog

방 번호 []: 

직장 전화번호 []: 

집 전화번호 []: 

기타 []: 

정보가 올바릅니까? [Y/n] Y


이렇게 하면 /hoem/joekog가 생성되었을 것이다.

아래와 같이 joekog의 웹 서비스를 위한 joekog 사용자에 대한 웹 루트 경로를 생성한다.


root@gsoft:/home# cd joekog

root@gsoft:/home/joekog# ls -l

합계 32

drwxr-xr-x 2 joekog joekog 4096  5월 17 17:51 ./

drwxr-xr-x 8 root   root   4096  5월 17 17:51 ../

-rw-r--r-- 1 joekog joekog  220  5월 17 17:51 .bash_logout

-rw-r--r-- 1 joekog joekog 3771  5월 17 17:51 .bashrc

-rw-r--r-- 1 joekog joekog 8980  5월 17 17:51 examples.desktop

-rw-r--r-- 1 joekog joekog  655  5월 17 17:51 .profile

root@gsoft:/home/joekog# mkdir www

root@gsoft:/home/joekog# cd www

root@gsoft:/home/joekog/www# pwd

/home/joekog/www


이 위치에 php 파일을 하나 만들어 후에 http://joekog.iptime.org/hi.php와 같은 식으로 접속하고자 한다.

생성한 /home/joekog/www/ 위치에 vi hi.php로 다음과 같이 코딩한다.


<?php

        echo "<h1>Hi~~ This is joekog.iptime.org's web root.</h1>";

        echo "Web Root : /home/joekog/www/";

?>


# cd /etc/apache2/sites-available로 이동하면 000-default.conf라는 이름의 아파치 설정 파일이 있다.

이 파일 안에 보면 아래와 같으 항목이 있다. 


DocumentRoot /var/www/html


이 항목이 뜻하는 것은 아파치의 디폴트 웹 루트가 /var/www/html이라는 뜻이다. 

즉 http://joekog.iptime.org를 실행하면 /var/www/html/index.html이 실행되는 디폴트 웹 루트라는 것이다.

우리는 /home/joekog/www/을 웹 루트로 만들고 이 위치에 .html, .php 등을 위치시키고 이 웹 서비스를 실행시키고자 하는 것이다.

따라서 디폴트 웹 루트가 실행되지 않게 할려면 


# cd /etc/apache2/sites-enabled/로 이동해서 ls -l로 파일 목록을 표시해 보면 다음과 같은 심볼릭 링크 파일이 보일 것이다.


000-default.conf -> ../sites-available/000-default.conf


이 파일을 다음 명령을 이용해서 없애준다.


# a2dissite 000-default

Site 000-default disabled.

To activate the new configuration, you need to run:

  service apache2 reload


# service apache2 reload

# service apache2 restart


그러면 /etc/apache2/sites-enabled/에서 000-default.conf -> ../sites-available/000-default.conf가 없어 졌을 것이다.

/etc/apache2/sites-available/로 이동해서


# cp 000-default.conf joekog.iptime.org.conf


해당 경로에 joekog.iptime.org.conf 파일이 생겼을 것이다. 이제 /home/joekog/www/을 웹 루트로 만들도록 설정을 변경한다.


# vi joekog.iptime.org.conf 로 내용을 열면 아래와 같이 되어 있을 것이다.


<VirtualHost *:80>

        # The ServerName directive sets the request scheme, hostname and port that

        # the server uses to identify itself. This is used when creating

        # redirection URLs. In the context of virtual hosts, the ServerName

        # specifies what hostname must appear in the request's Host: header to

        # match this virtual host. For the default virtual host (this file) this

        # value is not decisive as it is used as a last resort host regardless.

        # However, you must set it for any further virtual host explicitly.

        #ServerName www.example.com


        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/html


        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,

        # error, crit, alert, emerg.

        # It is also possible to configure the loglevel for particular

        # modules, e.g.

        #LogLevel info ssl:warn


        ErrorLog ${APACHE_LOG_DIR}/error.log

        CustomLog ${APACHE_LOG_DIR}/access.log combined


        # For most configuration files from conf-available/, which are

        # enabled or disabled at a global level, it is possible to

        # include a line for only one particular virtual host. For example the

        # following line enables the CGI configuration for this host only

        # after it has been globally disabled with "a2disconf".

        #Include conf-available/serve-cgi-bin.conf

</VirtualHost>


# vim: syntax=apache ts=4 sw=4 sts=4 sr noet


이 파일의 내용을 다음과 같이 변경해 준다.


<VirtualHost *:80>

        # The ServerName directive sets the request scheme, hostname and port that

        # the server uses to identify itself. This is used when creating

        # redirection URLs. In the context of virtual hosts, the ServerName

        # specifies what hostname must appear in the request's Host: header to

        # match this virtual host. For the default virtual host (this file) this

        # value is not decisive as it is used as a last resort host regardless.

        # However, you must set it for any further virtual host explicitly.

        ServerName joekog.iptime.org


        ServerAdmin webmaster@localhost

        DocumentRoot /home/joekog/www


        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,

        # error, crit, alert, emerg.

        # It is also possible to configure the loglevel for particular

        # modules, e.g.

        #LogLevel info ssl:warn


        ErrorLog ${APACHE_LOG_DIR}/joekog.iptime.org-error.log

        CustomLog ${APACHE_LOG_DIR}/joekog.iptime.org-access.log combined


        # For most configuration files from conf-available/, which are

        # enabled or disabled at a global level, it is possible to

        # include a line for only one particular virtual host. For example the

        # following line enables the CGI configuration for this host only

        # after it has been globally disabled with "a2disconf".

        #Include conf-available/serve-cgi-bin.conf

</VirtualHost>


# vim: syntax=apache ts=4 sw=4 sts=4 sr noet


수정한 파일의 내용을 저장하고 빠져나온다. 다음 명령을 통해서 joekog.iptime.org라는 도메인을 아파치에 등록한다.


# a2ensite joekog.iptime.org

Enabling site joekog.iptime.org.

To activate the new configuration, you need to run:

  service apache2 reload


이렇게하고서 /etc/apache2/sites-enabled/로 이동해 보면 다음과 같이 심볼릭 파일이 생성되었을 것이다.


joekog.iptime.org.conf -> ../sites-available/joekog.iptime.org.conf


그림과 같이 iptime 관리자 페이지로 접속해서 DDNS 설정 항목에서 '삭제'버튼을 눌러 기존 있던 DDNS를 삭제한다. 만일 처음부터 DDNS를 생성하지 않았다면 이 과정이 필요 없다.




아래 그림과 같이 우리가 원하는 도메인으로 joekog와 사용자 ID에 적당한 이메일 주소를 적고 'DDNS 등록' 버튼을 눌러서 생성한다.




아래 그림과 같이 "정상적으로 등록"이라는 메시지가 보이면 이 DDNS가 활성화 되기까지는 1-2분 정도의 시간이 소요되는 것 같다. 만일 "정상적으로 등록"이라는 항목에 이미 사용중인 DDNS라는 메시지 등이 보인다면 다른 이름의 DDNS를 등록해야 한다. 이럴 경우 위의 설정들을 모두 다른 이름의 DDNS에 맞게 고쳐야 한다.

따라서 테스트가 번거롭지 않을려면 ipTime에 먼저 원하는 DDNS를 등록해 보고 사용가능한지부터 확인하는 것이 팁이 될 것이다.




/etc/apache2/로 이동해서 apache2.conf파일의 내용을 편집한다. 여기서 /home/joekog/www에 대한 권한을 설정해 주지 않으면 웹 브라우저에서 http://joekog.iptime.org/hi.php로 접속했을 때 '웹 사이트 표시를 거부했다'는 식의 권한 관련 화면이 브라우저 뜨고 해당 웹 페이지가 실행되지 않는다.


# vi /etc/apache2/apache2.conf를 열어서 다음과 같은 정보가 보이는 곳의 아랫쪽에


<Directory />

        Options FollowSymLinks

        AllowOverride None

        Require all denied

</Directory>


<Directory /usr/share>

        AllowOverride None

        Require all granted

</Directory>


<Directory /var/www/>

        Options Indexes FollowSymLinks

        AllowOverride None

        Require all granted

</Directory>


다음과 같이 설정 값을 추가해 준다.


<Directory /home/joekog/www/>

        Options Indexes FollowSymLinks

        AllowOverride None

        Require all granted

</Directory>


이상의 모든 과정을 마친 후 아파치를 재시작해 주어야 한다.


# service apache2 restart


이제 웹 브라우저에서 


http://joekog.iptime.org로 접속하면 hi.php의 아래 내용이 실행된 웹 페이지를 브라우저에서 확인할수 있을 것이다.


<?php

echo "<h1>Hi~~ This is joekog.iptime.org's web root.</h1>";

echo "Web Root : /home/joekog/www/";

?>


이번에는 fullstack.iptime.org에 대해서 작업을 할텐데 joekog에 대해 했던 동일한 작업을 그대로 해 준 후 ipTIME의 DDNS 설정을 fullstack.iptime.or로 변경 한 후 웹 브라우저에서 http://fullstack.iptime.org를 실행하면 이번에는 /home/fullstack/www/html/joe.php의 내용이 실행된 웹 페이지가 뜨게 될것이다. 이때 서로 다른 웹 페이지임을 구분하기 위해서 joe.php의 내용을 hi.php와는 다른 내용으로 작성하면 가상 호스트의 작동이 정상적인지를 확인할수 있을 것이다.



Ubuntu에서 Symbolic link 생성시 다음과 같은 에러가 발생하는 경우가 있다.


"그런 파일이나 디렉토리가 없습니다."

No such file or directory


심볼릭 링크로 정상적으로 해당 디렉토리와 심볼릭 파일이 생성되어 ls 명령어로 정상적으로 표시가 됨에도 불구하고 해당 파일의 내용을 볼려고 cat 등으로 확인하고자 하면 위와 같은 에러가 발생한다. 분명히 해당 파일이 있음에도 불구하고...


원인은 Symbolic link는 절대 경로로 생성해야 한다. 상대경로로 생성시 위와 같은 현상이 나타났다.




이클립스에서 JSP/Servlet 실행시 아래와 같은 에러가 발생하는 경우가 있다. 내용은 톰캣이 사용하는 포트가 있는데(8005, 8181, 8009) 그 포트를 이미 다른 곳에서 사용하고 있다는 뜻이다.


Several ports (8005, 8181, 8009) required by Tomcat v7.0 Server at localhost are already in use. The server may already be running in another process, or a system process may be using the port. To start this server you will need to stop the other process or change the port number(s).


이럴 경우는 netstat 명령어를 이용하여 위의 포트의 Process ID(PID)를 알아내서 해당 Process를 kill 시켜 버린 후 다시 이클립스로 해당 프로젝트를 실행하면 정상적으로 구동이 된다.


netstat -anop tcp

 

활성 연결


  프로토콜  로컬 주소              외부 주소              상태            PID

  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       948

  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4

  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING       3596

  TCP    0.0.0.0:5357           0.0.0.0:0              LISTENING       4

  TCP    0.0.0.0:7680           0.0.0.0:0              LISTENING       10260

  TCP    0.0.0.0:8009           0.0.0.0:0              LISTENING       8604

  TCP    0.0.0.0:8181           0.0.0.0:0              LISTENING       8604

  TCP    0.0.0.0:xxxx          0.0.0.0:0              LISTENING       644

  TCP    0.0.0.0:xxxx          0.0.0.0:0              LISTENING       1412

  TCP    0.0.0.0:xxxx          0.0.0.0:0              LISTENING       1296

  TCP    0.0.0.0:xxxx          0.0.0.0:0              LISTENING       2344

  TCP    0.0.0.0:xxxx          0.0.0.0:0              LISTENING       2096

  TCP    0.0.0.0:xxxx          0.0.0.0:0              LISTENING       716

  TCP    0.0.0.0:xxxx          0.0.0.0:0              LISTENING       724

  TCP    0.0.0.0:xxxx          0.0.0.0:0              LISTENING       4

  TCP    127.0.0.1:1235         0.0.0.0:0              LISTENING       3916

  TCP    127.0.0.1:8005         0.0.0.0:0              LISTENING       8604

  TCP    192.168.xxx.xxx:139    0.0.0.0:0              LISTENING       4

  TCP    192.168.xxx.xxx:49651  xxx.xxx.xxx.xxx:443    ESTABLISHED     11008

  TCP    192.168.xxx.xxx:50782  xxx.xxx.xx.x:80        TIME_WAIT       0

  TCP    192.168.xxx.xxx:50837  xxx.xxx.xx.x:80        TIME_WAIT       0

  TCP    192.168.xxx.xxx:50838  xxx.xxx.xx.x:80        TIME_WAIT       0

  TCP    192.168.xxx.xxx:50839  xxx.xxx.xx.x:80        TIME_WAIT       0

... 중 략 ...


이 명령어에서 출력된 내용중 8005, 8181, 8009 포트에 대한 PID가 8604임을 확인할수 있고 해당 Process를 다음과 같이 죽이면 된다.

DOS(커맨더) 창에서 아래 명령어로 해당 Process를 죽이면 된다.


taskkill -f /pid 8604



Linux(여기서는 Ubuntu 기준) 서버에 PuTTY를 이용한 SSH로 접속하거나 FileZilla와 같은 FTP로 접속을 하고자 할때 원격에서 FTP, SSH로 접속이 가능하도록 리눅스를 어떻게 구성할것인지에 대해 정리하고자 한다.


Ubuntu Server 버전에서는 기본적으로 SSH로 접속이 가능한지는 테스트해 보지 않아서 잘 모르겠으나(아마도 되는 것으로...) Ubuntu Desktop 버전에서는 최초 설치 상태에서 FTP(FileZilla)나 SSH(PuTTY)로 접속을 시도하면 당연히 연결 실패가 된다.

다음 과정을 통해서 원격에서 접속이 가능하도록 설정해 보자.

기본적인 전제로 root 계정이 생성되어 있고 일반 유저 계정으로 joe라는 계정이 생성되어 있다고 가정한다.

그리고 SFTP로 접속할수 있도록 설정할 것이다.



1. Ubuntu의 기본 FTP 서버용 패키지 설치

# apt-get install vsftpd


⇒ vsftpd만 설치했을 경우는 FileZilla에서 root가 아닌 일반 사용자 계정으로는 접속이 가능하다. 단 SFTP로는 안되고 FTP로 port 21번으로 접속하면 접속이 된다. 참고로 SFTP는 디폴트 포트번호가 22번이다. vsftpd의 다양한 설정에 대해서는 여기서는 생략. vsftpd의 환경 설정 경로는 /etc/vsftpd.conf 파일을 vi로 열어서 환경 설정을 통한 기능들을 조정할 수 있다.


2. SSH 서버 설치

# apt-get install openssh-server


⇒ 여기까지 실행하면 root 계정이 아닌 일반 계정에서는 SFTP로 접속이 가능해 진다.


3. root 계정으로도 SFTP 접속 가능하도록 설정하기

# vi /etc/ssh/sshd_config


⇒ 내용 중에서 PermitRootLogin의 값이 prohibit-password로 되어 있는 것을 yes로 다음과 같이 수정


PermitRootLogin yes


파일 저장 후 ssh restart하기


# service ssh restart


이후부터는 SFTP(port 22)로 정상적으로 접속이 가능해 진다.


이상의 FileZilla의 경우도 동일하게 putty에서도 동일하다.

putty는 접속 포트가 22이다.


그런데 SFTP나 SSH접속(putty)을 root 계정으로 굳이 접속 가능하도록 설정하는 것은 보안상 바람직한 것은 아니다. 왜냐하면 일반 계정으로 접속해서 su command를 이용하여 슈퍼유저로 로그인 해서 사용할수 있기 때문이다. 

물론 이때는 root계정의 비번을 당연히 일반 계정의 비번과 다르게 해야겠지만...




DOS 창에서 MySQL에 root 계정으로 비번 입력 없이 막바로 접속이 가능할 경우 비번 셋팅하기


MySQL을 Windows에 설치하는 방법 중 일반적인 install 방법이 아닌 압축(.zip) 형태의 파일을 다운 받아 압축을 해제한 후 MySQL을 등록하는 경우 root계정에 비번이 없는 상태로 등록이 되어 비번 입력 없이 MySQL에 접속이 된다. 이럴경우 다음과 같이 MySQL에 접속한 후 


c:\mysql -uroot -p

Enter password:


여기서 비번 입력 없이 엔터를 치면 막바로 다음과 같이 MySQL에 접속이 된다.


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

Your MySQL connection id is 7

Server version: 5.6.40 MySQL Community Server (GPL)


Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.


Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.


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


이럴 경우 root 계정에 비밀번호를 셋팅하는 방법이다.


mysql> use mysql;

mysql> select host, user, password from user;

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

| host      | user | password |

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

| localhost | root |          |

| 127.0.0.1 | root |          |

| ::1       | root |          |

| localhost |      |          |

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

4 rows in set (0.00 sec)


이상과 같이 mysql 데이터베이스의 root 계정에 비번이 설정되어 있지 않음을 확인할 수 있다.

이제 root 계정에 비밀번호를 다음과 같이 셋팅한다.


mysql> update user set password=password('xxxxxxxx') where user='root';

Query OK, 3 rows affected (0.03 sec)

mysql>flush privileges;

Query OK, 0 rows affected (0.00 sec)


이상과 같이 하면 이제 MySQL에 root 계정으로 접속시 비번을 입력해야 접속이 가능하게 된다.



JSP에서 JSTL의 forTokens 태그의 간단 예제 


<%-- member라는 변수에 value에 있는 값들을 저장 --%>

<c:set var="member" value="홍길동, 고길동, 둘리, 챨리"/>


<%-- items에 지정된 배열 혹은 Collection 데이터들을 delims가 지정한 문자인 ,를 구분자로

          각각의 데이터를 var이 지정한 변수에 저장. 

          Java의 foreach문과 StringTokenizer가 결합된 형태이다.

--%>

<c:forTokens var="data" items="${member }" delims=",">

<font face="궁서" size="25"><b><c:out value="${data },"/>&nbsp;</b></font>

</c:forTokens>


출력결과는


홍길동,  고길동,  둘리,  챨리,  




+ Recent posts