윈도우 기반의 파이썬 개발환경

웹 프로그램은 다양한 플랫폼에서 동작시킬 수 있습니다. 책에서는 리눅스/OSX 환경에서의 설정만 다뤘지만 여기에서는 윈도우 환경에서의 웹 서버 프로그램을 설치하고 파이썬 웹 프로그램을 윈도우에서 구동시키는 것을 설명합니다.

목차

  1. 아파치 웹 서버 설치

  2. 아파치 웹 서버와 mod_wsgi 연동

  3. NGINX 웹 서버 설치

  4. NGINX 웹 서버와 twisted 연동


1. 아파치 웹 서버 설치

아파치 웹 서버는 리눅스/유닉스를 비롯한 다양한 운영체제에서 동작하는 크로스 플랫폼 웹 서버 프로그램입니다. 전세계 웹 서버 점유율이 항상 60%에 이를 정도로 인기가 있기도 합니다.

일반적으로 리눅스/유닉스 플랫폼에 설치하여 운영하는 것이 일반적이지만 개발 목적으로 사용하거나 특수한 경우에 한해 윈도우에 아파치 웹 서버를 설치하기도 합니다.

2016년 4월 기준 아파치 웹 서버는 소스 버전과 2.2.25 버전까지만 한해 윈도우용 설치 파일을 제공합니다. 여러분이 마이크로소프트 비주얼 스튜디오 2010 버전을 가지고 있다면 직접 컴파일해서 사용할 수 있지만 여기서는 미리 컴파일되어 있는 버전을 다운로드 받아 사용합니다.

미리 컴파일되어 있는 아파치 웹 서버는 다음의 사이트에서 다운로드 받을 수 있습니다.

ApacheHaus(https://www.apachehaus.com/)

Apache Lounge(www.apachelounge.com/)

BitNami WAMP Stack(https://bitnami.com/stack/wamp)

WampServer(www.wampserver.com/en/)

XAMPP(https://www.apachefriends.org/)

아파치 웹 서버는 mod_wsgi 라이브러리와의 연동을 위해 특정 기준에 충족하는 버전을 다운로드 받아야 합니다. 이를 위해 Apache Lounge에 접속합니다.

<그림 1> Apache Lounge 사이트 홈 화면

Apache Lounge 사이트에 접속하셨으면 좌측의 Downloads 링크를 클릭합니다. 그럼 <그림 2>와 같은 화면이 나올 것입니다.

<그림 2> Apache Lounge 다운로드 화면

<그림 2>의 화면이 나오면 VC10 런타임을 사용한 버전을 다운로드 하기 위해 좌측의 VC10 링크를 클릭합니다. 잠시 뒤 <그림 3>의 화면(화면 일부분)을 볼 수 있을 것입니다.

<그림 3> 아파치 웹 서버 프로그램 다운로드 하기

그림 3의 화면이 나오면 여러분이 몇 비트 윈도우를 사용하고 있는지에 따라 Win64 또는 Win32 버전을  다운로드 하면 됩니다. 필자는 64 비트 버전을 사용함에 따라 httpd-2.4.20-win64.zip 파일을 다운로드 했습니다. 몇 비트 윈도우를 사용하고 있는지 알 수 없다면 “윈도우 제어판 > 시스템”을 통해 윈도우 버전을 확인할 수 있습니다.

httpd-2.4.20-win64.zip 파일을 다운로드 받았으면 임의의 폴더에 파일의 압축을 해제합니다.

파일의 압축을 해제하고 나면 Apache24 폴더가 보일 것입니다. 필자는 이 폴더를 C:\ 에 옮기는 것을 권장합니다. 이렇게 하면 이후의 설정 또는 관리 편의성이 좋습니다.

미리 컴파일되어 배포되는 아파치 웹 서버는 설치 파일로 제공되지 않기 때문에 윈도우 서비스로 동작시키거나 시작하는 방법이 조금 불편합니다.

이제 아파치 웹 서버를 시작/중지하는 방법과 윈도우 서비스로 등록/해제 하는 방법을 살펴보겠습니다.

1. 아파치 웹 서버의 시작/중지

아파치 웹 서버를 시작/중지하기 위해서 처음 해야할 일은 “명령 프롬프트"를 “윈도우 관리자 권한”으로 실행하는 일입니다.

“명령 프롬프트"를 관리자 권한으로 실행하려면 윈도우 시작 메뉴에서 “명령 프롬프트"를 찾아 마우스 오른쪽 버튼을 클릭하면 “관리자 권한으로 실행"이라는 팝업 메뉴가 보입니다. 이 메뉴를 클릭하면 윈도우 관리자 권한으로 “명령 프롬프트”가 실행됩니다. 관리자 권한으로 “명령 프롬프트"를 실행하지 않으면 아파치 웹 서버가 정상적으로 실행되지 않을 수 있으므로 주의해야 합니다.

두번째로 해야할 일은 httpd 명령을 사용해 아파치 웹 서버를 시작하고 정지하는 것입니다.

아파치 웹 서버 시작하기

C:\>cd C:\Apache24\bin
C:\Apache24\bin>httpd -k start

아파치 웹 서버 정지하기

C:\>cd C:\Apache24\bin
C:\Apache24\bin>httpd -k stop

아파치 웹 서버를 시작하고 나면 정상적으로 동작하는지 확인하기 위해 웹 브라우저로 http://localhost에 접속합니다.

아파치 웹 서버가 정상적으로 실행되었으면 It Works! 글자가 보일 것입니다. 대부분의 경우 정상적으로 보이겠지만 혹시 보이지 않는다면 앞의 내용을 실행하는데 잘못된 내용은 없었는지 확인해보시길 바랍니다.

2. 윈도우 서비스로의 등록/해제

아파치 웹 서버는 윈도우 서비스로 등록해서 사용하는 것도 가능합니다. 윈도우 서비스로의 등록/해제도 httpd 명령으로 쉽게 할 수 있습니다.

아파치 웹 서버를 윈도우 서비스에 등록하기

C:\Apache24\bin>httpd -k install

아파치 웹 서버를 윈도우 서비스에서 해제하기

C:\Apache24\bin>httpd -k uninstall

주의하세요. 아파치 웹 서버는 설정 파일이 잘못 구성되어 있으면 실행되지 않아요.

아파치 웹 서버는 설정 파일(httpd.conf)이 잘못 구성되어 있으면 실행되지 않습니다. httpd 명령으로 설정 파일이 잘못 구성되어 있는지 미리 확인할 수 있습니다.

아파치 웹 서버 설정 파일에 오류가 있는지 검사하기

C:\Apache24\bin>httpd -t

이 명령은 설정 파일에 어떤 문제가 있는지 알려줍니다. httpd.conf 파일을 수정했다면 오류 검사를 통해 설정 파일에 있을지도 모르는 문제를 미리 확인해 보는 것이 좋습니다.

주의하세요. 아파치 웹 서버가 실행되지 않아요.

Apache Lounge에서 다운로드 받은 VC10에서 컴파일된 아파치 웹 서버는 msvcr100.dll 파일이 없으면 실행되지 않습니다. 이 파일은 “Microsoft Visual C++ 2010 재배포 가능 패키지”를 설치하면 됩니다.

Microsoft Visual C++ 2010 재배포 가능 패키지는 x86용과 x64용으로 나눠서 제공되는데 여러분의 운영체제에 맞게 다운로드 받아 설치할 수 있습니다. 필자는 x64 윈도우를 사용하고 있어 x64 패키지를 다운로드해서 설치했습니다. 아래에 다운로드 링크를 누르면 “Microsoft Visual C++ 2010 재배포 가능 패키지” 다운로드 페이지로 바로 이동할 수 있습니다.

Microsoft Visual C++ 2010 재배포 가능 패키지(x86) 다운로드

Microsoft Visual C++ 2010 재배포 가능 패키지(x64) 다운로드


2. 아파치 웹 서버와 mod_wsgi 연동

파이썬 WSGI 기반의 웹 애플리케이션을 아파치 웹 서버 기반으로 배포 할 때 사용할 수 있는 아파치 모듈입니다. 이 라이브러리는 구글이 개발했으며 아파치 동적 모듈로 인기 있는 라이브러리 중 하나입니다.

아파치 웹 서버에서 WSGI 기반 웹 애플리케이션은 mod_wsgi 외에도 mod_python이 있지만 mod_python은 2013년 이후 개발이 중단되어 있어 사용을 권장하지 않습니다.

mod_wsgi  홈페이지: https://modwsgi.readthedocs.io

mod_wsgi는 소스 버전과 바이너리 버전이 제공되며 가능한 최신 버전의 소스 버전을 설치하는 것을 권장합니다. mod_wsgi는 리눅스/OSX에 한해 pip 명령으로 쉽게 설치할 수 있지만 윈도우를 사용하고 있다면 최신 버전의 컴파일은 Microsoft Visual Studio 2010이 필요하기 때문에 필자는 미리 컴파일되어 있는 mod_wsgi 4.4.12 버전을 받아 설정하겠습니다.

주의하세요. mod_wsgi를 컴파일 하기 위해서 Microsoft Visual Studio 2010 이상이거나 이하면 안되나요?

2016년 5월 기준 윈도우용 mod_wsgi 모듈은 VC10(Visual Studio 2010) 에서 컴파일된 아파치 웹 서버 프로그램과 파이썬에서만 동작하고 있습니다. 만약 여러분이 사용하고 있는 아파치 웹 서버의 컴파일 환경이 VC10 이하거나 그 이상을 사용하는 경우는 아파치 웹 서버도 다시 VC10에서 컴파일하고 사용해야 하는 점에 주의하세요.

mod_wsgi 4.4.12 버전을 빨리 다운로드 받기 위해서 다음 URL에 접속합니다.

https://github.com/GrahamDumpleton/mod_wsgi/releases?after=4.4.13

<그림 3> mod_wsgi 다운로드 화면

<그림 3>의 화면이 보이면 mod_wsgi-windows-4.4.12.tar.gz 링크를 클릭해  mod_wsgi 바이너리 파일을 내려받습니다.

이 파일의 압축을 해제하면 다음 4개의 폴더가 보일것입니다.

  • Apache22-win32-VC9
  • Apache24-win32-VC9
  • Apache24-win32-VC10
  • Apache24-win64-VC10

필자는 64비트 윈도우 컴퓨터를 사용하고 있어 아파치 웹 서버가 64비트용으로 컴파일되어 있는 버전을 다운로드 받았습니다. 이에 따라 mod_wsgi 모듈을 아파치 웹 서버에 추가하기 위해 Apache24-win64-VC10 폴더에 있는 내용을 사용할 것입니다.

Apache24-win64-VC10에 있는 modules 폴더를 복사해서 C:\Apache24에 붙여넣습니다. C:\Apache24 폴더 안에 내용을 붙여넣는 일은 윈도우 관리자 권한을 필요로 합니다.

0. 아파치 웹 서버와 mod_wsgi 연동에 사용된 프로그램 버전

  • Apache 2.4.20 for Windows (VC10 컴파일)
  • Python 3.4 (VC10 컴파일)
  • mod_wsgi 4.4.12 (VC10 컴파일)

1. 아파치 웹 서버에 mod_wsgi 모듈 로드하기

modules 폴더를 C:\Apache24 안에 복사했으면 wsgi 모듈을 아파치 웹 서버에 인식시켜야 합니다.

자주쓰는 텍스트 편집기(예, 에디트플러스, Acroedit 등)로 C:\Apache24\conf\httpd.conf 파일을 열고 178라인에 다음과 같은 내용을 추가하고 빈 줄을 추가합니다.

LoadModule wsgi_module modules/mod_wsgi-py34-VC10.so

파일을 편집했으면 저장하고 빠져나옵니다.

2. 아파치 재시작

“1. 아파치 웹 서버에 mod_wsgi 모듈 로드하기"를 통해 모듈을 설정 파일에 추가했으면 아파치 웹 서버를 재시작합니다.

C:\>cd C:\Apache24\bin C:\Apache24\bin>httpd -k stop C:\Apache24\bin>httpd -k start

3. Flask 샘플 프로그램 준비

Apache와 mod_wsgi를 연동한 웹 서버에 배포하기 위한 Flask 애플리케이션을 준비합니다. 여기에서는 http://flask.pocoo.org 홈 페이지에 있는 애플리케이션을 사용합니다.

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "Hello World!"

<코드 1> __init__.py

코드 1을 C:\app\hello_world 폴더를 만들고 hello_world 폴더에 __init__.py로 저장합니다.

4. wsgi 파일 준비하기

mod_wsgi 모듈을 아파치 웹 서버에 추가했으면 mod_wsgi 모듈이 우리가 준비한 WSGI 애플리케이션을 서비스할 수 있도록 wsgi 파일을 만들어야 합니다. wsgi 파일은 실제론 파이썬 파일이며 확장자만 wsgi로 만듭니다.

이 파일의 내용은 다음과 같습니다.

import sys
sys.path.insert(0, r'C:/app)

from hello_world import app as application

<코드 2> hello_world.wsgi

이 코드을 C:\app 폴더에 hello_world.wsgi로 저장합니다.

5. 아파치 설정 파일 2번째 편집

마지막으로 아파치 웹 서버 설정 파일에 우리가 배포하려는 WSGI 프로그램이 있는 디렉터리 설정 및 메인 호스트에 접속했을때 WSGI 프로그램이 응답하게 해야 합니다.

다음의 코드를 C:\Apache24\conf\httpd.conf 파일에 맨 마지막에 추가합니다.

WSGIScriptAlias / C:\\app\\hello_world.wsgi

<Directory C:\\app>
  WSGIApplicationGroup %{GLOBAL}
  Order deny,allow
  Allow from all
  Require all granted
</Directory>

<코드 3> 아파치 웹 서버 설정 파일에 WSGI 지시자 및 디렉터리 설정을 추가하는 코드

아파치 웹 서버 설정 파일(httpd.conf)을 편집했으면 관리자 권한으로 실행한 “명령 프롬프트"로 아파치 웹 서버를 재시작 합니다.

C:\Apache24\bin>httpd -k restart

이제 아파치 웹 서버에 mod_wsgi 연동 후에 WSGI 프로그램을 배포하는 작업을 모두 마쳤습니다. 웹 브라우저 http://localhost에 접근했을때 브라우저 화면에 Hello World!가 보이면 정상적으로 배포가 된것입니다.

수고하셨습니다.


3. NGINX 웹 서버 설치

NGINX는 현재 전세계 웹 서버 시장에서 아파치 웹 서버와 함께 가장 많이 쓰이고 있는 웹 서버 프로그램 중 하나이며 테스트 종류에 따라 아파치 웹 서버를 능가한다는 조사 결과도 있습니다.

NGINX도 아파치 웹 서버의 경우처럼 윈도우에 설치해서 운영하는 것을 권장하지 않습니다. 필자는 제품 운영 환경에선 리눅스 기반에서 NGINX를 동작시키는 것을 권장합니다.

NGINX를 다운로드 하기 위해 공식 홈페이지에 접속합니다.

http://www.nginx.org

<그림 4> NGINX 홈페이지

NGINX 다운로드는 우측의 download 링크를 클릭하면 <그림 5>의 화면이 보입니다.

<그림 5> NGINX 다운로드 페이지

NGINX는 2016년 5월 1일 기준 안정화(Stable) 버전으로 1.10.0이 나와 있으며 여기에서도 이 버전을 사용할 것입니다.

그림 5의 화면에서 nginx/Windows-1.10.0 링크를 클릭하면 NGINX를 다운로드 됩니다.

그럼 nginx-1.10.0.zip 파일이 다운로드됩니다. 이 파일의 압축을 해제합니다.

압축파일을 해제하면 nginx-1.10.0 폴더가 나오는데 이 디렉터리의 이름을 nginx로 바꿔서 C:\nginx로  복사해둡니다. NGINX 설치는 이것으로 완료했습니다.

1. NGINX 서비스 시작과 종료

NGINX 서비스 시작/종료는 다음과 같은 방법으로 합니다.

NGINX 시작

C:\>cd nginx
C:\nginx>start nginx

NGINX 종료

C:\>cd nginx
C:\nginx>nginx -s quit

NGINX는 2개의 종료 옵션을 제공하는데 quit는 가동된 NGINX 서버가 안정적으로 종료하도록 하는 옵션이며 다른 옵션으로 stop이 있습니다. stop은 빠른 종료 옵션으로 stop을 제공하는 것은 일반적으로 권장하지 않습니다.

NGINX를 시작하고 나면 웹 브라우저로 localhost에 접속합니다.

<그림 6> NGINX 서버가 시작한 모습

2. NGINX를 윈도우 서비스로 등록하기

NGINX는 아파치 웹 서버와 달리 nginx 명령으로 윈도우 서비스에 등록하는 명령어는 따로 제공하고 있지 않습니다. 이에 따라 윈도우 서비스로 NGINX를 등록하려면 다음의 링크를 참조하세요.

http://goo.gl/6TChIr


4. NGINX 웹 서버와 twisted 연동

NGINX는 정적인 파일을 서비스하기에는 좋지만 아파치 웹 서버와 다르게 mod_wsgi 같은 모듈을 붙일 수가 없습니다. 이에 따라 Tornado(토네이도)나 uwsgi 같은 컨테이너와 연동하는게 일반적입니다.

리눅스/OSX 기반에서는 NGINX에 uwsgi를 사용해 웹 응용 프로그램을 배포하도록 연동하는 방법이 널리 알려져 있습니다.

하지만 윈도우는 2016년 5월 현재 uwsgi가 동작하지 않고 있습니다. 이에 따라 이 문서에서는 파이썬 NGINX와 twisted를 Proxy로 연동하겠습니다.

1. twisted 설치하기

twisted는 파이썬으로 만들어진 이벤트 기반의 네트워크 엔진입니다. pip 명령으로 쉽게 설치할 수 있습니다.

twisted에 대한 다른 정보를 추가로 얻으시려면 twisted 홈페이지에 방문하세요. twisted 홈페이지는 https://twistedmatrix.com/trac/ 입니다.

C:\>C:\Python34\Scripts\pip install twisted
Collecting twisted
  Downloading Twisted-16.1.1.tar.bz2 (2.9MB)
    100% |################################| 2.9MB 145kB/s
Collecting zope.interface>=4.0.2 (from twisted)
  Downloading zope.interface-4.1.3.tar.gz (141kB)
    100% |################################| 143kB 2.6MB/s
Requirement already satisfied (use --upgrade to upgrade): setuptools in c:\python34\lib\site-packages (from zope.interface>=4.0.2->twisted)
Installing collected packages: zope.interface, twisted
  Running setup.py install for zope.interface
  Running setup.py install for twisted
Successfully installed twisted-16.1.1 zope.interface-4.1.3

<셸 1> pip 명령으로 twisted 설치하기

2.twisted 구동 파일 만들기

twisted로 WSGI 프로그램을 시작하려면 파이썬 파일을 만드는 방법과 twistd 명령을 사용하는 방법이 있습니다. 이 문서에서는 파이썬 파일을 만드는 방법을 사용할 것입니다. 여기에 쓰인 예제는 아파치 웹 서버와 mod_wsgi 연동에 쓰인 구조를 그대로 다시 사용할 것입니다.

다음과 같은 내용으로 twisted 구동 스크립트를 텍스트 에디터로 작성합니다.

from twisted.web.wsgi import WSGIResource
from twisted.internet import reactor
from twisted.web import server
from hello_world import app as application

resource = WSGIResource(reactor, reactor.getThreadPool(), application)
site = server.Site(resource)
reactor.listenTCP(8080, site)
reactor.run()

<코드 4> twisted 구동 파일 만들기

코드 4의 내용을 C:\app\twisted_run.tac으로 저장합니다. 이렇게 하는 것으로 twisted 구동 파일을 모두 만들었습니다.

3. NGINX에 twisted 연동하기

NGINX와 twisted와의 연결은 Proxy 모드로 구성합니다. NGINX 설정 파일(nginx.conf)을  텍스트 에디터로 열어서 44-45 줄을 다음과 같이 변경합니다.

proxy_pass         http://127.0.0.1:8080/;
proxy_redirect     off;

proxy_set_header   Host             $host;
proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

변경된 내용을 저장했으면 NGINX를 재시작 합니다.

NGINX 재시작

C:\nginx>nginx -s reload

이것으로 NGINX 설정은 모두 마쳤습니다.

4. twisted 시작하기

이제 “2.twisted 구동 파일 만들기”에서 만들었던 twisted_run.tac 파일을 명령 프롬프트에서 실행합니다. twisted_run.tac 파일을 실행할때는 관리자 권한이 없어도 됩니다.

C:\app>C:\Python34\python twisted_run.tac

위 명령을 실행했으면 웹 브라우저로 localhost에 접속합니다. 화면에 Hello World!가 보이면 정상적으로 연동이 완료된 것입니다.

주의하세요. NGINX를 실행할 때 특별한 권한이 필요한가요?

NGNIX도 아파치 웹 서버처럼 “명령 프롬프트"를 관리자 권한으로 실행해야 합니다. 그렇지 않으면 NGINX가 실행되지 않습니다.