OpenSUSE 12.1 에서 powerdns 3.2 & pdns_gui with MySQL backend 설치/설정 과정 정리


[사전 환경 점검]

- DB server: MySQL(5.1 or 5.5) 설치

- Web server: 

  Apache2 + php + poweradmin 2.1.6 or pdns gui 0.3.3

  또는 lighttpd with php(php-fpm)(http://bryans.tistory.com/76, http://bryans.tistory.com/77 참고) + poweradmin 2.1.6


* 본 문서에서는 pdns 3.2 + MySQL(Percona 5.5.*) + Apache2 + php + pdns gui 0.3.3 을 채택한다


[pdns 3.2 설치]


1. libz.so 소프트 링크 설정


# cd /lib64/

# ln -s libz.so.1 libz.so

# ldconfig

# ls -l /lib64/libz.so*

lrwxrwxrwx 1 root root     9 Feb  8 15:34 /lib64/libz.so -> libz.so.1

lrwxrwxrwx 1 root root    13 Apr  1  2012 /lib64/libz.so.1 -> libz.so.1.2.5

-rwxr-xr-x 1 root root 96488 Feb  9  2012 /lib64/libz.so.1.2.5


2. MySQL, LUA 를 위한 라이브러리 설정


# zypper in -y libmysqlclient18 libmysqlclient-devel libmysqlclient18-32bit  libmysqlclient_r18 libmysqlclient_r18-32bit gcc-c++ boost-devel

# zypper in -y lua lua-devel


3. pdns 3.2 소스 다운로드 및 설치

설치 디렉토리는 /user/service/powerDNS 로 가정


# cd /user/service/download

# wget http://downloads.powerdns.com/releases/pdns-3.2.tar.gz

# tar xvzf pdns-3.2.tar.gz

# cd pdns-3.2

./configure --with-modules="gmysql" --prefix=/user/service/powerDNS

# make

# make install


4. pdns 설정


# vi /etc/init.d/pdns

#!/bin/sh

# chkconfig: 345 80 75

# description: PDNS is a versatile high performance authoritative nameserver


prefix=/user/service/powerDNS

exec_prefix=${prefix}

BINARYPATH=${exec_prefix}/bin

SBINARYPATH=${exec_prefix}/sbin

SOCKETPATH=/var/run


[ -f "$SBINARYPATH/pdns_server" ] || exit 0


cd $SOCKETPATH

suffix=`basename $0 | awk -F- '{print $2}'`

if [ $suffix ] 

then

EXTRAOPTS=--config-name=$suffix

PROGNAME=pdns-$suffix

else

PROGNAME=pdns

fi


pdns_server="$SBINARYPATH/pdns_server $EXTRAOPTS"


doPC()

{

ret=$($BINARYPATH/pdns_control $EXTRAOPTS $1 $2 2> /dev/null)

}


doPC ping

NOTRUNNING=$?


case "$1" in

status)

if test "$NOTRUNNING" = "0" 

then 

doPC status

echo $ret

else

echo "not running"

fi 

;;

stop)

echo -n "Stopping PowerDNS authoritative nameserver: "

if test "$NOTRUNNING" = "0" 

then 

doPC quit

echo $ret

else

echo "not running"

fi 

;;

force-stop)

echo -n "Stopping PowerDNS authoritative nameserver: "

killall -v -9 pdns_server

echo "killed"

;;

start)

echo -n "Starting PowerDNS authoritative nameserver: "

if test "$NOTRUNNING" = "0" 

then 

echo "already running"

else

$pdns_server --daemon --guardian=yes

if test "$?" = "0"

then

echo "started"

fi

fi 

;;

force-reload | restart)

echo -n "Restarting PowerDNS authoritative nameserver: "

echo -n stopping and waiting.. 

doPC quit

sleep 3

echo done

$0 start

;;

reload) 

echo -n "Reloading PowerDNS authoritative nameserver: "

if test "$NOTRUNNING" = "0" 

then 

doPC cycle

echo requested reload

else

echo not running yet

$0 start

fi 

;;

monitor)

if test "$NOTRUNNING" = "0" 

then 

echo "already running"

else

$pdns_server --daemon=no --guardian=no --control-console --loglevel=9

fi 

;;

dump)

if test "$NOTRUNNING" = "0" 

then 

doPC list

echo $ret

else

echo "not running"

fi 

;;

show)

if [ $# -lt 2 ]

then

echo Insufficient parameters

exit

fi 

if test "$NOTRUNNING" = "0" 

then 

echo -n "$2="

doPC show $2 ; echo $ret

else

echo "not running"

fi 

;;

mrtg)

if [ $# -lt 2 ]

then

echo Insufficient parameters

exit

fi 

if test "$NOTRUNNING" = "0" 

then 

doPC show $2 ; echo $ret

if [ "$3x" != "x" ]

then

doPC show $3 ; echo $ret

else

echo 0

fi

doPC uptime ; echo $ret

echo PowerDNS daemon

else

echo "not running"

fi 

;;

cricket)

if [ $# -lt 2 ]

then

echo Insufficient parameters

exit

fi 

if test "$NOTRUNNING" = "0" 

then 

doPC show $2 ; echo $ret

else

echo "not running"

fi 

;;

*)

echo pdns [start\|stop\|force-reload\|restart\|status\|dump\|show\|mrtg\|cricket\|monitor]

;;

esac


# chmod a+x /etc/init.d/pdns


# cd /user/service/powerDNS/etc

# cp pdns-dist.conf pdns.conf

## 주의: linux 에서 설치시 pdns-dist.conf 파일에 CR 문자가 포함되어 pdns.conf 의 설정을 pdns_server가 읽지 못하는 경우가  생길 수 있다.

# /etc/init.d/pdns monitor

Feb 12 17:35:23 Reading random entropy from '/dev/urandom'

Feb 12 17:35:23 Unable to launch, no backends configured for querying

 이 때는 pdns.conf 파일의 모든 라인을 지우고, pdns-dist.conf 의 내용만 복사(Copy/Paste)하여 사용한다.


# vi pdns.conf -- 파일 마지막에 내용 추가, 저장

launch                    =gmysql

gmysql-host            =127.0.0.1

gmysql-user            =pdns

gmysql-password    =password

gmysql-dbname       =pdnsdb

#recursor=a.b.c.d


MySQL 에 root로 접속하여 pdnsdb 데이터베이스를 생성(또는 기존 스키마 사용도 가능)하고 아래의 테이블들을 생성한다.

CREATE TABLE domains (

  ID INT(11) NOT NULL AUTO_INCREMENT,

  NAME VARCHAR(255) NOT NULL,

  MASTER VARCHAR(128) DEFAULT NULL,

  TYPE VARCHAR(6) NOT NULL,

  ACCOUNT VARCHAR(40) DEFAULT NULL,

  LAST_CHECK INT(11) DEFAULT NULL,

  NOTIFIED_SERIAL INT(11) DEFAULT NULL,

  PRIMARY KEY (ID),

  UNIQUE KEY XPKT_DNS_DOMAINS (ID),

  UNIQUE KEY XAK1T_DNS_DOMAINS (NAME)

) Engine=InnoDB;


CREATE TABLE records (

  ID INT(11) NOT NULL AUTO_INCREMENT,

  DOMAIN_ID INT(11) DEFAULT NULL,

  NAME VARCHAR(255) DEFAULT NULL,

  TYPE VARCHAR(6) DEFAULT NULL,

  CONTENT VARCHAR(255) DEFAULT NULL,

  TTL INT(11) DEFAULT NULL,

  PRIO INT(11) DEFAULT NULL,

  CHANGE_DATE INT(11) DEFAULT NULL,

  PRIMARY KEY (ID),

  UNIQUE KEY XPKT_DNS_RECORDS (ID),

  KEY XIE1T_DNS_RECORDS (NAME),

  KEY XIE2T_DNS_RECORDS (NAME,TYPE),

  KEY XIE3T_DNS_RECORDS (DOMAIN_ID)

) Engine=InnoDB;


CREATE TABLE supermasters (

  SUPERMASTERS_SEQ INT(11) NOT NULL AUTO_INCREMENT,

  IP VARCHAR(25) NOT NULL,

  NAMESERVER VARCHAR(255) NOT NULL,

  ACCOUNT VARCHAR(40) DEFAULT NULL,

  PRIMARY KEY (SUPERMASTERS_SEQ),

  UNIQUE KEY XPKT_DNS_SUPERMASTERS (SUPERMASTERS_SEQ)

) Engine=InnoDB;


pdns 계정으로 해당 테이블들을 처리할 수 있도록 권한을 설정한다.

> GRANT SELECT ON supermasters TO pdns;

> GRANT ALL ON domains TO pdns;

> GRANT ALL ON records TO pdns;

> flush privileges;


pdns 정상 설치 확인

# /etc/init.d/pdns monitor

Feb 12 18:22:30 Reading random entropy from '/dev/urandom'

Feb 12 18:22:30 This is a standalone pdns

Feb 12 18:22:30 UDP server bound to 0.0.0.0:53

Feb 12 18:22:30 TCP server bound to 0.0.0.0:53

Feb 12 18:22:30 PowerDNS 3.2 (C) 2001-2013 PowerDNS.COM BV (Feb  8 2013, 16:53:55, gcc 4.6.2) starting up

Feb 12 18:22:30 PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.

Feb 12 18:22:30 Creating backend connection for TCP

% Feb 12 18:22:30 gmysql Connection successful

Feb 12 18:22:30 gmysql Connection successful

Feb 12 18:22:30 About to create 3 backend threads for UDP

Feb 12 18:22:30 gmysql Connection successful

Feb 12 18:22:30 gmysql Connection successful

Feb 12 18:22:30 gmysql Connection successful

Feb 12 18:22:30 gmysql Connection successful

Feb 12 18:22:30 gmysql Connection successful

Feb 12 18:22:30 gmysql Connection successful

Feb 12 18:22:30 Done launching threads, ready to distribute questions


위와 같은 메시지를 확인하였다면, ctrl-C로 종료한 후 아래와 같이 pdns 데몬을 시작하고 프로세스를 확인한다.

# /etc/init.d/pdns start

Starting PowerDNS authoritative nameserver: started


# ps -eaf | grep -v grep | grep pdns

root     15998     1  0 18:54 ?        00:00:00 /user/service/powerDNS/sbin/pdns_server --daemon --guardian=yes

root     16000 15998  0 18:54 ?        00:00:00 /user/service/powerDNS/sbin/pdns_server-instance --daemon --guardian=yes



[pdns gui 설치]


1. Apache2 설치, mod_rewrite 모듈 추가

# zypper in -y apache2 apache2-mod_php5 apache2-mod_dnssd apache2-prefork apache2-utils

# chkconfig --add apache2

# chkconfig apache2 on

# service apache2 start


# a2enmod rewrite

# service apache2 restart


2. php5 및 기본 & 추가 패키지 설치

# zypper in -y php5 apache2-mod_php5 php5-bz2 php5-ctype php5-curl php5-devel php5-fpm php5-gettext php5-iconv php5-mcrypt php5-mysql php5-openssl php5-pcntl php5-pdo php5-pear php5-zlib

# zypper in -y php5-pear-MDB2, php5-pear-MDB2_Driver_mysql


3. pdns_gui 다운로드 및 압축 해제, 설치

http://code.google.com/p/pdns-gui 에서 pdns-gui.0.3.3.tgz 다운로드

MYSQL> create database pdns;


# cd /srv/www/htdocs

# tar xvzf DOWNLOADED_DIR/pdns-gui.0.3.3.tgz

# cd pdns-gui.0.3.3/batch

# ./install.sh

DB접속ip(local서버일 경우 localhost가 아닌 127.0.0.1 사용), database명, DB계정/암호 입력


4. apache2 설정 및 pdns_gui 웹 기동

# vi /etc/apache2/default-server.conf

DocumentRoot "/srv/www/htdocs"


<VirtualHost *:8888>

  DocumentRoot /srv/www/htdocs/pdns-gui.0.3.3/web

  DirectoryIndex index.php

  <Directory /srv/www/htdocs/pdns-gui.0.3.3/web>

    AllowOverride All

  </Directory>

</VirtualHost>


# service apache2 restart


http://pdns-gui webserver ip:8888/ 접속


블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들

Opensuse 12.1 환경에서 PHP5 + lighttpd fastcgi + mongodb + mysql 개발/운영 환경 설정

* howtoforge.com 내용 참조, 테스트 실행 & 보완


1. Lighttpd & php5 환경 설정


# zypper in -y lighttpd

# systemctl enable lighttpd.service

# systemctl start lighttpd.service


* 기존의 php5 fastcgi 가 php5-fpm 패키지로 통합 업그레이드 되었고 별도 daemon으로 동작한다.

# zypper in -y php5-fpm


# mv /etc/php5/fpm/php-fpm.conf.default /etc/php5/fpm/php-fpm.conf

# chmod 1733 /var/lib/php5


* error_log 부분을 un-comment 하고 아래와 같이 수정한다

# vi /etc/php5/fpm/php-fpm.conf

error_log = /var/log/php-fpm.log


* 아래 라인들을 찾아서 확인하고 몇 가지 mandatory 설정을 un-comment 한다(pm=dynamic 일 경우)

* howtoforge.com 에서는 해당 설정 부분이 누락되어 있다

pm = dynamic

pm.max_children = 50

pm.min_spare_servers = 5

pm.max_spare_servers = 35


* fpm용으로 별도의 php.ini 파일이 없으므로 cli용을 복사한다.

# cp /etc/php5/cli/php.ini /etc/php5/fpm/


* 아래 해당 라인을 찾아서 un-comment 한다.

# vi /etc/php5/fpm/php.ini

cgi.fix_pathinfo=1


# systemctl enable php-fpm.service

# systemctl start php-fpm.service


# vi /etc/lighttpd/modules.conf -> 아래 라인을 찾아서 un-comment

include "conf.d/fastcgi.conf"


server.modules = (

...

  "mod_auth",

...

)


* 아래 라인을 추가

# vi /etc/lighttpd/lighttpd.conf

include "conf.d/auth.conf"


* 아래 라인들을 un-comment 하고 내용을 수정

# vi /etc/lighttpd/conf.d/auth.conf

auth.debug = 2

auth.backend = "plain"

auth.backend.plain.userfile  = "/etc/lighttpd/lighttpd.user"


auth.require = ( "/" =>

                      (

                        "method"  => "basic",

                        "realm"   => "Password protected area",

                        "require" => "user=loginid"

                      ),

                    )


* 아래 로그인 정보를 등록하고 저장

# vi /etc/lighttpd/lighttpd.user

loginid:loginpassword


# vi /etc/lighttpd/conf.d/fastcgi.conf -> 아래 라인이 있는지 확인

server.modules += ( "mod_fastcgi" )


* 아래 내용을 추가(기존의 fastcgi.server 부분의 comment 는 그대로 둔다)

fastcgi.server += ( ".php" =>

        ((

                "host" => "127.0.0.1",

                "port" => "9000",

                "broken-scriptfilename" => "enable"

        ))

)


# systemctl restart lighttpd.service


* lighttpd의  default 문서 홈디렉토리는 /srv/www/htdocs 이다


# vi /srv/www/htdocs/info.php

<?php

phpinfo();

?>


* 브라우저로 접속 확인




2. MySQL과 utility 패키지 설치


* Web 을 통하지 않고 직접 DB접속을 위해 접속 클라이언트를 사용할 경우에는 아래와 같이 클라이언트를 설치한다.

# zypper in -y mysql-community-server-client


* MySQL 및 일반적으로 많이 사용하는 드라이버 설치

# zypper in -y php5-mysql php5-bcmath php5-bz2 php5-calendar php5-ctype php5-curl php5-dom php5-ftp php5-gd php5-gettext php5-gmp php5-iconv php5-imap php5-ldap php5-mbstring php5-mcrypt php5-odbc php5-openssl php5-pcntl php5-pgsql php5-posix php5-shmop php5-snmp php5-soap php5-sockets php5-sqlite php5-sysvsem php5-tokenizer php5-wddx php5-xmlrpc php5-xsl php5-zlib php5-exif php5-pear php5-sysvmsg php5-sysvshm


3. mongodb 드라이버 설치


* 11.x 환경과는 다르게 12.1 부터는 pecl 을 통해 php용 mongo 드라이버를 쉽게 설치할 수 있다


# pecl install mongo


# vi /etc/php5/fastcgi/php.ini -> 아래 라인을 추가

extension=mongo.so


# systemctl restart lighttpd.service

# systemctl restart php-fpm.service


* 1의 과정과 같이 브라우저를 통해 php 환경에 맞게 설치된 드라이버들을 최종 확인한다.






블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


* 본 정보는 Opensuse 12.1 에도 그대로 적용 가능하다.

Opensuse 에 기본으로 제공되는 scim(xim)은 terminal 에서 한글 입력이 거의 안된다. 무슨 말인지 모르겠다면 직접 설치해서 gedit 이나 chrome 에서 한글을 입력해 보면 된다. 아마도 '우리는' 이라고 치면 '우루는' 이라고 입력되는 꼬락서니를 볼 수 있을 것이다.

* 선행 패키지 설치(su - 로 root 로 변신)

  # zypper in -y gcc make autoconf libhangul libhangul-devel

  -> http://code.google.com/p/libhangul/downloads/list 에서 libhangul 최신 버전 확인

  -> wget http://libhangul.googlecode.com/files/libhangul-0.1.0.tar.gz

  -> configure --prefix=/usr; make; make install



* Nabi source download & build

  # wget http://kldp.net/projects/nabi/download/5926?filename=nabi-0.99.9.tar.gz

  -> http://code.google.com/p/nabi/downloads/list 에서 최신 버전 확인 

  -> wget http://nabi.googlecode.com/files/nabi-0.99.11.tar.gz


  # tar xvzf nabi-0.99.11.tar.gz

  # ./configure --prefix=/usr
  # make && make install


* nabi 설정

  # vi /etc/X11/xim.d/nabi

  OLD_PATH=$PATH
  PATH=/usr/bin:/usr/X11R6/bin:$PATH

  if ! type -p nabi > /dev/null 2>&1 ; then
    echo "nabi is not available."
    return 1
  fi

  export XMODIFIERS="@im=nabi"
  export GTK_IM_MODULE=xim
  export QT_IM_SWITCHER=imsw-multi
  export QT_IM_MODULE=xim

  case $WINDOWMANAGER in
    *kde|*windowmaker|*wmaker)
    nabi -wm -wait &
    ;;
  *)
    nabi &
    ;;
  esac

  PATH=$OLD_PATH

  # success:
  return 0


# vi /etc/sysconfig/language, 아래 내용으로 편집/수정

  INPUT_METHOD="nabi"



* Logout하고 다시 Login 하면 우측하단 Tray에서 nabi icon 을 확인할 수 있다 


블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들