- 전체
- Python 일반
- Python 수학
- Python 그래픽
- Python 자료구조
- Python 인공지능
- Python 인터넷
- Python SAGE
- wxPython
- TkInter
- iPython
- wxPython
- pyQT
- Jython
- django
- flask
- blender python scripting
- python for minecraft
- Python 데이터 분석
- Python RPA
- cython
- PyCharm
- pySide
- kivy (python)
Python 인터넷 Apache와 Python 연동하기
2016.10.16 12:33
Apache와 Python 연동하기
|
사실 원래는 딴 공부 하고 있었는데(…) 갑자기 인터넷을 찾아보니 파이썬을 CGI 형태로 사용하는 방법은 많이 있었지만, mod_python을 이용하는 방법은 그렇게 문서가 많지 않아서 둘 다 조사하고 정리해보았다. 조사하다 보니, WSGI도 욕심이 생겼지만, 일단 하나라도 좀 끝내놓고 다른걸 시작하자 (…)
Apache와 Python 연동하기딱히 요즘 공부하고 있는게 파이썬인건 아니긴 한데, 난 왜 이렇게 자꾸 파이썬이 눈에 밟히는지 모르겠다. 딴 공부를 하던 중에 갑자기 웹페이지의 요청을 파이썬으로 처리하는 방법에 대해 관심이 생겼고, 조사하면서 알게 된 내용을 정리해 보았다. 아파치가 전달받은 웹페이지의 요청을 파이썬으로 처리하는 방법은 두가지가 있는데, CGI를 이용하는 방법과 아파치의 mod_python 모듈을 이용하는 방법이 있다. 이외에도 WSGI(Web Server Gateway Interface)를 이용하는 방법이 있는 것 같은데, 이쪽은 조사해보지 않았다. CGI를 이용해서 Python 이용하기CGI를 이용해서 요청을 처리하는 방법은 비교적 간단하다. 아파치의 환경설정을 손봐서, 파이썬 확장자로 요청이 전달된 경우에는 파이썬에서 처리하도록 하면 된다. 아파치 환경설정 파일은 아파치 버전에 따라서 차이가 있을 수 있는데, 나는 윈도우용 APM 패키지인 XAMPP를 사용하고 있으니 XAMPP에 맞춰서 기술하려고 한다. 여담으로, 최근에는 XAMPP의 리눅스용 및 맥OS용 패키지도 나온것 같은데, 그쪽은 써보지 않아서 잘 모르겠다. 또한 이 항목은 파이썬 3.4.3을 기준으로 테스트하고 작성되었다. 다들 알다시피 파이썬 2와 파이썬 3은 제법 큰 차이가 있기 때문에, 파이썬 2 기준으로 실험하면 아래 내용들이 동작하지 않을수도 있다. 윈도우용 XAMPP 기준으로, 아파치의 환경설정 파일의 경로는 아래와 같다.
위 파일을 텍스트 에디터로 열어서, <Directory> 태그를 찾아서 아래에서 두개의 라인이 추가된 라인이며, 다음의 의미를 갖는다.
위와 같이 설정하고 나면, 설정된 디렉토리에 .py 파일을 작성하여 웹페이지의 요청을 처리할 수 있게 된다. 다만, 파이썬은 웹페이지의 요청을 처리하기 위한 전용 언어가 아니기 때문에, CGI 처리를 위해서는 정해진 규격을 따를 필요가 있다(정확히는 파이썬에서 CGI를 처리하기 위한 규격이라고 보는 편이 옳겠다). 파이썬의 CGI 프로그램은 아래 규격을 따른다.
위 규격을 따른다면, 아래와 같은 형태의 샘플 코드가 될 것이다. 위 샘플코드를 작성한 뒤 웹브라우저로 접속해보면 화면에 운영체제에 따라서는 한글 출력시 오류가 발생하거나 아무것도 표시되지 않을 수가 있는데, 이때는 아래 “한글 출력이 되지 않을때” 부분을 참고한다. mod_python 이용하기mod_python은 아파치의 모듈 중 하나로써, 아파치에 파이썬 언어를 처리할 수 있는 모듈을 통합한다. 스크립트는 아파치 내부로 통합된 파이썬 모듈에서 처리되기 때문에, 파이썬 인터프리터를 직접 구동시켜 처리하는 CGI 방식보다 퍼포먼스 면에서 더 유리할 것이라고 생각하지만, 딱히 측정해보지는 않았다. 그런 반면에, 파이썬 인터프리터를 직접 구동하는 것이 아니기에, 파이썬의 특정 feature가 mod_python에서 지원되지 않는다면 mod_python의 버전업만을 기다릴 수밖에 없다는 단점도 있다. (사실 CGI는 어떤 언어를 지칭하는 것이 아니라, 웹서버와 서버 사이드 스크립트간의 통신 규약을 가리키는 것이다. 그러므로 어떤 CGI 프로그램과 동일한 문법을 가지고 있다고 해서 그 언어가 CGI다 라는 식으로 부를 수는 없다. 좀 길지만, KLDP의 PHP도 CGI인가요?라는 토론을 참고하면 어느정도 감을 잡을 수 있다.) mod_python의 공식 페이지는 http://modpython.org 이다. 그런데 2015년 4월 14일 현재 mod_python은 최신 버전이 3.5.0이지만, 윈도우용은 3.3.1 버전이 최신 버전이다. GitHub 저장소에 올라온 공지사항에 의하면, 개발자가 윈도우 운영체제의 개발환경을 사용하지 못하기 때문에 저장소의 소스 코드를 사용해서 직접 컴파일해본 뒤 구동이 가능한지 확인 여부를 알려달라고 하고 있다. 이 글에서는 mod_python이 윈도우 운영체제로는 최신 버전이 업데이트 되지 않는 것도 있고 해서 리눅스에서 테스트했던 경과를 기록했지만, 만약 꼭 윈도우 운영체제에 설치해서 사용해보겠다는 사람은 Installing Python (mod_python) on XAMPP (on Windows)라는 문서를 참고하면 도움이 될 것 같다. 다만 2008년도에 작성된 문서라 mod_python 웹페이지의 주소가 틀렸다던가 하는 문제가 좀 있다. 여하튼 그런 연유로, mod_python은 VMware에 설치한 리눅스 환경에서 테스트하였다. 리눅스는 2015년 4월 14일 현재 우분투 서버의 가장 최신버전인 우분투 서버 14.04 LTS를 사용했다. 당연한 이야기지만 패키지 관리자는 RHEL의 RPM이 아닌, 데비안의 apt-get이 사용되었다. 여기서는 아파치 설치부터 mod_python 설치까지 진행했던 내용을 순서대로 기술하려고 한다. 화면이 좀 번잡해지겠지만, Ordered List를 이용해서 수행하려는 작업을 표시하고, Unordered List를 이용해서 명령어를 표시하겠다. 각 명령어들은 굳이 sudo를 붙이지 않았다. 다만, 내가 리눅스에서 서버 운영을 해본 적이 거의 없기 때문에 중간중간 불필요한 작업이 있을수도 있다.
apache2.conf 파일은 CGI 처리하도록 설정할때와 비슷하게 <Directory> 블럭을 아래와 같이 수정한다. 아래의 3개의 라인이 추가된 부분이다.
위와 같이 설정했다면 .py 파일은 CGI를 사용할 때와 동일한 문법으로 동작하고, .psp 파일은 ASP나 PHP처럼 HTML 중간에 스크립트를 끼워넣는 형식으로 동작한다. .py 파일은 CGI에서 작성한 샘플 예제를 그대로 이용할 수 있을 것이고, .psp 파일은 아래와 같은 예제로 테스트해볼 수 있다. 위 페이지를 웹브라우저를 통해 접속해보면 화면에 또한, .py 파일은 mod_python.cgihandler 대신 mod_python.publisher를 이용해서 처리할 수도 있다. 위에서 적어둔 아파치의 설정 파일을 아래와 같이 설정한다. 사실은 .py 파일은 .cgihandler, .psp는 .psp, 그 외 다른 확장자를 하나 더 둬서 .publisher로 처리되도록 하려고 했으나, 이상하게 .publisher는 .py 확장자로 설정하지 않으면 동작하지 않았다. apache2.conf 파일에서
위 부분을
로 수정한 뒤 아파치를 재시작한다. 그 후 예제 파일은 확장자를 .py로 해서 아래와 같이 만든다. 위와 같이 작성한 후, 한글 출력이 되지 않을때mod_python은 그냥 경함상 해본 것이라서 HTML만 출력하고 만족했으니 그렇다 치더라도, CGI로 파이썬을 사용할때는 한가지 문제가 발생했다. 화면에 한글을 출력하려고 하면 웹브라우저가 회색으로만 표시되고 아무것도 나오지 않았다. 예를 들어서 이것이 모든 환경에서 동일하게 발생하는 문제인지는 잘 모르겠지만, 일단 내가 사용하는 서버인 영문판 Windows Server 2012에서는 그러한 문제가 발생했다. 이것은 아마도, 파이썬 CGI 프로그램에서도 실제로 간단한 form 페이지를 만들어서 파이썬으로 데이터를 전달 후 파이썬에서
이것을 해결하기 위해서는 파이썬 코드를 UTF-8 인코딩으로 작성한 후, stdout의 인코딩을 강제로 UTF-8로 전환해주면 올바르게 출력된다. 예를 들어서 맨 처음에 작성한 코드는 아래와 같이 수정할 수 있다. 위와 같이 작성한 후 웹브라우저로 접속해보면 참고자료이 글은 아래 문서들을 참고하였다.
|
[출처] https://blog.ayukawa.kr/archives/1342
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

