6장 Apache와 Subversion 연동

이재홍 http://www.pyrasis.com 2007.10.27 ~ 2008.04.20

목차

Apache 설치 및 기본 설정

통합 개발 환경의 모든 작업은 웹을 통하여 이루어집니다. Trac은 웹 어플리케이션이므로 Apache가 필요합니다. 이번 통합 개발 환경 구축에서 Subversion은 자체 프로토콜인 svn:// (svnserve)를 사용하지 않고 Apache와 연동하여 http://, https:// 프로토콜을 사용할 것입니다. Trac과 Subversion 사이에 사용자 계정 정보를 공유하려면 Subversion을 Apache와 연동해야 합니다. svn:// 방식은 passwd 파일로 사용자 계정 정보를 관리하기 때문에 Trac과 사용자 계정 정보를 공유할 수 없습니다. 따라서 통합 개발 환경에는 적합하지 않습니다.

Apache 설치

Apache는 다음 URL에서 받을 수 있습니다. 이 책에서는 apache_2.2.6-win32-x86-openssl-0.9.8e.msi를 사용하도록 하겠습니다.

  • 다운로드 주소 : http://httpd.apache.org/download.cgi
  • 부록 CD 경로 : Applications/Apache
TIP
Apache를 설치하기 전에 IIS 웹 서버를 중지시켜야 합니다(제어판 → 관리 도구 → 인터넷 정보 서비스 → 로컬 컴퓨터 → 웹 사이트 → 기본 웹사이트 → 중지). 현재 IIS에서 80번 포트를 사용하고 있어서 같은 포트를 사용하는 Apache와 충돌하기 때문입니다. 하지만 포트를 다르게 설정하더라도 IIS와 Apache는 동시에 사용할 수 없습니다. Apache를 설치하는 방법을 설명하고 난 후 IIS와 Apache를 동시에 사용하는 방법을 설명하겠습니다.
  1. 설치 파일을 실행시키면 설치 마법사가 나타납니다. Next를 눌러 넘어갑니다.


    그림 6-1 Apache 설치 마법사

  2. 라이센스에 관한 대화상자가 나타나면 I accept the terms in the license agreement를 선택하고 Next를 누릅니다.


    그림 6-2 라이센스 동의 화면

  3. Apache에 관한 설명이 나오면 간단히 살펴보고 Next를 눌러 넘어갑니다.


    그림 6-3 Apache에 관한 설명

  4. Network Domain, Server Name에 사용할 도메인을 입력합니다. 도메인은 구입한 도메인을 입력해도 되고, 구입하지 않은 도메인을 입력해도 됩니다. 구입하지 않은 도메인을 사용하려면 내부 DNS를 구성해야 합니다. Administrator’s Email Address에는 관리자 이메일 주소를 입력합니다. 이메일은 정확하지 않아도 됩니다. 만일 도메인을 구입하지 않고, 내부 DNS도 구성하지 않았다면 IP 주소로 웹 서버에 접근하면 됩니다. 이 책에서는 www.example.com을 예로 들었지만 이후 내용에서는 192.168.1.100으로 웹 서버에 접속할 것입니다.


    그림 6-4 서버 정보 설정 화면

  5. 설치 형태를 Typical을 선택하고 Next를 누릅니다.


    그림 6-5 설치 형태 지정 화면

  6. Apache를 설치할 디렉터리를 지정하는 화면입니다. 기본 설정대로 설치합니다.


    그림 6-6 Apache 설치 디렉터리 지정 화면

  7. 설정이 모두 끝났으므로, Install을 눌러 설치를 시작합니다.


    그림 6-7 Apache 설치 준비 화면

  8. 파일 복사 화면이 나타납니다. Apache가 설치되고 있는 것입니다.


    그림 6-8 Apache 파일 복사 화면

  9. 설치가 끝나면 설치 완료 화면이 나타납니다. Finish를 눌러 설치를 완료합니다.


    그림 6-9 Apache 설치 완료

  10. 설치가 끝나면 트레이에 Apache Service Monitor가 실행됩니다. 트레이 아이콘을 더블 클릭하면 다음과 같이 Apache Service Monitor를 볼 수 있습니다. 여기서 Apache 서버를 시작, 종료, 재시작을 할 수 있습니다.


    그림 6-10 Apache Service Monitor

Apache 설치를 완료한 뒤 인터넷 익스플로러에서 http://localhost에 접속하면 Apache 서버에 접속할 수 있습니다. 접속한 페이지에는 It works!라는 글자가 표시됩니다.

Apache와 IIS 동시에 사용하기

Apache와 IIS 웹 서버를 동시에 사용할 수 있도록 한가지 과정이 더 남아있습니다. IIS 웹 서버는 CruiseControl.NET의 Web DashBoard를 실행시키는데 필요합니다.

다음 URL에서 WindowsServer2003-KB892777-SupportTools-x86-ENU.exe을 받습니다. Windows Server 2003용이지만 Windows XP에서도 사용할 수 있습니다. Windows XP 전용을 받으면 안됩니다. Windows XP용에는 httpcfg.exe가 포함되어 있지 않기 때문입니다.

  • 다운로드 세부 정보 : Windows Server 2003 Service Pack 1 32-bit Support Tools
    http://www.microsoft.com/downloads/details.aspx?familyid=6EC50B78-8BE1-4E81-B3BE-4E7AC4F0912D&displaylang=en

기본 설정대로 설치를 한 다음 시작 → Windows Support Tools → Command Prompt를 실행합니다. 그리고 다음과 같이 실행합니다. 192.168.1.100은 현재 컴퓨터의 IP 주소입니다.

httpcfg.exe set iplisten -i 192.168.1.100

자세한 내용은 http://support.microsoft.com/kb/813368/ko를 참고하시기 바랍니다.


그림 6-11 httpcfg.exe 실행 화면

이렇게 실행한 뒤 재부팅을 하면 Apache와 IIS 웹 서버를 동시에 사용할 수 있습니다. 이 부분을 설정해 주지 않으면 IIS 웹 서버가 동작 중일 때에는 Apache가 시작 되지 않을 것입니다.

TIP
httpcfg 명령으로 리스닝 IP를 관리하는 명령어는 다음과 같습니다.

iplisten의 명령어 요약

iplisten에 등록된 IP 목록 조회
httpcfg query iplisten
iplisten에 등록된 리스닝 설정 삭제
httpcfg delete iplisten -i 192.168.1.100
이와 같이 설정을 변경했으면 다음 명령을 차례대로 실행해서 IIS를 재시작해야 변경사항이 반영됩니다.
net stop http
net start http

Subversion 설치 및 기본 설정

Subversion 설치는 2장의 Subversion 부분을 참고하여 설치하면 됩니다. 앞에서 Apache 2.2를 설치했기 때문에 Subversion도 Apache 2.2용으로 패키징된 것을 설치해야 합니다. Apache 2.2용 설치 파일은 다음 URL에서 받을 수 있습니다.

  • 다운로드 주소 : http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100&expandFolder=8100&folderID=91 http://subversion.tigris.org/files/documents/15/41687/svn-1.4.6-setup.exe
  • 부록 CD 경로 : Applications/Subversion/Apache-2.2/


그림 6-12 Apache 2.2용 Subversion 다운로드 페이지

만약 Apache 2.0용 svn-1.4.6-setup.exe을 설치했다면 Uninstall합니다. 여기에 포함된 Apache 모듈은 Apache에서 로딩도 되지 않습니다.

Apache 2.2용 Subversion의 설치 화면은 ‘Subversion으로 소스 코드 관리하기’에 있는 화면과 똑같습니다.

설치가 끝났다면 C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf 파일을 수정합니다. 먼저 다음과 같이 mod_dav.so 부분의 주석을 제거합니다. Apache 설정 파일인 httpd.conf에서 #은 주석을 의미합니다.

LoadModule dav_module module/mod_dav.so

그런 다음 아래 두 줄을 추가합니다.

LoadModule dav_svn_module "C:\Program Files\Subversion\bin\mod_dav_svn.so"
LoadModule authz_svn_module "C:\Program Files\Subversion\bin\mod_authz_svn.so"

수정된 httpd.conf는 다음과 같습니다.

LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule cern_meta_module modules/mod_cern_meta.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule dav_module modules/mod_dav.so
LoadModule dav_svn_module "C:\Program Files\Subversion\bin\mod_dav_svn.so"
LoadModule authz_svn_module "C:\Program Files\Subversion\bin\mod_authz_svn.so"
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule deflate_module modules/mod_deflate.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
#LoadModule expires_module modules/mod_expires.so
#LoadModule file_cache_module modules/mod_file_cache.so
#LoadModule headers_module modules/mod_headers.so
LoadModule imagemap_module modules/mod_imagemap.so

httpd.conf를 저장하고 Apache Service Monitor에서 아파치를 다시 시작합니다. 설정이 정상적으로 되었다면, Apache Service Monitor 창의 맨 아래에 “Apache/2.2.6 (Win32) SVN/1.4.6 DAV/2”라고 표시됩니다. Restart 버튼으로는 SVN/1.4.6 DAV/2가 나오지 않습니다. Stop → Start 버튼으로 재시작 했을 때 SVN/1.4.6 DAV/2가 표시됩니다.


그림 6-13 Stop → Start 버튼으로 Apache 재시작

Apache와 Subversion 연동 설정

이제 Apache 2.2용 Subversion 모듈이 설치되었으니, http, https로 Subversion을 사용할 수 있게 설정해 보겠습니다. http는 일반적인 웹 프로토콜이며 80번 포트를 사용합니다. https는 SSL을 이용하여 데이터를 암호화하여 전송하며 443번 포트를 사용합니다. https를 사용하려면 서버용 인증서가 있어야 합니다. 이 인증서는 원래 VeriSign 같은 공인인증기관에 비용을 지불하고 발급을 받아서 사용해야 하지만, 이번 예제에서는 인증서를 임의로 만들어서(사설인증서) 사용하겠습니다. 공인인증서를 발급 받을 수 있는 상황이라면 공인인증서를 사용해도 상관없습니다.

사용자 ID, 패스워드 설정 및 권한 관리

svnserve를 사용한 서버에서는 passwd 파일에 사용자 ID = 패스워드 형식으로 사용자를 관리 했지만 Apache를 이용한 서버에서는 Apache의 htpasswd 파일을 이용하여 사용자를 관리합니다. 이 파일은 htpasswd.exe를 사용하여 만들 수 있습니다. 패스워드는 MD5 형식으로 저장됩니다.

명령 프롬프트를 실행하고 다음과 같이 입력합니다. htpasswd 파일은 저장소 부모 디렉터리인 C:\Repos에 만듭니다.

cd c:\repos
"C:\Program Files\Apache Software Foundation\Apache2.2\bin\htpasswd.exe" -c htpasswd sampleuser


그림 6-14 htpasswd 파일 생성 및 sampleuser 추가

사용자 ID는 sampleuser로 하고 암호도 지정합니다.

-c 옵션은 새 파일을 만드는 옵션입니다. 이후 새로운 아이디를 추가하려면 “C:\Program Files\Apache Software Foundation\Apache2.2\bin\htpasswd.exe” htpasswd hellouser처럼 해주면 됩니다.

Subversion은 authz라는 방식으로 접근 권한을 관리 할 수 있습니다. 앞서 Subversion 사용 방법을 설명할 때 authz 파일에 대해 설명을 했습니다. 이 authz 파일은 svnserve에서도 사용할 수 있으며, Apache에서는 authz_svn_module을 통해서 사용할 수 있습니다. C:\Repos에 authz라는 파일을 만들고 아래와 같이 입력한 후 저장합니다.

[sample:/]
sampleuser = rw
* = r

이 설정은 sample 저장소의 / (최상위 디렉터리)에 대해 sampleuser는 읽기(r), 쓰기(w) 허용, 익명 사용자를 포함한 모든 사용자(*)에게 읽기를 허용한다는 설정입니다. authz 파일의 문법에 대해서는 앞장의 “저장소 설정”을 참조하기 바랍니다.

TIP
sampleuser 외에는 접근을 거부하려면 다음 설정과 같이 익명 사용자를 포함한 모든 사용자(*)에게 권한을 부여하지 않으면 됩니다.
[sample:/]
sampleuser = rw
* =

http

http 프로토콜은 일반적인 웹 프로토콜이기 때문에 웹 브라우저를 통해서도 Subversion에 접근 가능하며(읽기만 가능), svn.exe, TortoiseSVN으로 체크아웃, 커밋 같은 동작이 가능합니다. httpd.conf를 열고 맨 아래에 다음과 같이 추가합니다.

NameVirtualHost *:80
<VirtualHost *:80>
    <Location /svn>
        DAV svn
        SVNParentPath "C:\Repos"

        AuthzSVNAccessFile "C:\Repos\authz"

        AuthType Basic
        AuthName "Subversion Repository"
        AuthUserFile "C:\Repos\htpasswd"
        Require valid-user
    </Location>
</VirtualHost>

SVNParentPath에는 저장소의 부모 디렉터리인 C:\Repos를 지정합니다. 이렇게 설정하면 http://localhost/svn/sample, http://localhost/svn/example 등 저장소 이름을 지정하여 접근할 수 있습니다. AuthzSVNAccessFile에는 authz 파일의 경로를 지정합니다.

AuthType을 Basic으로 설정하면 htpasswd 파일을 사용하겠다는 것입니다. AuthName에는 웹 브라우저나, Subversion 클라이언트에 접속했을 경우 표시되는 저장소 이름입니다. AuthUserFile에는 앞에서 만든 htpasswd 파일의 경로를 지정해줍니다. Require vaild-user로 설정했기 때문에 로그인한 사용자만 볼 수 있습니다. 웹 브라우저로 저장소를 보는 것과 체크아웃은 아무에게나(Anonymous) 할 수 있게 하고 커밋은 지정된 사용자만 할 수 있게 하려면 아래와 같이 <LimitExcept GET PROPFIND OPTIONS REPORT> Require valid-user </LimitExcept>로 설정해주면 됩니다.

NameVirtualHost *:80
<VirtualHost *:80>
    <Location /svn>
        DAV svn
        SVNParentPath "C:\Repos"

        AuthzSVNAccessFile "C:\Repos\authz"

        AuthType Basic
        AuthName "Subversion Repository"
        AuthUserFile "C:\Repos\htpasswd"
        <LimitExcept GET PROPFIND OPTIONS REPORT>
            Require valid-user
        </LimitExcept>
    </Location>
</VirtualHost>

httpd.conf를 저장하고 아파치를 재시작합니다. 지금까지 따라해오면서 sample과 example 저장소를 만들었을 것입니다. http://localhost/svn/sample에 접속해서 다음과 같은 화면이 나오면 정상적으로 설정된 것입니다. Require vaild-user만 설정 했을 경우 로그인 창이 뜰 것입니다. htpasswd 파일을 만들 때 생성했던 사용자 ID인 sampleuser와 암호를 입력하면 됩니다.


그림 6-15 sample 프로젝트의 저장소에 http 접속한 화면

TIP
Apache로 Subversion을 사용할 수 있도록 설정했으므로 svnserve.exe는 실행 할 필요가 없습니다. 만약 http://에는 C:\Repos\authz 파일에 사용자별 권한 설정이 되어 있는데, svnserve.exe를 사용하는 svn://에는 권한 설정이 되어 있지 않다면, 권한이 없는 사용자가 소스를 체크아웃 할 수 있으므로 주의해야 합니다. svnserve.exe는 각 저장소의 conf 디렉터리 아래 authz 파일의 권한 설정을 따릅니다.

https

앞서 설명한 것처럼 https 프로토콜은 암호화 전송 프로토콜입니다. 따라서 암호화에 사용할 인증서부터 만들어 보겠습니다. apache_2.2.6-win32-x86-openssl-0.9.8e.msi을 설치하였다면 OpenSSL도 함께 설치되었을 것입니다. Apache와 OpenSSL이 함께 설치되었으므로 OpenSSL을 설치하는 방법은 생략하겠습니다.

먼저 개인키부터 만듭니다. 명령 프롬프트(cmd.exe)를 실행하고 다음과 같이 입력합니다.

cd "C:\Program Files\Apache Software Foundation\Apache2.2\bin"
openssl

openssl을 실행하여 OpenSSL> 프롬프트가 뜨면 다음과 같이 입력합니다.

OpenSSL> req -config ..\conf\openssl.cnf -new -out example.csr
  • Enter PEM pass phrase:에서는 개인키에서 사용할 암호를 입력합니다.
  • Country Name: 국가명입니다. 우리나라는 KO 입니다.
  • State or Province Name: 아무것도 입력하지 않고 엔터키로 넘어갑니다.
  • Locality Name: 지역명입니다.
  • Organization Name : 단체명입니다. 도메인을 입력해도 되고 회사 이름등을 입력해도 됩니다.
  • Organizational Unit Name : 사용할 도메인을 입력합니다(아파치 설치할 때 입력했던 도메인).
  • Common Name : 여기도 사용할 도메인을 입력합니다.
  • Email Address:이메일 주소 아무거나
  • A challange password []: 아무것도 입력하지 않고 엔터키로 넘어갑니다.
  • An optional company name []: 아무것도 입력하지 않고 엔터키로 넘어갑니다.


그림 6-16 OpenSSL로 개인키 생성

마지막에는 exit를 입력하여 OpenSSL 프롬프트를 종료합니다. 이렇게 하면 C:\Program Files\Apache Software Foundation\Apache2.2\bin에 example.csr, privkey.pem 파일이 생성됩니다.

이제 아파치에서 사용할 공개키를 만들겠습니다. 이번 예제에서는 유효기간을 1년(365일)으로 할 것입니다. 명령 프롬프트에서 openssl을 입력하여 OpenSSL 프롬프트를 다시 시작합니다.

OpenSSL> rsa -in privkey.pem -out example.key
OpenSSL> req -config ..\conf\openssl.cnf -new -x509 -days 365 -key example.key -out example.crt

example.key를 만들때에는 암호를 물어보는데 개인키 암호를 입력합니다.

  • Organization Name : 단체명입니다. 도메인을 입력해도 되고 회사 이름등을 입력해도 됩니다.
  • Organizational Unit Name : 사용할 도메인을 입력합니다.
  • Common Name : 여기도 사용할 도메인을 입력합니다.

https://로 접속한 서버의 도메인과 여기에 입력한 도메인이 다를 경우 접속할 때마다 계속 Internet Explorer의 보안경고가 떠서 상당히 귀찮습니다. 이 도메인을 맞추어주는 것이 중요합니다. 공인인증서가 아니라서 계속 경고창이 뜨긴 하지만, 도메인이 일치하고 유효기간이 맞으면 인증서 설치를 통해서 보안 경고를 뜨지 않게 할 수 있습니다.


그림 6-17 OpenSSL로 인증서 생성

앞에서와 마찬가지로 모든 입력이 끝났다면 exit를 입력하여 OpenSSL 프롬프트를 종료합니다. 이제 example.key, example.crt 파일이 생겼습니다. 이 두 파일과 방금 만든 privkey.pem, example.csr 파일을 C:\Program Files\Apache Software Foundation\Apache2.2\conf 디렉터리로 옮깁니다.

이제 httpd.conf를 편집합니다. 먼저 Listen 80 아래에 Listen 443을 추가합니다.

httpd.conf

#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to 
# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
#
#Listen 12.34.56.78:80
Listen 80
Listen 443

mod_ssl.so 부분의 주석을 제거합니다. 수정한 httpd.conf는 다음과 같습니다.

httpd.conf

#LoadModule speling_module modules/mod_speling.so
#LoadModule status_module modules/mod_status.so
#LoadModule unique_id_module modules/mod_unique_id.so
LoadModule userdir_module modules/mod_userdir.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule ssl_module modules/mod_ssl.so

httpd.conf의 맨 아래에 다음과 같이 추가합니다.

httpd.conf

NameVirtualHost *:443
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile "C:\Program Files\Apache Software Foundation\Apache2.2\conf\example.crt"
    SSLCertificateKeyFile "C:\Program Files\Apache Software Foundation\Apache2.2\conf\example.key"
    SSLProtocol all
    SSLCipherSuite HIGH:MEDIUM

    <Location /svn>
        DAV svn
        SVNParentPath "C:\Repos"

        AuthzSVNAccessFile "C:\Repos\authz"

        AuthType Basic
        AuthName "Sample Repository"
        AuthUserFile "C:\Repos\htpasswd"
        Require valid-user
    </Location>
</VirtualHost>

SSLCertificateFile, SSLCertificateKeyFile에는 방금 만든 example.crt, example.key 파일을 지정해줍니다. SVNParentPath는 저장소의 부모 디렉터리인 C:\Repos를 지정합니다. AuthzSVNAccessFile에는 authz 파일의 경로를 지정합니다.

AuthType을 Basic으로 설정하면 htpasswd 파일을 사용하겠다는 것입니다. AuthName에는 웹 브라우저나, Subversion 클라이언트에 접속했을 경우 표시되는 저장소 이름입니다. AuthUserFile에는 앞에서 만든 htpasswd 파일의 경로를 지정해줍니다. Require vaild-user로 설정했기 때문에 로그인한 사용자만 볼 수 있습니다. 웹 브라우저로 저장소를 보는 것과 체크아웃은 아무에게나(Anonymous) 할 수 있게 하고 커밋은 지정된 사용자만 할 수 있도록 하려면 아래와 같이 <LimitExcept GET PROPFIND OPTIONS REPORT> Require valid-user </LimitExcept>로 설정해주면 됩니다.

NameVirtualHost *:443
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile "C:\Program Files\Apache Software Foundation\Apache2.2\conf\example.crt"
    SSLCertificateKeyFile "C:\Program Files\Apache Software Foundation\Apache2.2\conf\example.key"
    SSLProtocol all
    SSLCipherSuite HIGH:MEDIUM

    <Location /svn>
        DAV svn
        SVNParentPath "C:\Repos"

        AuthzSVNAccessFile "C:\Repos\authz"

        AuthType Basic
        AuthName "Sample Repository"
        AuthUserFile "C:\Repos\htpasswd"
        <LimitExcept GET PROPFIND OPTIONS REPORT>
            Require valid-user
        </LimitExcept>
    </Location>
</VirtualHost>

httpd.conf를 저장하고 아파치를 다시 시작합니다. 지금까지 따라해오면서 sample과 example 저장소를 만들었을 것입니다. https://localhost/svn/sample에 접속하면 인증서 경고창이 표시될 것입니다. 이 보안경고창에서 예(Y)를 누른 후, 다음과 같은 화면이 나오면 정상적으로 설정된 것입니다. Require vaild-user만 설정 했을 경우 로그인 창이 뜰 것입니다. htpasswd 파일을 만들 때 생성했던 사용자 ID인 sampleuser와 암호를 입력하면 됩니다.


그림 6-18 sample 프로젝트의 저장소에 https 접속한 화면

TIP
Apache로 Subversion을 사용할 수 있도록 설정했으므로 svnserve.exe는 실행 할 필요가 없습니다. 만약 https://에는 C:\Repos\authz 파일에 사용자별 권한 설정이 되어 있는데, svnserve.exe를 사용하는 svn://에는 권한 설정이 되어 있지 않다면, 권한이 없는 사용자가 소스를 체크아웃 할 수 있으므로 주의해야 합니다. (svnserve.exe는 각 저장소의 conf 디렉터리 아래 authz 파일의 권한 설정을 따릅니다.)

저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.