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함수 정의 첫부분에 한줄 삽입
그러나, 아직까지 문제가 남아있는듯. 5개의 scgi 프로세스가 모두 떠있는 상황에서 간혹, 이전 접속사용자로 로그인되는 경우가 있다. 변경되지 않은 전역변수를 사용하기 때문으로 파악되나, 아직 정확한 문제는 잘 모르는중.
일단, handle_connection 메쏘드 마지막부분에 env['HTTP_COOKIE']를 지워주는 방식 사용. 문제가 없는지는 더 두고봐야함.
기타
사용자입장에서의 달라지는 점