본문 바로가기
개발환경/Web Server

우분투 20.04에서 lighttpd CGI 설정 방법 및 C와 Python 예제 코드

by Kibua20 2020. 8. 6.

CGI (Common Gate Interface)는 사용자 Browser에서 URL 요청을 받아서 Web 서버의 특정 위치의 프로그램을 실행하도록 하는 표준 규약을 의미합니다.  이전 포스팅에서는 lighttpd 설치 방법에 대해서 설명했고, 본 포스팅에서는 CGI의 최소 프로그램인 Hello world로 출력하는 방법에 대해서 설명하고, 다음 포스팅에서 GET과 POST Mehtod의 사용법에 대해서 설명할 예정입니다.

 

 위키백과에서는 CGI를 다음과 같이 요약하고 있습니다. 중요한 키워드로 '환경 변수', '표준 입력', 'QUERY_STRING (GET method)', 'CONTENTS LENGTH (POST method)' 정도로 설명할 수 있습니다.  

  • CGI 프로그램은 웹 서버가 클라이언트로부터 요청에 응답해 동작한다.
  • 전형적으로는 웹 서버의 공개 영역에 설치된 프로그램에 대응하는 URI으로 요청이 있으면, 서버는 그 프로그램을 CGI의 결정에 따라 호출한다.
  • CGI 프로그램으로의 정보 입력은 명령줄 인수, 환경변수, 표준 입력에 의해 이루어진다.
    • 웹 서버가 프로그램을 호출하는 시점에서 얼마의 환경변수를 정의하는 것이 결정된다.
    • 특히, 클라이언트가 서버에 요구한 URI의 안, 검색문자열(Query String)이 환경변수 QUERY_STRING에 설정되기 때문에, 그것은 HTML 폼에서 GET 메서드로 입력을 받는 것이 편리하다.
    • QUERY_STRING에 문자'='가 포함되어 있지 않은 경우에, 서버는 QUERY_STRING의 내용을 커맨드라인 인수로서 CGI 프로그램을 넘긴다. 이것은 HTML의 ISINDEX 요소를 이용하여 송신된 정보를 다루는데 편리하다.
    • 클라이언트에서의 HTTP요청 BODY부분은 CGI 프로그램 표준 입력에 들어간다. 또, 그 입력의 길이가 환경변수 CONTENT_LENGTH에 설정되어 있다. 그것은 HTML 폼에서 POST메서드로 입력을 받는 것이 편리하다.
    • CGI 프로그램에 대응하는 가상 패스 후에, 더욱이 여분의 패스가 계속 이어진 경우 그 정보는 환경변수 PATH_INFO에 격납(格納)되어 PATH_INFO를 웹 서버의 가상 패스로 해석한 때에 대응해야 하는 물리 패스가 환경변수 PATH_TRANSLATED에 격납된다. 이 방식도 CGI 프로그램에 사용자 측으로부터 변수를 전하는 목적에 자주 사용된다.
  • 프로그램이 표준입력에 출력된 데이터는 웹 서버를 경우한 클라이언트에 보내진다. 이 데이터는 정당한 HTTP헤더로 시작하지 않으면 안 된다.
  • 단, 몇 개의 특별한 헤더 필드는「서버 디렉티브」로 해석되어, 웹 서버의 거동 (상태 코드 등)에 환경을 부여한다. 그 밖의 모든 헤더 필드는 그 상태 그대로 클라이언트에 송신된다.
  • 현재의 WWW에서는 HTML이 중심적인 역할을 하고 있어, CGI 프로그램은 HTML을 출력하는 경우가 압도적으로 많다.
    • 영상 데이터 등을 출력하는 것도 있다. (이것은 엑세스 카운터 등을 조작할 때에 사용된다.)

1. lighttpd에서 CGI 모듈 활성화

lighttpd에서 기본적으로 CGI 모듈은 '비활성화'되어 있습니다.  /etc/lighttpd/lighttpd.conf 파일을 직접 수정하는 것보다  lighty-enable-mod 명령어를 사용하는 것이 편리합니다. 

 

# cgi mod enable 

$ sudo lighty-enable-mod cgi

lighttpd에서 cgi 모듈 활성화

lighty-enable-mod 명령어로 cgi 모듈 활성화하면 /etc/lighttpd/conf-enabled 폴더에 cgi 설정 파일인 conf파일이 새로 생성됩니다. 메인 설정 파일인  lighttpd.conf에서는 conf-enabled/*.conf 파일을 모두 include 하도록 구현되어 있어 자동으로 적용됩니다.   

 

$ sudo vi /etc/lighttpd/conf-enabled/10-cgi.conf

conf-enabled/*.conf 파일을 모두 include 함

2. lighttpd에서 CGI 모듈 설정 파일 수정

/etc/lighttpd/conf-enabled/10-cgi.conf 파일 중 cgi.assign과 alias.url 값을 아래와 같이 수정해야 합니다. 

lighttpd에서 CGI 모듈 설정 파일 수정

cgi.assign  의미:  file-extensions that are handled by a CGI program

      예) cgi.assign = ( ".pl" => "/usr/bin/perl",:
                                        ".py" => "/usr/bin/python3" )

 

alias.url 의미: The alias module is used to specify a special document-root for a given url-subset  rewrites the document-root for a URL-subset

alias.url = ( "/cgi-bin/" => "/var/www/servers/www.example.org/cgi-bin/" )



3. lighttpd에서 호출할 CGI 실행 파일 생성

hello.c 파일을 작성하고  gcc로 컴파일/링크해서 hello.cgi 실행 파일을 만듭니다. 

$  gcc -o hello.cgi hello.c

#include "stdio.h"

int main(void)
{
    printf( "Content-Type: text/plain\n\n" );
    printf("Hello world !\n");
    return 0;
}

 

hello.cgi 파일을 /usr/lib/cgi-bin/ 폴더에 copy 합니다.

$ sudo cp ./hello.cgi /usr/lib/cgi-bin/ 

 

lighttpd 서비스를 재 시작 합니다. 

$ sudo /etc/init.d/lighttpd restart   or  $ sudo service lighttpd force-reload

 

4. C로 구현한 Hello world CGI

크롬에서 cgi-bin으로 접속하면 /usr/lib/cgi-bin 에서 cgi 프로그램을 찾아 실행합니다.  즉, Chrome에서 http://localhost/cgi-bin/hello.cgi의 URL을 lighttpd를 요청하고, lighttpd에서는 http://localhost/cgi-bin/ 을 /usr/lib/cgi-bin/ 위치로 해석해서 hello.cgi를 찾아 실행합니다. 

 

hello.cgi 에서는 printf()를 사용해서  'Hello worl!'를 출력하면  웹 서버에서 표준 출력을 받아서 사용자의 브라우저에 전달합니다.  

 

http://localhost/cgi-bin/hello.cgi

 

Hello world CGI 동작 확인 (C 로 구현)

5. Python으로 구현한 Hello world CGI

CGI는 표준 입출력을 사용하기 때문에 프로그램 언어에 대한 제약이 없습니다. Python으로 CGI를 구현하기 위해서는 /etc/lighttpd/conf-enabled/10-cgi.conf 설정 파일에 python 파일 *.py 확장자에 대한 실행 프로그램을 설정을 추가해야 합니다. 

 

# lighttpd의 cgi 설정에 Python 추가

$ vi /etc/lighttpd/conf-enabled/10-cgi.conf

 

# 10-cgi.conf 파일에서 .py 확장자에 대한 실행 파일을 아래와 같이 추가합니다. 

$HTTP["url"] =~ "^/cgi-bin/" {
  cgi.assign = ( "" => "", ".py" => "/usr/bin/python3" )
  alias.url += ( "/cgi-bin/" => "/usr/lib/cgi-bin/" )
}

 

# hello.py 파일 작성

$ sudo vi hello.py

#!/usr/bin/python3
# -*- coding: utf-8 -*-

print('Content-type: text/plain\r\n')
print('Hello world by python cgi')

 

# Web server URL을 통해서 접속 (http://localhost/cgi-bin/hello.py)

Hello world CGI 동작 확인 (Python으로 구현)

 

관련 글

우분투 20.04에서 lighttpd Web Server 설치 (Embedded용으로 활용 가능)

우분투 20.04에서 Apache와 Tomcat 완전 삭제 방법

우분투 20.04에서 Web 서버 설치 방법 (apache2, tomcat9)

Python 표준 입출력(stdin/stdout) 활용 - 리눅스 프로그램과 연동

파이썬으로 Apk Download 자동화: Selenium기반의 Apk 크롤러

GCP (Google Cloud) 방화벽 설정: 프로토콜과 포트를 사용 허용 또는 거부하기

GitHub 아이디/패스워드 입력 없이 사용하는 방법

리눅스 시스템 정보 확인 방법 (우분투 버전, gcc 버전, libc 버전)

git 사용하기 #1 (부제: GitHub)




댓글