코드윙즈 사이트를 개발하면서, 자동 채점 시스템을 구현하다가 php로 만들어진 hustoj와 Django로 만들어진 기존 서비스를 합쳐야 하는 상황이 되었다.
우리가 해야할 것은 php로 만들어진 기존의 사이트와, django[python]으로 만들어진 사이트 두개를 한 url 내에서 서비스 하며, django단에서 로그인 할 경우, php에서도 로그인이 되도록 수정하는 것이 목표이다.
바쁜 사람들을 위해 진행 단계를 요약하면 아래와 같다.
nginx를 이용하여 접근 url별로 다른 sock에게 전달 [php파일은 php5-fpm.sock이, 그 외의 것은 tornado_server에게 전달]
php와 django서버가 같은 database를 참조하도록 만들기
django의 session data 저장 방식을 php style로 변경[phpserializer를 이용하여, session engine에서 encode할 때 형태를 변경]
php단에서 session_handler를 파일 참조에서 database의 django_session table을 참조하도록 수정
php.ini 파일에서 session_serializer를 php_serializer로 수정
django에서 request.session[“키”] = 값; 을 등록 한 후, php에서 session_start()호출 후 $_SESSION[“키”]값을 조사하기.
먼저 nginx를 이용하여, 접근하는 url에 따라 채점 관련 서비스는 php5-fpm sock에게, 나머지는 기존의 tornado 서버로 전달한다.
이제 php5 파일은 로컬의 /var/www/html 경로에 있는 template들을, 그 외의 요청은 기존의 tornado 서버가 돌고 있는 도커로 전달한다.
물론 docker -v 옵션을 이용해여 /var/run/php5-fpm.sock을 nginx 내부 컨테이너와 루트의 것을 연결해줘야 동작한다.
가장 중요한 점은 둘의 세션 공유인데, 기본적으로 django와 php에서 사용하는 세션 핸들링 방식이 전혀 다르기에, django의 세션 저장 방식을 php에 맞게 바꿔야한다.
키와 값들이 해쉬된 형태로 저장되어있다. 이것을 php에서 사용할 수 있는 데이터로 가공하기 위해서는 django의 Session Engine을 수정하여 한다.
비슷한 역할을 해주는 django_php_bridge 라는 플러그인이 있는데, 문제는 기존 플러그인이 2012년 이후로 더 이상 업데이트가 안되는 것인지,원형 그대로 받아서 실행하는 경우 string conversion 오류가 발생한다.
그러므로 pip로 설치하지 말고, git clone https://github.com/winhamwr/django-php-bridge/ 을 통해 파일을 받은 후, backends/db.py의 코드를 아래와 같이 수정한다.
setup.py 또한 아래와 같이 수정해야 한다.
이렇게 변경 한 후 python3 setup.py install을 하면 정상적으로 플러그인이 설치된다.
플러그인을 설치 한 후, settings.py에 아래의 두줄을 추가한다.
SESSION_ENGINE = ‘django_php_bridge.backends.db’
SESSION_COOKIE_NAME = ‘PHPSESSID’
위의 절차를 모두 마친 후, 장고에서 로그인 하면 기존의 한줄짜리 세션데이터가,
a:4{s:13:”_auth_user_id”;s:2:”10”;s:7:”user_id”;s:2:”bjPark”;s:18:”_auth_user_backend”;s:41:”django.contrib.auth.backends.ModelBackend”;s:15:”_auth_user_hash”;s:40:”b6fdf4bf7sadlksajdlksaj”;} 와 같은 형태로 바뀌게 된다.
이제 php단으로 넘어가서, /etc/php5/fpm/php.ini 파일을 연 후,
php.ini의