지난번 qmail + vpopmail 은 cdb 를 이용하는 방법이었다.(
http://blog.1day1.org/329)
즉, 사용자 계정정보를 txt 형태로 저장하는 것이었다.
사용자 계정정보를 mysql 을 이용한 디비에 저장하는 방법을 사용해보자.
기존 cdb 방식에서 " --with cdb " 를 빼고 SRPM 빌드를 하면된다.
rpmbuild --rebuild knetqmail-0.0.3.src.rpm
빌드전에 mysql-devel 패키지를 설치해준다. mysql 이 /usr/local/mysql 에 설치가 되어 있지 않다면..
yum install mysql-devel
그리고, /usr/local/mysql/include , /usr/local/mysql/lib 를 각각 심볼릭 링크해준다. (64bit 환경)
ln -s /usr/include /usr/local/mysql/include
ln -s /usr/lib64 /usr/local/mysql/lib
빌드하고 설치 후에 mysql DB 생성 해준다.mysql> create databases vpopmail ;
mysql> GRANT ALL PRIVILEGES ON vpopmail.* TO 'vpopmail'@'localhost' IDENTIFIED BY '계정암호' WITH GRANT OPTION ;
mysql> flush privileges;
vpopmail 이 mysql 계정에 접근할 수 있도록 설정을 바꿔준다.
/home/vpopmai/etc/vpopmail.mysql 을 편집한다.
아래와 같은 라인을 DB 명및 계정/암호 등을 맞게 수정한다.
# host|port|user|password|database
#
localhost|0|root|secret|vpopmail
기본값이 root 계정을 이용하는 것인데, vpopmail 계정을 생성해서 해당 계정으로 바꿔주어도 된다.
계정및 DB 는 자신이 원하는 값으로 바꾸면 된다.
localhost|0|vpopmail|계정암호|vpopmail
vadddomain 등 명령을 내렸을때 다음과 같은 에러가 난다면...Error - no authentication database connection. Initial open
vpopmail 에서 mysql 으로 연결이 정상적으로 이뤄지지 않는다.
64bit 환경에서 빌드한 경우 위와 같은 에러가 날 수 있다.
strace vadddomain mydomain.com >& debug.txt
등으로 체크해보면...
위와 비슷한 메세지를 볼 수 있다.(처음 부분)
open("/usr/local/mysql/lib/mysql/tls/x86_64/libmysqlclient.so.15", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/local/mysql/lib/mysql/tls/x86_64", 0x7fff9dba66c0) = -1 ENOENT (No such file or directory)
open("/usr/local/mysql/lib/mysql/tls/libmysqlclient.so.15", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/local/mysql/lib/mysql/tls", 0x7fff9dba66c0) = -1 ENOENT (No such file or directory)
open("/usr/local/mysql/lib/mysql/x86_64/libmysqlclient.so.15", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/local/mysql/lib/mysql/x86_64", 0x7fff9dba66c0) = -1 ENOENT (No such file or directory)
open("/usr/local/mysql/lib/mysql/libmysqlclient.so.15", O_RDONLY) = 3
진한 부분이 mysql 라이브러리를 불러오는 부분인데, 좀 이상하다.
윗부분에서 x86_64 에서 불러오지 못한다. 해당 위치를 확인해보면.(/usr/local/mysql/lib/mysql)
-rw-r--r-- 1 root root 21408 Sep 22 2008 libdbug.a
-rw-r--r-- 1 root root 73040 Sep 22 2008 libheap.a
-rw-r--r-- 1 root root 465624 Sep 22 2008 libmyisam.a
-rw-r--r-- 1 root root 41978 Sep 22 2008 libmyisammrg.a
-rw-r--r-- 1 root root 872012 Sep 22 2008 libmysqlclient.a
-rwxr-xr-x 1 root root 879 Sep 22 2008 libmysqlclient.la
lrwxrwxrwx 1 root root 24 Sep 22 2008 libmysqlclient.so -> libmysqlclient.so.15.0.0
lrwxrwxrwx 1 root root 24 Sep 22 2008 libmysqlclient.so.15 -> libmysqlclient.so.15.0.0
-rwxr-xr-x 1 root root 640162 Sep 22 2008 libmysqlclient.so.15.0.0
-rw-r--r-- 1 root root 493164 Sep 22 2008 libmystrings.a
-rw-r--r-- 1 root root 448720 Sep 22 2008 libmysys.a
-rw-r--r-- 1 root root 11890 Sep 22 2008 libvio.a
이런식이다. x86_64 같은 경로는 없다.(위의 라이브러리는 rpm 설치시 복사되는 듯 하다. 혹은 rpmbuild 시)
즉, 64bit 환경에서는 x86_64 에서 불러와야 하는데, 아무도 32bit 라이브러리를 불러오기 때문인 듯 싶다.
/usr/local/mysql/lib 를 libx 로 이름을 바꿔보고 다시 테스트 해봤다.
open("/usr/local/mysql/lib/mysql/tls/x86_64/libmysqlclient.so.15", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/local/mysql/lib/mysql/tls/x86_64", 0x7fffbebbde90) = -1 ENOENT (No such file or directory)
open("/usr/local/mysql/lib/mysql/tls/libmysqlclient.so.15", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/local/mysql/lib/mysql/tls", 0x7fffbebbde90) = -1 ENOENT (No such file or directory)
open("/usr/local/mysql/lib/mysql/x86_64/libmysqlclient.so.15", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/local/mysql/lib/mysql/x86_64", 0x7fffbebbde90) = -1 ENOENT (No such file or directory)
open("/usr/local/mysql/lib/mysql/libmysqlclient.so.15", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/local/mysql/lib/mysql", 0x7fffbebbde90) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=84051, ...}) = 0
mmap(NULL, 84051, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b05b2aa7000
close(3) = 0
open("/usr/lib64/mysql/libmysqlclient.so.15", O_RDONLY) = 3
역시 마지막줄의 /usr/lilb64/mysql 에서 불러오는 것을 볼 수 있다.
이렇게 하면 정상적으로 에러없이 계정이 생성된다.
또는 /usr/local/mysql/lib/mysql/ 에 심볼릭 링크를 걸어줘도 된다.
ln -s /usr/lib64/mysql x86_64
아무튼 /usr/local/mysql/lib/mysql/libmysqlclient.so.15 을 불러오면 64bit 에서는 정상실행(연결)되지 않는다.
ps. 일반적으로 /usr/local/mysql 에는 아무것도 없을 것이다.
(mysql 을 소스컴파일 해서 해당 위치를 지정하지 않는이상)
가상머신에 깔려있는 VM 이미지가 mysql 이 설치되어 있는 것 같다.
근데 궁금한 것이 있다.과연 vpopmail 을 mysql 연결이 어떤 이점이 있을까?
아무래도 파일보다는 DB 가 관리상 편하긴 할 것이다.
그런데, 메일의 잦은 접속때문에 DB connect 문제가 생기지 않을까?
계정확인을 위한 select 가 거의 대부분을 차지 하기 때문에 큰 문제가 아닐까?
메일서버가 DB서버도 겸하고 있을때는 한쪽의 부하가 다른 쪽에 영향을 주지 않을까?
아니면 vpopmail 의 컨넥션은 한번 이루어지고 계속 연결상태를 유지하나?(소스를 들여다 봐야 겠다)