Tech

Python CGI Apache2 서버와 연동 완벽 정리 in Ubuntu

Python CGI Apache2 서버 연동하느라 고생하다 드뎌 성공하여 기쁜 마음에 저와 같은 고민에 빠지신 분들이 분명히 계실거라고 생각하고 곧바로 작성합니다.

WordPress를 Apache2 서버를 통해 Hosting 하고 있어서 nginx등이 아닌 Apache2 서버를 사용해야 했었습니다. flask를 통해서 할 수도 있지만, 한 단계 더 거치는 것 같아서 거치지 않도록 해보고 싶었습니다.

Apache2와 python은 설치된 전제로 본 글은 시작하겠습니다.

LoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so

CGI에 대한 apache tutorial 에 관련된 모듈로 mod_cgi가 언급되어 있어 찾아보면 /etc/apache2/mods-available/ 디렉토리에 cgi.load와 cgid.load 파일이 있는 것을 확인하였습니다.

결국은 여기가 함정입니다.

apache2.conf 파일에 다음과 같이 mods-enabled 디렉토리의 config 파일들을 loading하고 있었습니다.

IncludeOptional mods-enabled/*.load

따라서, 다음과 같이 해주어야 합니다.

/etc/apache2/mods-enabled/ 디렉토리로 이동하여 다음과 같이 symbolic link를 만들어줍니다.

sudo ln -s ../mods-available/cgi.load cgi.load

ls -la cgi.load 하면 다음과 같이 생성됨을 알 수 있습니다.

lrwxrwxrwx 1 root root 26 Aug  2 13:14 cgi.load -> ../mods-available/cgi.load

ScriptAlias 설정하기

ScriptAlias는 특정 디렉토리를 CGI 프로그램용으로 적용할 때 사용한다. 일반적으로 Web Hosting을 하는 디렉토리 (DocumentRoot)가 아닌 다른 곳을 지정합니다.

ScriptAlias /api/ /var/www/api/

그럼 브라우저에서는 다음과 같이 입력하면 /var/www/api/test.py 의 코드가 실행됩니다.

http://www.kowanas.com/api/test.py

CGI 실행 허용하고 확장자 지정하기

Options +ExecCGI

AddHandler cgi-script .py

특정 디렉토리에 CGI 실행을 허용하고 .py 확장자가 CGI 프로그램 파일임을 지정하였습니다.

Config 예제

<VirtualHost *:80>
ServerAdmin admin@kowanas.com
DocumentRoot /var/www/html/
ServerName api.kowanas.com
ScriptAlias /api/ /var/www/api/
<Directory /var/www/api>
  Options +ExecCGI
  AddHandler cgi-script .py
</Directory>
</VirtualHost>

Python CGI Code 작성

실행 파일 지정해줍니다. 전 python3를 사용하였기 때문에 이렇게 했구요. python 2.x 를 사용하시는 분들은 python으로 입력하거나 정확한 실행 파일을 찾아서 사용하시면 됩니다.

#!/usr/bin/python3

python cgi library를 import 합니다.

python standard library로 설치 되어 있으니 따로 설치는 안하셔도 됩니다.

import cgi

Python CGI Code 예제

#!/usr/bin/python3
import cgi
print("Content-type: text/plain;charset=utf-8")
print()
print('hello')

Python CGI 파일 실행 파일로 변경

chmod a+x <파일>

오류 상황

예를 들어 위 python Code를 index.py라는 파일로 저장한 뒤, Browser로 http://www.kowanas.com/api/index.py 을 실행할 경우 다음과 같이 나온다면 성공입니다.

Python CGI 실행 결과

하지만 다음과 같은 상황들이 있을 수 있습니다.

Python Code 그대로 보임

개인적으로 이 문제에 오래 봉착했었습니다.

원인은 LoadModule이 있는 cgi.load 파일을 mods-enabled에 symbolic link를 만들지 않은게 원인이었습니다.

즉, 이 원인은 CGI로 동작을 하지 않음을 의미하니 처음부터 다시 확인해봐야 합니다.

Forbidden 으로 시작하는 문구

권한 문제가 있다는 뜻입니다 또는 Python 실행 파일 경로를 확인해봐야합니다.

whereis python (3.x일 경우 whereis python3) 를 해보면 /usr/bin/python3 가 맞는지 확인해볼 수 있습니다.

권한은 앞서 설명한 chmod a+x <파일> 을 해야 합니다.

Internal Server Error

프로그램에 오류가 있다는 것으로 command line에서 python <파일> 을 해보면 에러를 확인할 수 있을 것으로 보입니다.

마치며

별 내용이 없고 한번만 성공하면 참 쉬운 것을 몇 일 헤맸던 것으로 혹시 어려움이 있으면 댓글 남겨주시면 최대한 함께 확인해보겠습니다.

Leave a Reply