• [파이썬 기초]웹서버 및 파이썬 설치, CGI 연동

    2021. 3. 8.

    by. 웰시코더

    반응형

    -웹서버와 파이썬을 설치하는 방법을 간단히 정리한다.

    -CGI로 파이썬과 웹서버를 연동하는 방법을 학습한다.

    -생활코딩의 파이썬 강의를 기반으로 학습하였다.

    -파이썬은 3.9.2 ver를 사용한다.


    웹서버 설치

    웹서버로 사용하기 위한 bitnami WAMP라는 것을 설치해야 한다. java와 톰캣 등만 사용하다보니 생소한 용어 및 프로그램들이 많이 나와서 차근차근 정리해야겠다.

     

    bitnami WAMPbitnami라는 오픈소스 통합 소프트웨어 번들을 제공하는 기업에서 제공하는 통합 솔루션이다.

    WAMPWindow, Apache, Mysql, Php의 약자라고 한다. 이 것들을 한 번에 설치, 사용할 수 있는 프로그램이다.

     

     

    bitnami.com/stack/wamp

     

    WAMP

    Bitnami WAMP Stack provides a complete, fully-integrated and ready to run WAMP development environment. In addition to PHP, MySQL and Apache, it includes FastCGI, OpenSSL, phpMyAdmin, ModSecurity, SQLite, ImageMagick, xDebug, Xcache, OpenLDAP, ModSecurity,

    bitnami.com

     

    위의 링크에서 본인 OS에 맞는 WAMP를 설치할 수 있다.

     

    설치 후 http://127.0.0.1로 접속하여 아래와 같은 화면이 나온다면 설치 성공이다.

     

     

    위와 같은 화면이 나온다면 성공

     

    IDE는 Atom을 사용하려고 한다. VSCode 등을 사용해도 되지만 강의에 맞춰 사용해보려고 한다.

     

     

    Atom에서 File - Open Folderbitnami/C:\Bitnami\wampstack-8.0.2-1\apache2\htdocs 폴더를 선택한다.

     

    htdocs는 루트디렉토리로 웹브라우저의 요청이 오면 웹서버에서 가장 먼저 찾는 경로이다.

     

    Atom에서 htdocs를 열고 index.html 열기

    index.html의 내용을 다 지운 후 Hello python!!이라고 입력 후 저장하였다.

    이후 127.0.0.1/index.html로 접속하면 화면에 Hello python!!이라고 쓴 것이 출력됨을 확인할 수 있다.

     

     

     

    파이썬 설치

    www.python.org/downloads/

     

    Download Python

    The official home of the Python Programming Language

    www.python.org

     

    위 링크에서 받으면 된다.

     

     

     

     

    위의 Add Python 3.9 to PATH를 체크해줘야 CLI 환경에서도 사용할 수 있다고한다.

     

    우리가 설치한 파이썬은 파이썬 인터프리터로 우리가 입력한 명령을 인터프리터가 해석하여 파이썬을 실행해야 한다.

     

    일단 cmd를 실행한다.

     

    cmd에서 python이라고 입력하면 버전 확인 및 python mode로 들어갈 수 있다. 여기서 1+1 등을 입력하면 인터프리터에 의해 결과값을 확인할 수 있다.

     

     

    exit()로 빠져나갈 수 있다.

     

     

    자주 사용되는 계산 등의 로직은 파일을 만들어 사용할 수 있다.

     

    htdocs 폴더에 helloworld.py라는 파일을 만든 후 다음과 같은 코드를 입력했다.

     

    a=2+3+4
    b=a/3
    print(b)

     

    그리고 cmd창에서 아래와 같은 명령어를 입력하여 htdocs폴더로 이동하였다.(python mode에서 나온 후 입력해야 함)

     

    cd C:\Bitnami\wampstack-8.0.2-1\apache2\htdocs

     

    여기서 아까 저장한 helloworld.py를 실행시키려면 다음과 같이 입력하면 된다.

     

    python helloworld.py

     

    또는

     

    helloworld.py라고만 입력해도 확장자 .py만 보고 실행할 수 있다.

     

    계산 결과를 print하여 3.0이 나오는 것을 확인할 수 있다.

     

     

    CGI를 통한 Apache와 Python 연동

     

    127.0.0.1/helloworld.py에 접속해보면 계산 결과가 아닌 그냥 위의 입력한 명령어가 HTML로 그대로 출력되는 것을 확인할 수 있다. 아파치에서는 정적인 텍스트 해석만 가능하기 때문에 파이썬을 이용해 프로그래밍적으로 계산되어 출력되도록 작업이 필요하다.

     

    이 작업이 CGI를 통한 아파치와 파이썬의 연동 작업이다.

     

    우선 Open Folder로 C:\Bitnami\wampstack-8.0.2-1 디렉토리를 연다. 여기서 apache2\conf\httpd.conf 파일을 연다.

    mod_cgi로 검색하면 다음과 같은 코드를 찾을 수 있다.

     

    LoadModule cgi_module modules/mod_cgi.so

     

    이 코드가 주석처리(#) 되어 있으면 풀어주자.

     

    그리고 좀 내려가보면 다음과 같은 코드가 있다.

     

    #
    # DocumentRoot: The directory out of which you will serve your
    # documents. By default, all requests are taken from this directory, but
    # symbolic links and aliases may be used to point to other locations.
    #
    DocumentRoot "C:/Bitnami/wampstack-8.0.2-1/apache2/htdocs"
    <Directory "C:/Bitnami/wampstack-8.0.2-1/apache2/htdocs">
        #
        # Possible values for the Options directive are "None", "All",
        # or any combination of:
        #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
        #
        # Note that "MultiViews" must be named *explicitly* --- "Options All"
        # doesn't give it to you.
        #
        # The Options directive is both complicated and important.  Please see
        # http://httpd.apache.org/docs/2.4/mod/core.html#options
        # for more information.
        #
        Options Indexes FollowSymLinks
    
        #
        # AllowOverride controls what directives may be placed in .htaccess files.
        # It can be "All", "None", or any combination of the keywords:
        #   AllowOverride FileInfo AuthConfig Limit
        #
        AllowOverride None
    
        #
        # Controls who can get stuff from this server.
        #
        Require all granted
    </Directory>

    여기서 DocumentRoot가 웹서버에서 파일들을 찾을 루트 위치다.

    아래의 Directory는 DocumentRoot에서 할 수 있는 작업에 대한 옵션 설정을 하는 곳이다.

     

    여기서 최하단에 다음과 같은 코드를 입력한다.

     

    	<Files "*.py">
        	Options ExecCGI
        	AddHandler cgi-script .py
    	</Files>
    </Directory>

    .py로 끝나는 파일들은 CGI로 실행한다는 의미이다.

     

     

    Stop->Start를 눌러서 서버를 재실행시킨다.

    WAMP 프로그램을 실행시켜서 아파치 웹서버를 재시작한다. 처음에 Restart를 눌러도 제대로 안 되서 Stop->Start를 하니 제대로 작동하였다. 아래와 같은 화면이 뜬다면 CGI가 연동된 것이라고 볼 수 있다.

     

     

    CGI가 정상적으로 동작하면 위와 같은 화면이 뜬다.

     

    이후 에러 로그는 apache2\logs\error.log에서 확인할 수 있다.

    에러 로그들을 다 지우고 다시 접속해서 다음과 같은 에러가 떠야 한다.

     

    [Mon Mar 08 20:42:38.294234 2021] [win32:error] [pid 8228:tid 1244] [client 127.0.0.1:60211] AH02102: C:/Bitnami/wampstack-8.0.2-1/apache2/htdocs/helloworld.py is not executable; ensure interpreted scripts have "#!" or "'!" first line
    [Mon Mar 08 20:42:38.294234 2021] [cgi:error] [pid 8228:tid 1244] (9)Bad file descriptor: [client 127.0.0.1:60211] AH01222: don't know how to spawn child process: C:/Bitnami/wampstack-8.0.2-1/apache2/htdocs/helloworld.py
    

     

    첫줄을 보면 helloworld.py는 실행할 수 없으며 인터프리트된 스크립트에서 "#!"나 "'!"가 첫줄에 있어야 한다 라는 것을 알 수 있다.

     

    다음과 같이 코드를 수정한다.

     

    #!python
    a=2+3+4
    b=a/3
    print("content-type: text/html; charset=utf-8\n")
    print(b)
    

     

    맨 윗줄에 #!python이 추가된 것을 확인할 수 있다. 그런데 4번째 줄에 print'print("content-type: text/html; charset=utf-8\n")가 추가되었다.

     

    강의에서는 그냥 일단 특정 사이트(python.org) 접속시 크롬개발자도구 network에서 Response Header의 Content-Type을 복붙하여 보여줬는데 Content-Type 캐릭터셋을 이런 식으로 맞춰야되는 것 같다. 정확한 것은 배우면서 포스팅 수정이 필요하겠다.

     

    어쨋뜬 이 코드가 없으면 Internal Error가 나고 Response Header의 Content-Type이 text/html; charset=iso-8859-1로 나온다.  utf-8로 맞춰주는 print문을 넣고 실행해보자.

     

    위와 같이 입력한 수식이 계산되어 3.0이 반환되는 것을 볼 수 있다.

    반응형

    댓글