[XE] 각 사용자디렉토리에서 mod_rewrite 적용하기

사용환경

  • 운영체제 : OpenSolaris 2009.08 Release
  • 커널버전 : SunOS 5.11 snv_111b i386 Solaris
  • XE버전 : XE 1.4.4.4
  • 아파치버전 : Apache 2.2

01. 시작하기 전에…

이번에 학과 서버를 작업하면서… XE를 이용해서 메인홈페이지를 구축하였습니다. 여태껏 계속 미뤄뒀던 작업을 단시간에 빠르게 하려니… 그 외의 다른 일들은 아예 못하겠더군요. 그런데 이상하게도 AllowOverride 속성에 FileInfo를 넣어줬음에도 정상적으로 mod_rewrite가 적용되지 않길레 관련된 문서들을 더 찾아봤습니다.

아직도 왜… 정상적으로 mod_rewrite가 적용되지 않는지는 확인할 수 없었습니다만 어찌되었든 해결되어 포스팅을 합니다.

02. 점검하기

mod_rewrite가 적용되고 있는지 확인하기 위해서 아래와 같은 방법을 썼습니다.

  • 아파치 설정에서 모듈이 적재되도록 설정되었는지 확인
  • php가 정상적으로 mod_rewrite를 이용할 수 있는지 phpinfo()로 확인
  • 각 사용자 디렉토리의 Directory 옵션을 확인하여 .htaccess가 이용되도록 설정되었는지 확인
  • RewriteLog를 찍어서 원인파악하기

하나씩 차근차근 설명해보도록 하겠습니다. 정상적으로 mod_rewirte가 적재되었는지 확인하기 위해서 아파치 설정파일을 확인해봅니다.

오픈솔라리스의 아파치 설정파일은 세부적으로 분리가 되어있습니다.(대부분의 아파치배포판의 패키지들이 그렇듯이…) 메인설정파일은 /etc/apache2/2.2/httpd.conf이고 나머지 설정파일들은 /etc/apache2/2.2/conf.d/ 디렉토리 내에 *.conf라는 확장자로 분리가 되어있습니다. 그리고 이 중에 *.load라는 파일은 모듈적재만을 적어둔 파일입니다.

모듈을 적재하는 설정파일은 두 개인데, modules-64.load와 modules-32.load 파일입니다. 시스템이 64bit 시스템이라면 modules-64.load파일이 호출되고, 32bit 시스템이라면 modules-32.load파일이 호출됩니다. 아래의 명령어를 이용해서 정상적으로 mod_rewrite가 적재되도록 설정되었는지 확인해봅니다.

<strong># cat /etc/apache2/2.2/conf.d/modules-32.load | grep rewrite
<span style="color: #ff0000;">LoadModule</span><span style="font-weight: normal;"> rewrite_module libexec/mod_rewrite.so</span> </strong>

만약에 위 처럼 LoadModule 구문이 주석(#)없이 작성되어 있다면, 설정에는 이상이 없는 것입니다. 특별히 따로 설정을 하지 않았으면 위 처럼 설정이 되어 있을 것입니다.

이제는 php가 mod_rewrite를 사용할 수 있는지 확인해보도록 하겠습니다. phpinfo()를 호출하는 php파일을 만들어서 웹브라우저로 확인해봅니다.

<strong># echo "&lt;?php phpinfo() ?&gt;" &gt; /var/apache2/2.2/htdocs/phpinfo.php</strong>

위의 명령어를 사용하면 phpinfo() 함수를 호출하는 php파일을 작성해줍니다. 이제는 웹브라우저를 이용해서 php정보를 확인해봅니다. 아래처럼 php정보에서 mod_rewrite를 검색해봅니다.

php정보페이지에서 위처럼 Loaded Modules에 mod_rewrite가 있다면 php에서 정상적으로 mod_rewrite를 이용할 수 있는 상태입니다.(하… 원인파악도 힘들다.ㅠ^ㅠ)

그렇다면, 이제는 사용자 디렉토리에 대한 아파치 설정을 확인해보도록 하겠습니다. 저의 경우에는 사용자 디렉토리(즉 ~계정명)으로 동작하는 일반사용자들의 웹서비스에서만 유독 mod_rewrite가 적용되지 않기에 userdir.conf의 내용을 계속 변경해보면서 설정을 해보았습니다. XE가 설치된 디렉토리 내의 .htaccess에서 실제로 URL 단축을 위한 설정이 되어 있기때문에 .htaccess가 이용될 수 있도록 설정이 되어 있어야 합니다.

.htaccess파일을 이용해서 동적으로 디렉토리에 대한 설정을 하기 위해서는 Directory지시자에서 AllowOverride 속성에 FileInfo를 부여해야합니다. userdir.conf의 AllowOverride에 FileInfo가 설정되어 있는지 확인해봅니다.

&lt;Directory "/export/home/*/public_html"&gt;
    AllowOverride <strong><span style="color: #ff0000;">FileInfo</span></strong>
    Options FollowSymLinks
    (... 이하생략 ...)
&lt;/Directory&gt;

위 처럼 AllowOverride에 FileInfo가 부여되어 있다면, .htaccess에 작성된 내용이 적용될 준비가 되어있는 것입니다.

위와 같이 설정을 확인해보는 작업을 하다보니 설정에는 문제가 없다고 판단이 되었고 mod_rewrite 모듈은 정상적으로 동작하는 중이라는 것을 확신할 수 있었습니다.

03. 로그찍어보기

mod_rewrite 모듈이 정상적으로 동작 중이라는 것을 확신한 후에는 다른 방향으로 문제를 해결하려고 했습니다. 그 전에 현재 어떻게 동작 중인지 확인할 필요성을 느껴서 로그를 찍는 방법을 찾아봤습니다. 아파치 설정을 통해서 로그를 찍어볼 수 있습니다.

httpd.conf 내에 아래처럼 mod_rewrite 모듈의 로그를 찍는 설정을 넣도록 하겠습니다. 아래의 명령어나 선호하는 텍스트 에디터로 httpd.conf 파일을 열어줍니다.

<strong># vim /etc/apache2/2.2/httpd.conf</strong>

이제 특정 위치에 아래와 같은 설정을 추가해줍니다.

RewriteLog "<strong><span style="color: #0000ff;">/var/apache2/2.2/logs/rewrite.log</span></strong>"
RewriteLogLevel 9

아래의 명령어를 이용해서 아파치를 재기동합니다.

<strong># svcadm restart apache22</strong>

그리고 mod_rewrite를 동작할 페이지(저의 경우에는 XE)를 열어서 로그를 찍도록 유도합니다. 그러면 /var/apache2/2.2/logs/rewrite.log 파일에 로그가 작성됩니다.

만약에 rewrite.log 파일이 생성되지 않고 로그가 작성되지 않고 있다면 아래의 명령어로 파일을 만들어줍니다.

<strong># touch /var/apache2/2.2/logs/rewrite.log</strong>

로그를 확인해보면 URL 단축을 위해서 어떤 방식으로 동작하는지 단계적으로 알 수 있습니다. 아래는 그 샘플을 일부 붙여넣은 것입니다.

# cat /var/apache2/2.2/logs/rewrite.log

183.96.78.214 – – [06/Jan/2011:11:08:50 +0900] [203.246.xx.215/sid#80c8128][rid#837c778/initial] (3) [perdir /export/home/simplism/public_html/xe/] strip per-dir prefix: /export/home/simplism/public_html/xe/computer_dept_notice -> computer_dept_notice

(… 중략 …)

183.96.78.214 – – [06/Jan/2011:11:08:50 +0900] [203.246.xx.215/sid#80c8128][rid#837c778/initial] (4) [perdir /export/home/simplism/public_html/xe/] RewriteCond: input=’/export/home/simplism/public_html/xe/computer_dept_notice’ pattern=’!-d’ => matched

183.96.78.214 – – [06/Jan/2011:11:08:50 +0900] [203.246.xx.215/sid#80c8128][rid#837c778/initial] (2) [perdir /export/home/simplism/public_html/xe/] rewrite ‘computer_dept_notice’ -> ‘./index.php?mid=computer_dept_notice

이상하게도… 강제로 rewrite된 결과, 즉 ./index.php?mid=computer_dept_notice를 주소창에 입력을 해도 정상적으로 원하던 결과를 얻을 수 있었습니다. 결국 .htaccess가 유도한 rewrite 과정에는 이상이 없다는 점입니다. 로그를 이용해서 rewrite되는 과정을 확인할 수 있으니 웹 어플리케이션을 개발하거나 저와 같이 웹 어플리케이션을 운영할 때 문제해결을 위해서 이용할 수 있습니다.

참고) 확인 후에는 반드시 로그를 멈추기

위 처럼 로그를 이용해서 원인파악이나 문제를 찾으려고 로그를 이용할 때는 문제를 파악한 이후에는 반드시 로그찍는 것을 멈춰야 합니다. rewrite를 할 때마다 다량의 로그를 찍는 것은 디스크에 과부하를 주고 성능에도 영향을 미치기 때문입니다. 필요한 경우에만 활성화를 하고 필요치 않는 경우에는 반드시 꺼둬야 합니다.

04. 원인파악하기

mod_rewrite 모듈이 정상적으로 동작하고 있고, rewrite과정에도 문제가 없다면 어디에서 문제가 생겼을까요? 그림으로 과정을 간단하게 URL Rewriting 과정을 그려봤습니다.(원인 파악을 위해서요…)

기술적으로 정확한 과정은 아니지만 대강 위와 같은 과정으로 내부적으로 짧은 URL을 이용할 수 있도록 하는 것 같습니다. 단계적으로 문제점을 찾아본 결과 rewriting 후보를 찾아내는 데까지는 정상적으로 동작한 것을 확인했으니 최종과정인 내부적으로 matched 경로로 이동하는 데에 문제가 있다고 판단했습니다.

05. 문제 해결하기

원인을 파악했기 때문에 해결법은 쉽게 나올 줄 알았습니다. 그렇지만 그 과정도 순탄치는 않았습니다. 계속 설정을 바꿔보고 이것저것 다 들쑤셔서 결국 알아낸 것은 RewriteBase라는 것입니다.(Rewrite 예제들을 계속 찾아보다가 우연하게 알게되었지만…)

제가 생각한 원인은 URL rewriting 시에 rewriting의 기준점을 정확하게 판단하지 못해서 rewriting이 정상적으로 이루어지지 않았다는 것입니다. 그래서 URL Rewriting과정을 기술한 .htaccess에 RewriteBase 속성을 넣어서 정상적으로 Rewriting되도록 유도하는 것입니다.(정확하진 않습니다… 그냥 추측일 뿐…)

그러면 이제 .htaccess 파일에 RewriteBase를 넣도록 하겠습니다. 두 가지 예를 통해서 설명하도록 하겠습니다.

예제1) XE 설치 디렉토리 : /export/home/simplism/public_html/xe/

위 처럼 public_html 디렉토리 내에 xe라는 디렉토리에 XE를 설치한 경우입니다. xe 디렉토리 내의 .htaccess 파일을 텍스트 에디터로 열어줍니다.

<strong>$ vim /export/home/simplism/xe/<span style="color: #ff0000;">.htaccess</span></strong>

/export/home/simplism/public_html/xe/.htaccess 파일의 2번라인에 아래와 같은 RewriteBase를 넣어줍니다.

RewriteEngine On
<strong><span style="color: #0000ff;">RewriteBase /~simplism/xe/</span></strong>
# reserve XE Layout Template Source File (*.html)
RewriteRule ^(layouts|m.layouts)/(.+)/(.+).html$ ./index.php [L]
(... 이하 생략 ...)

public_html 넣으면 안됩니다. public_html은 각 사용자계정의 웹서비스를 제공할 디렉토리이고 웹브라우저의 URL상에서는 이용되지 않는 디렉토리명이기 때문입니다.

예제2) XE 설치 디렉토리 : /export/home/simplism/public_html/

이제는 public_html 디렉토리에 설치를 한 경우입니다. 아무래도 주소의 끝에 xe라는 디렉토리명을 추가로 붙이기 싫은 경우에는 아예 public_html 디렉토리에 설치를 하는 것입니다. .htaccess 파일을 텍스트에디터로 열어줍니다.

<strong>$ vim /export/home/simplism/public_html/.htaccess</strong>

아래처럼 RewriteBase를 2번 라인에 추가해줍니다.

RewriteEngine On
<strong><span style="color: #0000ff;">RewriteBase /~simplism/</span></strong>

위 처럼 XE의 .htaccess 파일에 RewriteBase를 설정해주면 원하는 데로 XE가 제공하는 짧은 URL기능을 사용할 수 있습니다.

06. 마치면서…

오라클이 Sun을 인수하고, 오픈솔라리스 프로젝트팀이 해체된 마당에 오픈솔라리스를 서버운영체제로 선택한 것은 적절한 것은 아니었습니다. 그래도 ZFS 파일시스템에 대한 관심으로 오픈솔라리스를 임시 과메인서버 운영체제로 선택했고 작업을 했습니다. 앞으로 새로운 버전의 오픈솔라리스를 찾아볼 수는 없지만 서버운영체제로써는 나쁘지 않은 것 같습니다. 기존의 리눅스 서버에서는 느끼지 못했던 것도 경험해볼 수 있는 좋은 경험이었습니다.(RBAC도 그렇고… 기존의 /etc/init.d/ 내의 스크립트가 아닌 다른 방식의 데몬관리 등…)

이 포스트를 작성하면서 과연… 이 포스트에 도움이 될 분이 얼마나 될까라는 생각을 하기도 했지만 만약에 mod_rewrite 모듈의 문제로 해결법을 찾으시는 분들에는 아주 미세한 도움이 되지 않을까 하고 글을 작성해봤습니다.

기술적으로 mod_rewrite 모듈의 동작방식을 파악하고 있다면 보다 더 정확한 포스트가 되었을 것인데, 그렇지 못하다보니 경험적으로 포스팅을 작성하였으므로 틀린 부분이 있다면 댓글을 달아서 정정을 할 수 있도록 해주시면 감사하겠습니다.

07. 참고문서

  1. http://httpd.apache.org/docs/2.0/howto/htaccess.html
  2. http://www.issociate.de/board/post/459697/mod_rewrite_in_user_directory.html
  3. http://opensolaris.org/jive/thread.jspa?threadID=111282
  4. http://www.tutorio.com/tutorial/enable-mod-rewrite-on-apache
  5. http://stackoverflow.com/questions/4289382/proper-userdir-conf-for-this-htaccess
  6. http://www.tnslinux.com/web/bbs/board.php?bo_table=02_5&wr_id=95
  7. http://willyoppa.tistory.com/archive/200609
  8. http://pplane.net/entry/modrewrite의-설치-및-설정