NoSmokeMoinMoinBsn 에 SCGI를 적용하면서 일어나는 일.
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']를 지워주는 방식 사용. 문제가 없는지는 더 두고봐야함.
기타
사용자입장에서의 달라지는 점