NoSmokeMoinMoinBsnSCGI를 적용하면서 일어나는 일.

SCGI 를 참고문서로 적용

처음실행시

cgimain.py 의 맨 마지막부분 if 문.

   1 if os.environ.has_key('GATEWAY_INTERFACE'):
   2     # create CGI log file, and one for catching stderr output
   3     cgi.logfile = os.path.join(config.data_dir, 'cgi_log')
   4     sys.stderr = open(os.path.join(config.data_dir, 'err_log'), 'at')
   5 else:
   6     # if called from the shell, delegate to the "cmdmain" module
   7     from MoinMoin import cmdmain
   8     run = cmdmain.run

어떤이유인지 모르겠으나 GATEWAY_INTERFACE 환경변수를 못 읽고, else문으로 들어간다. 가장 간단한 해결방법은 저부분 모두 주석화 -.-;

HTTP Header 전송

하나의 프로세스다 보니, 헤더한번 전송하고 끝이다. 이를 예방하려, sgci서버코드의 핸들러생성부분에 강제로 헤더를 넣었더니, 아주 가끔씩 헤더가 두번 나가는 일이 생긴다. 수정요망

윗처럼 할 경우, 헤더전송이전에 보내야할 Cookie를 보내지 못함으로인해 로그인을 할 수 없다. 해결방법은 http_headers 함수중간의 sent_headers를 항상 0으로 변경. 또 한가지 user_headers 리스트에 쌓였던것은 한번 보냈으면, 꼭 비우기.

사용자 인증부분

기존의 CGI는 하나의 프로세스에는 오직 한명만이 관여하므로, user.py 의 current를 전역변수로 놓아도 상관없으나, scgi서버가 데몬으로 떠 있을 경우에는 다른 사용자임에도 불구하고, 먼저로그인한 사람의 정보가 고스란이 다음로그인한 사람에게 나타난다. 해당객체를 전역변수에서 가져와선 안되고, 요청당 따로따로 만들어야함. 가장 간단한 해결방법은 cgimain.py의 run함수 정의 첫부분에 한줄 삽입

   1 def run():
   2     from MoinMoin import user, webapi, config
   3     user.current = user.User()  

그러나, 아직까지 문제가 남아있는듯. 5개의 scgi 프로세스가 모두 떠있는 상황에서 간혹, 이전 접속사용자로 로그인되는 경우가 있다. 변경되지 않은 전역변수를 사용하기 때문으로 파악되나, 아직 정확한 문제는 잘 모르는중.

일단, handle_connection 메쏘드 마지막부분에 env['HTTP_COOKIE']를 지워주는 방식 사용. 문제가 없는지는 더 두고봐야함.

기타

사용자입장에서의 달라지는 점

  1. InterMap에 등록한 InterWiki는 바로 동작하지 않는다. 서버프로세스를 재시작하여야 한다. 따라서, 곧바로 링크가 표시되지 않을 수 있다.


CategoryMoinMoin

MoinMoinOnScgi (last edited 2013-09-09 13:49:52 by 61)

web biohackers.net