Tag Archives: 서버관리

[Subversion] 다양한 방법의 SVN 저장소 서비스 운영

SVN은 매우 추천할만한 Version Control 시스템입니다. 실제로 학교에서 프로젝트를 운영할때도 사용했었고 실무에서도 많이 접해오게 된 다방면으로 쓰이는 녀석입니다. 우선 SVN을 사용할때는 통합적으로 소스의 버젼관리를 위해 저장소(Repository)를 운영하게 되는데 24시간 운영되는 서버에서 데몬형식으로 서비스 되는 것이 일반적입니다. 가장 많이 쓰이게 되는 3가지 방법에 대해 알아보도록 하겠습니다.

* 일반 단일 데몬 형태

[code]/usr/bin/svnserve -d -r [저장소경로][/code]
일반적으로 가장 단순한 방법입니다. -d는 daemon의 약자로 데몬형태로 작동시키라는 말이됩니다. 곧바로 하나의 백그라운드 프로세스가 실행되어 svn:// 프로토콜로 접근할 수 있게 됩니다.

* inetd 형태

일반적으로 슈퍼데몬이라고 불리는 inetd(xinetd)에 얹혀 작동하게 되는 방식입니다. 서비스 운영을 슈퍼데몬에 위임하게 되므로 어찌보면 가장 간단하고 깔끔한 방식입니다.

[code]vi /etc/xinetd.d/svn[/code]
위와 같이 svn이라는 서비스를 추가해 줍니다. 파일안에는 다음의 내용을 작성하면 됩니다.

[code]service svn
{
        disable = no
        port = 3690
        socket_type = stream
        protocol = tcp
        wait = no
        user = root
        server = /usr/bin/svnserve
        server_args = -i -r [저장소경로]
}[/code]
user에는 적절히 원하는 사용자를 넣어주시면 됩니다. 보안상 root는 피하시는것이 좋습니다.
xinetd 데몬을 재시작해주시면 바로 사용이 가능해 집니다.

[code]service xinetd restart[/code]
* Apache(mod_dav_svn) 모듈 형태

어찌보면 가장 추천할만한 좋은 방법입니다. 그리고 가장 설정하기가 번거롭습니다. 이 작업은 아파치 웹서버를 직접 컴파일하여 사용하지 않고 기본 패키지에 들어있는 httpd-*.rpm을 사용하는 시스템으로 가정하겠습니다.

우선 httpd가 정상적으로 설치가 되어있는지 확인해 봅시다. 저의 테스트 머신은 엔터프라이즈리눅스 4입니다.
[code]rpm -qa | grep httpd
httpd-manual-2.0.52-41.ent.4
httpd-suexec-2.0.52-41.ent.4
httpd-devel-2.0.52-41.ent.4
httpd-2.0.52-41.ent.4[/code]
[이곳]에 접속하셔서 자신의 머신에 가장 적절한 버젼을 받도록 합니다. 될수 있는한 제공되는 rpm패키지들을 모두 다 설치하는게 좋습니다. subversion뿐만 아니라 mod_dav_svn 패키지를 설치하는 것이 이 작업의 키포인트 입니다.

/etc/httpd/conf.d 위치에 subversion.conf 파일이 생성됩니다. 해당 파일을 설정해 줍시다.
[code]LoadModule dav_svn_module     modules/mod_dav_svn.so

<Location /svn>
   DAV svn
   SVNPath [저장소경로]


   # Limit write permission to list of valid users.
   <LimitExcept GET PROPFIND OPTIONS REPORT>
      # Require SSL connection for password protection.
      # SSLRequireSSL


      AuthType Basic
      AuthName “Authorization Realm”
      AuthUserFile /home/.htpasswd
      Require valid-user
   </LimitExcept>
</Location>[/code]
위에서 참고하실점은 AuthUserFile옵션입니다. htpasswd파일은 아파치 패키지에 포함되어있는 htpasswd명령으로 만들 수 있습니다. (자세한건 구글링 해보시길)

이제 해당 서버에 http://[호스트아이피]/svn 으로 웹브라우저로 접속해 보시면 바로 탐색이 가능하다는 것을 알 수 있습니다. 또한 같은 주소로 SVN 체크아웃을 할 수 있습니다.

– 여러개의 저장소를 묶어서 사용할 시
다음의 두개의 저장소가 있다고 가정해 봅시다. 둘 다 /svn 하위에 존재하고 있습니다.


/svn/repo1

/svn/repo2
이경우 다음과 같은 설정을 사용하여 모두 묶어서 서비스 할 수 있습니다.

[code]<Location /svn>
   DAV svn
   SVNParentPath /svn
   SVNListParentPath on
</Location>[/code]

리눅스상에서 사용할수 있는 멀티 리다이렉트(Mutiple Redirect)

리눅스를 사용하면서 항상 마주치는 표준입력(stdin)과 표준아웃(stdout)들의 세계는 매우 오묘하면서도 재미있는것이 많이 있는 영역이 아닐까 생각됩니다. 보통의 프로그램을 실행할때는 항상 함수나 메서드 단위로 실행되고 그것에 인자값들(Arguments)을 넘겨주어 사용하게 되는데요, 리눅스(굳이 유닉스니 기타 다양한 계열의 다른것들을 끌어들이진 않을께요;;)에서는 이런걸 뛰어넘어 다양한 방법으로 입/출력을 할 수 있습니다. 매력적이죠.

그럼 본론으로 들어가 보겠습니다. 보통의 리다이렉션은 다음과 같은 키워드를 사용합니다.

[code]>, <, >>, 2>&1[/code]
차례대로 오른쪽으로 표준출력, 왼쪽으로 표준입력, 오른쪽으로 표준출력(Append)입니다. 마지막의 2는 표준에러(stderr) 1은 표준출력(stdin)을 뜻합니다. 표준에러를 표준출력에 합쳐서 리다이렉트 하겠다는 뜻이죠.

하지만 이것은 일방적으로 하나의 목적(Target)을 가질 수 밖에 없습니다. 그렇다면 다중 출력을 하려면 어떻게 하면 좋을까요? 다행이도 tee라는 양방향 출력을 하는 명령이 존재합니다.

[code]COMMAND | tee >(PROCESS1) >(PROCESS2) >(PROCESS3) | PROCESS4[/code]
tee명령에서 >()을 사용하게 되면 세부 명령을 수행할 수 있습니다. 정확히는 ()가 세부명령이고 그 앞의 >가 표준입출력이 되겠군요. 다음의 간단한 예제를 볼까요.

[code]echo “hello” | tee >(less) >(more) | tail -f
hello
hello
hello[/code]
조금 억지 예제이긴 하지만 less, more, tail을 통해 3번을 출력하게 되는것을 알 수 있습니다. 동시에 여러 파일을 쓰고 싶다면? 여기서 조금만 더 확장해 보겠습니다.

[code]echo “hello” | tee >(less > a) >(more > b) >(tail > c) >(head > d) | tail -f
cat a

hello
cat b
hello
cat c
hello
cat d
hello[/code]
세부 명령들에서도 표준 출력이 잘 되는 것을 알 수 있습니다. 생각보다 써먹을데가 많은 명령이지만 첫번째 명령에서 파이프(Pipe)로 넘어오기 때문에 사실상 실시간의 멀티 스트리밍은 할 수 없습니다.

참고: http://linux.byexamples.com/archives/144/redirect-output-to-multiple-processes/