CentOS에 FreeTDS 설치하기

Step 1. 소스 다운로드

http://www.freetds.org 에서 FreeTDS 소스를 받는다.

Step 2. 압축 해제

다음의 명령으로 압축을 푼다.

gunzip freetds-stable.tgz

압축을 풀면 tar 파일이 하나 나온다. tar xvf 명령으로 압축을 해제한다.

tar xvf freetds-stable.tar

Step 3. 컴파일

압축 해제가 되면 freetds 폴더가 나오는데 여기에 들어가서 컴파일을 시작한다. configure / make / make install 명령으로 실행한다. 난 소스 설치할 때 위치를 지정해서 설치하는 편이라 –prefix 로 위치를 지정했다.

[dongbum@localhost freetds-0.91]$ ./configure --prefix=/usr/local/FreeTDS --enable-msdblib
[dongbum@localhost freetds-0.91]$ make
[dongbum@localhost freetds-0.91]$ make install

실행을 다 하고 나면 /usr/local/FreeTDS 에 freetds 관련 파일들이 설치된다.

Step 4. 라이브러리 파일 경로 설정

/etc/profile 에 LD_LIBRARY_PATH에 freetds의 라이브러리 파일들을 연결해준다. /etc/profile 파일을 vi로 연다음 다음처럼 추가한다.

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/FreeTDS/lib

설정이 적용되도록 재부팅을 한번 해준다.

Step 5. odbc.ini 파일 수정

/etc/odbc.ini 파일에 내가 사용할 DB의 이름을 설정해준다. 내 경우에는 freetds 외에도 sqlite 설정도 같이 추가하였다.

[dongbum@localhost log]$ cat /etc/odbc.ini
[111.222.333.444]
Driver = FreeTDS
Description = 111.222.333.444
Trace = No
Servername = 111.222.333.444
Database = 기본DB이름

[TEST_SQLITE3]
Description = TEST SQLITE
Driver = SQLite
Database = /test/sqlite/test_sqlite.db
StepAPI = NO

Step 6. odbcinst.ini 파일 수정

/etc/odbcinst.ini 파일에도 다음과 같은 설정을 추가해준다. 역시 SQLite를 사용하기 위한 설정도 추가하였다.

[FreeTDS]
Description = v0.64 with protocol v4.2
Driver = /usr/lib64/libtdsodbc.so
UsageCount = 5

[SQLite]
Description = ODBC for SQLite
Driver = /usr/local/lib/libsqlite3odbc.so
Setup = /usr/local/lib/libsqlite3odbc.so
FileUsage = 1
CPTimeout =
CPReuse =

/usr/lib64/libtdsodbc.so 파일은 /usr/local/FreeTDS/lib/libtdsodbc.so 파일을 향하도록 심볼릭링크를 걸어준다.

Step 7. freetds.conf 파일 수정

마지막으로 freetds.conf 파일을 수정해준다. 난 /usr/local/FreeTDS에 설치하였으므로 /usr/local/FreeTDS/etc/freetds.conf 파일을 수정해주면 된다.

[global] 섹션에

client charset = EUCKR
text size = 4290000000
tds version = 4.2

를 추가한다. 캐릭터셋과 tds 버전 등을 지정하는 문구 같은데 이 옵션에 대해 정확히는 나도 잘 모르겠다. 그리고 아까 추가한 서버이름을 그대로 추가해준다.

[111.222.333.444]
host = 111.222.333.444
port = 1433
tds version = 8.0

여기까지 다 설정하고나면 FreeTDS 사용이 가능하다.

리눅스에서 MSSQL 접속이 쉬운게 아니란걸 다시 한번 느낀다.

CentOS에서 SVN 서버 설정시 주의할 점

HTTP 프로토콜을 이용해 svn 서버를 운영하고 있었는데 이러다보니 아파치 서버가 없이는 svn을 사용할 수가 없는 상황이 되었다.

향후에는 nginx로 넘어가려고 하는데 아파치가 발목을 잡을 수 있어서 svn:// 프로토콜로 넘어가려고 해서 svnserve를 yum으로 설치했으나 svn에 연결이 되지 않았다. 외부 서버에서 접속이 안되는게 아니라 내부에서도 접속이 안되었기 때문에 뭔가 문제라고 생각했다.

곰곰이 생각해보니 svn 서버를 설정할 때 레포지토리 루트 경로를 설정한 적이 없어서 도대체 어디서 레포지토리 루트 경로를 잡고 있는지 궁금했는데 인터넷 검색을 하다가 찾았다.

http://blog.naver.com/haengro?Redirect=Log&logNo=40194678804

본문에 있던대로 /etc/sysconfig/svnserve 파일을 생성하고 옵션을 설정하니 정상적으로 접속이 되었다.

CentOS에서 Jenkins 설치하기

jenkins_logo

CentOS에서 Jenkins를 설치하기 위한 문서이다.

CentOS 6.4이고 Jenkins는 2013년 11월 17일 버전으로 한다.

젠킨스를 설치할 디렉토리를 설정하고 거기에 젠킨스 홈페이지인 http://jenkins-ci.org 에서 최신버전을 받아 넣는다. 현재 가장 최신 버전은 1.539 버전이다. 다운로드 받을려면 wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war 명령으로 war 파일을 받을 수 있다. 내 경우에는 /home/jenkins 디렉토리를 만들고 거기에 war 파일을 받아 넣었다.

톰캣의 환경설정을 한다. 내 경우에는 톰캣을 아파치와 연동해서 사용하고 있다.

톰캣의 서버 설정파일인 /etc/tomcat6/server.xml에 가서 다음의 내용르 추가한다.

<Host name="jenkins.도메인.com" appBase="/home/jenkins" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
 <Alias>jenkins.도메인.com</Alias>
 </Host>

난 Alias를 해놨기 때문에 Catalina 디렉토리의 jenkins.도메인.com 디렉토리의 ROOT.xml 파일을 수정해야했다. ROOT.xml 파일에는 다음의 내용을 넣는다.

<?xml version="1.0" encoding="UTF-8"?>
 <Context path="" docBase="" debug="1">
 </Context>

만약 Alias를 쓰지 않는다면 위의 server.xml 설정 파일 중 <Alias></Alias> 부분을 위의 내용으로 바꾸어주면 된다.

service tomcat6 restart 명령으로 톰캣을 재시작한다. 재시작하고 웹브라우저를 연다음 아까 설치한 http://jenkins.도메인.com:8080/jenkins 으로 접속해본다.

안된다…

방화벽의 8080 포트를 열어줘야한다. /etc/sysconfig/iptables 에서 8080 포트를 열어주고 service iptables restart 를 입력하여 방화벽을 재시작한다.

다시  http://jenkins.도메인.com:8080/jenkins 으로 접속하면 다음과 같은 화면이 뜬다.

jenkins_error

JENKINS_HOME이 설정되어 있지 않아 다른 디렉토리를 설정한다는 내용이다.

war 파일을 넣어놓은 디렉토리에 젠킨스 홈디렉토리롤 쓸 디렉토리를 추가한다. 내 경우에는 /home/jenkins/.jenkins 로 정했다.

그다음 /etc/profile에 다음의 내용을 추가한다.

export JENKINS_HOME=/home/jenkins/.jenkins

바로 적용을 위해서 source /etc/profile 을 입력한다. 내용이 적용되면 톰캣을 재시작한다.

다시 같은 위치로 들어가보면 다음처럼 젠킨스 사용 준비가 완료된다.

jenkins_ready

이제 젠킨스를 사용하면 된다.

맥 OSX에서 리눅스의 X-Window에 접속하는 방법

리눅스 서버에 이클립스를 설치해서 사용 중이다.

윈도우에서는 MobaXterm을 이용해서 접속하면 X-Window에 대한 처리를 알아서 다 해주기 때문에 신경쓸게 없었다.

맥에서도 리눅스 서버의 이클립스를 사용할 수 없을까 해서 동일하게 X-Window를 이용하려 했으나 역시나 되지 않았다. 여기저기서 찾아본 결과 다음의 과정을 거치면 사용할 수 있었다.

일단 X11 프로그램을 설치해야한다. 파인더를 열고 ‘응용 프로그램’에 있는 ‘유틸리티’ 폴더에 들어가 ‘X11’을 실행한다. 실행하면 아마 XQuartz라는 프로그램의 홈페이지인 http://xquartz.macosforge.org 로 이동한다. 이 프로그램은 맥에서 X11을 사용할 수 있는 프로그램이다.

이 프로그램을 설치하면 유틸리티 밑에 XQuartz라는 프로그램이 설치된다.

이 프로그램을 설치하고 다시 서버에 접속하여 이클립스를 실행했으나 역시나 실행되지 않았다.

다시 검색해서 다음과 같은 글을 찾았다.

http://mactips.dwhoard.com/mactips/x11-and-terminal/x11-forwarding

/etc/sshd_config 파일을 수정해야 한다는 내용이다. 링크의 내용대로 X11Forwarding 항목의 주석을 해제하고 yes로 변경해준다.

마지막으로 재부팅을 한번하고 iTerm2로 서버에 접속하여 이클립스를 실행해보면 내 맥에서 XQuartz가 자동으로 실행되며 X-Window로 접속된 이클립스가 실행된다. 만세!

CentOS에서 GIT 설치

회사의 형상관리시스템이 Subversion에서 GIT를 쓰기로 결정되어 GIT를 내 서버에 한번 설치해본다.

CentOS 6.4에서 yum으로 기본적인 패키지는 다 있을거란 가정하에 설치시작.

yum으로 설치하려 했으나 역시 공식 레포지토리에는 없다. 검색해보니 비공식 레포지토리를 이용해서 설치가 가능하긴하나 개인적으로 비공식 레포지토리는 EPEL을 제외하고는 좋아하지 않으므로 그냥 소스설치를 해보도록 한다. 페도라 EPEL에는 GIT가 있긴한데 그렇게 떙기진 않는다. ㅎㅎ

http://www.git-scm.com 에서 소스코드를 받아 압축을 푼다.

압축을 푼 후

make configure
 ./configure --prefix=/usr/local/git --with-openssl --with-libpcre --with-curl --with-expat --with-iconv --with-perl --with-python --with-zlib --with-tcltk
 make
 make install

하면 끝.

git라고 입력해보면 이제 git 명령이 잘 실행된다.

Zookeeper 설치

zookeeper회사 서버시스템에 적용 할 수 있나 알아보기 위해 Zookeeper를 테스트하기로 한다.

일단 아파치-주키퍼 사이트(http://zookeeper.apache.org/)에 들어가 다운로드 링크를 찾아 wget 으로 다운로드한다. 지금 이 포스팅을 하는 시점에서 가장 최신 버전은 3.4.5 버전이다.

압축을 풀면 나오는 디렉토리가 주키퍼의 프로그램 디렉토리이다.

일단 conf 디렉토리로 가서 zoo_sample.cfg 파일을 zoo.cfg 파일로 복사한다.

그리고 bin 디렉토리로 가서 ./zkServer.sh 명령으로 주키퍼를 실행한다.

실행하면 다음과 같은 화면이 출력된다.

JMX enabled by default
Using config: /backup/program/zookeeper-3.4.5/bin/../conf/zoo.cfg
Usage: ./zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}

CentOS의 service 와 마찬가지로 실행옵션을 주면서 실행할 수 있다.

./zkServer.sh start 를 입력했다.

JMX enabled by default
Using config: /backup/program/zookeeper-3.4.5/bin/../conf/zoo.cfg
Starting zookeeper … STARTED

시작되었다고 나왔지만 실제로 프로세스는 떠있지 않았다.

그래서 뭘까 생각해보다가 bin 디렉토리를 보았더니 zookeeper.out 파일이 생성되어 있었다. 이 파일의 내용에는,

nohup: failed to run command `/usr/share/java/bin/java’: 그런 파일이나 디렉터리가 없습니다

라고 되어있다.

아마 환경설정은 zkServer.sh 파일 안에 있을 것이므로 이 파일을 편집에서 java 라는 단어로 검색했으나 문제가 될만한 부분이 없었다. 하지만 보다보니 zkEnv.sh 를 실행하는 부분이 보인다. 파일명으로 보아 환경설정을 파는 파일이 이 파일 같으므로 다시 이 파일을 vi로 열어본다.

중간쯤 가다보면

if [ “$JAVA_HOME” != “” ]; then
JAVA=”$JAVA_HOME/bin/java”
else
JAVA=java
fi

이런 내용이 있다.

자바를 실행할 홈디렉토리를 설정하는 것 같다.

쉘로 나와서 echo $JAVA_HOME 을 입력해보니 /usr/share/java 이라고 뜬다. 그래서 결국은 zookeeper.out 파일에 /usr/share/java/bin/java 이런 경로가 없다고 나온 것이었다.

CentOS 6.4 에서는 java 명령은 사실 경로 설정이 없어도 상관이 없으며 굳이 경로를 넣고 싶다면 /usr/bin/java 로 실행하면 된다. (이 파일은 /etc/alternatives/java 의 심볼링링크이다.)

if [ “$JAVA_HOME” != “” ]; then
JAVA=”$JAVA_HOME/bin/java
else
JAVA=java
fi

이 부분을

if [ “$JAVA_HOME” != “” ]; then
# JAVA=”$JAVA_HOME/bin/java”
JAVA=/usr/bin/java
else
JAVA=java
fi

처럼 바꾸고 다시 ./zkServer.sh start 를 실행한다. 아무 문제 없이 STARTED 되었다고 나오고, 다시 ./zkServer.sh status 를 입력해보면

JMX enabled by default
Using config: /backup/program/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: standalone

라고 나오면 실행 성공.

이제부터는 주키퍼를 실제로 사용해보도록 한다.

시스템 코드페이지 변경

phpsysinfo를 업그레이드하고 나서 보니 Code Pages 부분 즉, 시스템코드페이지가 euc-kr로 나왔다.

왠만하면 서버의 모든 환경을 UTF-8로 맞추고 있는 실정이라 시스템코드페이지를 UTF-8로 변경하기로 결정.

/etc/sysconfig/i18n 파일을 열어서

LANG=”ko_KR.UTF-8″
SUPPORTED=”ko_KR.eucKR:ko_KR:ko”

이렇게 변경하고 저장한다.

완벽한 적용을 위해서 서버를 재부팅하면 완료.

리눅스에서 가상화 서버로 포트포워딩과 서비스 연결

좀더 빡세게 서버를 돌리기 위해 리눅스 서버 위에 윈도우 2008 서버를 가상화로 설치하여 사용 중이다.

문제는 이 리눅스 서버에는 이미 다양한 서버가 설치되어 있었는데 그중에는 웹서버도 포함되어 있었다. 또한 수십여개의 도메인도 연결되어 있었다. 기존에 사용하던 IP, 도메인 등은 그대로 둔채 특정 도메인이나 특정 포트만 가상화 서버로 연결해주려면 다음과 같이 한다.

<특정 포트만 가상화 서버로 포트포워딩하여 연결하고 싶은 경우>

iptables를 이용한다. 내 서버의 경우에는 윈도우 2008 가상화 서버에 192.168.122.95 라는 아이피가 부여되어 있었다.

<특정 도메인만 가상화 서버로 연결하고 싶은 경우>

이건 꽤 문제가 되는데 내 경우에는 HTTP 웹서비스를 담당하는 80번포트만 윈도우 서버에 따로 연결하고 싶었다.

아파치 서버의 conf 파일에서 Virtual Host를 하나 만들고 Server Name으로 원하는 도메인을 적은 다음과 같이 ProxyPass를 잡아준다.

ProxyPass / http://192.168.122.95/
ProxyPassReverse / http://192.168.122.95/

이렇게 하면 일단 해당 도메인으로 오는 요청을 리눅스 서버의 아파치 서버가 받은 다음 프록시 모듈을 이용해서 윈도우 서버로 통신을 넘겨준다.

krcert의 Castle JSP 설치 방법

KISA 한국인터넷진흥원의 인터넷침해대응센터에서는 Castle이라는 웹방화벽을 배포하고 있어서 설치해봤다. SQL 인젝션, 욕설 필터링 등등 좋은 기능이 많다.

이 소프트웨어는 PHP/JSP/ASP 3가지 버전으로 나와있어 자기 플랫폼에 맞는 버전으로 사용하면 된다. 내 서버의 경우에는 JSP와 PHP를 사용중인데 사실 PHP쪽은 잘 쓰지 않기도하고 JSP쪽으로 프로그래밍을 더 많이 즐기기 떄문에 JSP 버전으로 설치해보았다.

다운로드는 http://www.krcert.or.kr 에서 다운로드가 가능하다. 상단메뉴 중에 ‘웹보안서비스’에 ‘CASTLE’ 메뉴를 클릭하면 된다.

중요한 점 : 내가 해본 결과 이 페이지는 윈도우7 + 크롬에서는 잘 열리고 다운로드도 제대로 작동되었지만 맥 OSX 10.7 + Safari에서는 제대로 작동되지 않았다. 왜 다운로드가 안되나 한참 삽질했다.

다운로드하면 PHP/JSP/ASP 세가지 버전의 파일과 사용설명서, 설치설명서 등이 친절하게 들어있다. 사실 설치는 포함된 설치설명서 PDF 파일을 보고 그대로 하면 된다.

파일업로드 -> 자바 class 파일 컴파일 -> 기존 파일에 코드 삽입의 세단계로 이루어지는데 자바,  JSP와 서블릿을 조금이라도 해봤던 사람이라면 하나도 어렵지 않다.

문제는 다른 곳에 있었는데… 설치안내 문서에는 class 파일을 컴파일 할때 ‘javac *.java’를 실행하라고 나와있는데 이대로 했을 경우, EUC-KR 문자셋에 문제가 있다는 오류가 딱 100개 출력된다. 이 상태로 그냥 진행하면 작동은 되긴되나 나중에 방어 메시지가 한글이 모조리 깨지며 로그 파일의 한글도 모조리 깨지게 된다. java 파일을 열어봤으나 UTF-8로 제대로 저장되어 있었고 컴파일 명령도 제대로 내렸는데 왜 안됐을 까 한참 고민했는데 생각해보니 내 서버는 모든 환경을 UTF-8로 사용하고 있었다.

중요한 점 : 컴파일 할 때 ‘javac -encoding utf8 *.java’와 같이 -encoding 옵션으로 자기에게 맞는 문자셋을 지정해줘야한다. 정상적으로 컴파일이 되었다면 프롬프트에 아무런 메시지도 나타나지 않아야한다.

클래스 파일을 컴파일해서 넣고 진행했다. 이제서야 제대로 작동한다. install 화면을 진행하고 내 사이트의 헤더 파일에 프로그램 소스코드를 삽입한 후 작동테스트를 시작했다. 그런데 또 하나의 문제점 발견. 내 사이트에서는 예를 들어, a.jsp 파일에 form 양식이 있고 여기서 데이터를 입력 받은 다음 b.jsp 파일에 POST 형식으로 데이터를 넘기게 되어있었는데 a.jsp 파일에 캐슬 소스코드를 넣고 SQL 인젝션 테스트를 했더니 아무런 경고조치 없이 돌아가는 것이었다. 왜 이러나 고민하다가 b.jsp 파일에다가도 캐슬 소스코드를 넣었더니 그제서야 제대로 인젝션이 차단되었다.

중요한 점 : 데이터를 페이지에서 페이지로 이동시키며 처리하는 경우는 양쪽 모두에다가 캐슬 소스코드를 넣어줘야한다.

이렇게 설치하고 테스트해보면 SQL 인젝션을 잘 차단해주며 로그도 정상적으로 쌓인다.

 

사용해보니 몇가지 아쉬운 점은..

  1. 설치문서가 조금 단순하다. 좀더 다양한 상황에서 테스트해주시고 설치문서를 써주셧으면.
  2. 로그 파일이 저장되는 위치를 바꿀 수가 없다. 리눅스에서는 /var/log 디렉토리가 주로 로그파일 디렉토리로 많이 쓰이는데 castle은 로그파일이 무조건 캐슬 설치 디렉토리의 log 디렉토리에만 저장된다.
  3. 한 사이트마다 캐슬을 하나씩 설치해야한다. 캐슬 하나만 설치해서 여러사이트, 여러도메인에서 공유해서 사용할 수 있는 방법이 있으면 좋을 것 같다. 내 서버의 여러 사이트들에도 캐슬을 적용하고 싶었는데 한 사이트당 하나씩 설치해야하니 너무 부담스러워서 그만뒀다. 이렇게 설치해서 사용할 수 있는 방법이 있다면 설치문서에라도 좀 추가되길.
  4. iptables 같은 방화벽 소프트웨어와 연동해서 공격IP를 자동차단 할 수 있으면 더 좋을 것 같다. 웹프로그램의 특성상 시스템명령 수행이 좀 어렵긴하지만 가능하지 않을까? Runtime 클래스를 이용해도 될것 같고 아니면 나중에 C로 한번 만들어봐야할 것 같다.

하여튼 너무 좋은 프로그램 개발해주셔서 감사~ ^^ 혹시 나중에 krcert 관계자분이 이 글을 보게된다면 꼭 불편한 점과 아쉬운 점은 고쳐주셨으면 좋겠다.

Cacti에서 CPU Usage 표시하기

모니터링툴인 Cacti를 설치하면 기본으로 있는 그래픽 템플릿으로 여러가지 모니터링 템플릿이 들어있는데 아쉽게도 여기에는 CPU 사용률에 대한 그래픽 템플릿이 없다. 물론 Host MIB – CPU Utilization이나 ucd/net – Load Average 같은 템플릿이 있지만 이것은 내가 원하는 ##%형태의 숫자를 보여주는 것이 아니었다.

그래서 역시 오늘도 구글님에게 물어본 결과 괜찮은 답변을 받았다. 역시나 이미 나와 같은 고민을 했던 외국인들이 있었다.

http://forums.cacti.net/about15412.html

글을 읽어보면 2-way system / 4-way system / 8-way system 으로 파일이 나뉘어있다. 서버의 CPU에 맞도록 다운로드 받는다. 리눅스 시스템의 경우에는 /proc/cpuinfo 파일에 프로세서 정보가 나와있으니 여기에 CPU가 몇개나 보이는지 확인한 후 적당한 것을 다운로드 받으면 된다.

내 서버의 경우에는 Intel Xeon E3-1220 프로세서를 사용하고 있고 1개의 CPU에 4개의 코어가 장착되어있으므로 4-way용으로 다운 받았다.

다운로드 받은 후 Cacti의 메뉴 중 import templete에 들어가서 다운로드 받은 xml 파일을 선택하면 cacti에 CPU 사용률을 표시할 수 있는 그래픽 템플릿이 생성된다.