뭘 이런걸..

Posted
Filed under Tech/프로그래밍
며칠전에 IE7 과 mod_url 문제 수정 이라는 글에서 IE7 에서 한글 URI 를 사용할 경우 mod_url 과의 충돌로 무한 루프가 발생하는 문제를 수정하여 포스팅을 했었습니다.

그 과정에서, 301 로 재접속을 시킬때, IE7 의 재변환을 막기 위하여 url encoding 을 하여 문제를 해결했는데, 그 해결을 위해 사용했던 코드가 php raw_url_encode 함수를 수정하여 처리를 했습니다. 그런데, PHP license 와 Apache license 가 충돌이 나는 이유로 어떻게 할까 고심을 하다가 완전히 새로 작성을 하게 되었습니다.

apache 는 URL 에 대하여 다음의 구조체를 가집니다.


struct request_rec {
..
char *filename;
char *path_info;
char *uri;
struct stat finfo;
char *unparsed_uri;
uri_components parsed_uri;
..
}



위에 나열된 변수들이 URL 과 관련되었으며, filename 은 system 상의 경로를 가지고 있습니다. 그래서 이것을 이용하여

  1. uri 를 iconv 로 convert 를 함
  2. uri convert 가 실패하면, 그냥 file not found 로 전송
  3. filename 을 convert 함.
  4. filename convert 를 실패하면 301 로 변환된 URI 를 이용한 주소로 재접속 하도록 함.
  5. convert 된 filename 이 시스템상이 있는지 확인
  6. 있으면 정상 출력 없으면 file not found

와 같이 처리되도록 변경이 되었습니다. 딱 1가지 경우만 빼고는 재접속을 하지 않게 되는 변경이 된것입니다. 다만, 4번 과정에서 재접속을 해야 하는데, 이 경우는 다음과 같습니다.

서버에서 다음과 같이 Alias 가 결려 있을 경우입니다.


Alias /xxx/한글/ /home/httpd/html/한글/

이 설정과 같이, Alias 이름에 한글이 들어가 있으면 apache 구조체의 filename 변수에 실제 경로 부분에는 EUC-KR 이 그리고 URI 에 해당 되는 부분에는 UTF-8 이 들어가기 때문에 iconv 에서 실패를 하게 됩니다. Alias 가 해석되는 과정에서 이게 섞이게 되는데, 이 경우는 재전송을 통하여 EUC-KR 로 들어오게 하는 방법외에는 없더군요 --;

뭐 하여튼, 이런 구조로 완전히 재설계가 되었습니다. :-)

문제는, 이 수정 사항을 KLDP.NET 의 공식 mod_url 에 반영을 해야 하는데, 패치 주고받고 하면서 하기가 상당히 귀찮네요. 코드도 완전히 바뀌었고, 그냥 mod_url2 로 fork 를 할까도 살짝 고민중입니다. ^^;

어쨌든.. apache1/2 용 모듈 2개 모두 현재 재작성이 되었고, apaceh2 용 모듈은 실제 테스트는 아직 해 보지 못했습니다. 다만 apache 2.2 의 소스를 참고하여 API 는 맞추어 놓았습니다.

재작성된 mod_url 은 http://cvs.oops.org/index.cgi/mod_url/?cvsroot=OOPS-Apache 에서 apache 1 용은 1.17, apache 2 용은 1.10 을 받으시면 됩니다.
2007/05/31 06:36 2007/05/31 06:36
강분도

Mod_url.c 감사 드립니다.

김정균

kldp.net 버전과 oops.org 버전이 merge 가 되었습니다. 제가 kldp.net 의 mod_url 의 개발자로 등록이 되어 정식 배포처는 http://modurl.kldp.net 을 이용하세요.

LeCieL

수정하지 않은 modurl의 문제입니다.
worker 에 그냥 기존에 있던거 올리고나서 돌린게 답니다;;
apache php 가 아닙니다. 미디어 전송 전용서버이므로
apache만 달랑 올라가있습니다.
돌고있는 모듈은 몇안되고 redurl이 여기에 있다가 부하 폭주시 워커의 줄사망이 있었습니다.

전송트래픽은 초당 400메가정도 됩니다. 커넥션은 폴링되고 있지만 약 4만개정도 사용하고 있구요

워커모듈에 별도로 돌고있는것은 메모리 캐시 모듈입니다.

지금버전을 테스트하기에는 실제 서버라 힘들듯합니다.

LeCieL

네 제가 써논 문서에도있다시피;; utf8 인코딩에 대한 단점이 있지요 ^^

참고로 redurl 을 위 형식대로 수정하였다가 스레드가 줄사망한것으로 기억합니다.. 커넥션이 엄청나게 많은 서버라 그래서 그런지;;
초반엔 멀쩡하다가 6시간정도 지나면 스레드가 덜렁 하나 남아있는 사태가 몇번 있었죠..
그래서 다른 소스로 변환했습니다.

김정균

일단은 어떻게 수정을 하셨는지 코드를 공개를 하지 않으셨기 때문에 mod_url 이 문제인지 아니면 수정한 부분이 문제인지는 저로서는 판단을 할 수 없고, mod_url (IE7 문제 수정전의 코드) 와 현재 제가 새로 수정한 부분을 worker 모델에서 2일동안

echo "한글.txt" > ./uri.txt
while [ 1 ]; do
ab -c 100 1000 http://localhost/test/$(iconv EUC-KR UTF-8 ./uri.txt)
done
rm -f ./uri.txt

와 같이 돌리고 있는데 별 문제 없는 것 같습니다. 한번 테스트 해 줘 보시죠. (음 Apache 2 thread safety issues 문서를 보니 race condition 하게 발생하기 때문에 thread safe 하다고 보장은 못하겠군요. 그래서 이 멘트 남깁니다. ^^)

그리고 apache + php 환경은 worker model 로는 별로 적합하지 않다고 생각이 됩니다만.. 일단 php extension 들이 thread safe 를 보장하지 못하고, apache 와 php 를 build 하기 위한 library 들이 thread safe 를 보장하지 못하는데 mod_url 이 아니라 다른 무엇이 문제가 될 수도 있을 테지요.

그리고, 수정한 일본의 모듈은 아마 mod_encoding 이 아닐까 예상합니다 :-) 이 모듈 역시 예전에 회자가 되어 어느정도 코드는 본 것입니다. 실제로 mod_url 역시 hooking first 로 처리를 해 보려고 했으나 완벽한 지원이 어려워 그냥 hooking last 로 처리한 것이고요. 그리고 수정된 mod_url 은 기존의 mod_url 코드와는 다릅니다. 현재 박 원규님과 메일을 주고 받고 있는데, 만약 받아들여지지 않는다면 혼동을 피하기 위해서 mod_url2 정도로 fork 할 듯 싶습니다.

LeCieL

수고가 많으시네요 ;;

그런데 redurl (modurl) 말고 일본에서 사용하던 뭐더라;; 저는 그걸 기반으로 작업했답니다.
일단 패치할 시간이 거의 없었고;; ie7 나온지 하루이틀안에 해결봐야해서 ㅎㅎ;;

그런데 성능적인 문제 (1대의 미디어 서버)를 감안한 경우 first hook 에 charset detection 이 들어가는것이
압도적인 차이를 준다고 생각합니다.

(물론 last 로 후킹하여 전처리 다 하고 매 컨버저닝마다 파일이 있는지 체크하는것도 좋습니다
그러나 워커모듈에서는 요러다 에러하나 나면 줄사탕인지라 ;;)

제가 패치한건 일반서버는 아예 이 모듈을 내려버렸고 (급한관계로),
컨텐츠 전송서버만 first hook 으로 강제 변환하도록 설정하였습니다. 아마도 그 일본에서 만든 modurl같은녀석을
여기저기 뜯어고쳤던듯합니다;;

김정균

redurl(mod_url) 은 요청하신 페이지가 존재하면 작동하지 않습니다. 즉, 해당 페이지가 존재하지 않을 경우에만 작동합니다. 이는 httpd.conf 에서 error log level 을 debug 로 맞추어 놓고선 error log 를 보시면 확인하실 수 있습니다.

hooking 을 전처리로 할 때의 문제는, 무조건 바꾸기 때문에 file system 에 정말 utf8 로 인코딩된 파일이름이 존재하고 있을 경우 찾을 수가 없습니다. 또한, Alias 와 같은 URL 을 처리할 수 없습니다. 저도 전처리로 하려고 했으나 이 부분 때문에 결국에는 LAST 로 처리한 것입니다.

그리고, worker model 은 솔직히 뭐라고 말은 못하겠습니다. 일단 mod_url 자체가 thread safe 한지 보장을 하지 못하기 때문에 worker model 에서 사용을 하라고 권장 자체를 못하기 때문입니다. :-)

김정균

apache 2 용은 1.10 이 아니라 1.12 입니다. 현재 2.0.52 와 2.2.3 에서 정상 작동 하는 것을 확인했습니다.