Python, Flask, WSGI, Apache 설정 삽질 ㅠ on CentOS 6

안드로이드만 계속하다 보니, 다른 것들을 접할 기회도 점점 줄어들고..
뭔가 개인적으로 하지 않으면 해보기 힘들겠다는 생각에! 파이썬을 잡고 공부를 시작해봅니다.

To-do

  • 여러버전의 파이썬을 사용할겁니다. 일단 3.4 를 쓸래요. 근데 2.7도 깔아둠. 원랜 2.6 깔려있음.
  • 가상환경에서 돌릴거에요. virtualenv
  • Flask microframework 로 만들겁니다.
  • WSGI 를 통해 Apache 로 배포할거구요.

Reference 사실 이 링크들을 따라 하면 이 글을 안봐도 됨.
http://flask.pocoo.org/docs/installation/
http://toomuchdata.com/2014/02/16/how-to-install-python-on-centos/

 

Preparations-install prerequisites

준비단계로 필요한(필요해질) 개발도구와 라이브러리들을 설치해 줍니다.

$ yum groupinstall "Development tools"
$ yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

 

Shared library

파이썬을 컴파일 하는데 사용할 공유 라이브러리 경로를 등록해줍니다.
/etc/ld.so.conf 파일에 /usr/local/lib 을 추가해줍니다.

include ld.so.conf.d/*.conf
/usr/local/lib

Shared library 를 적용하기 위해서 ldconfig 를 한번 실행시킵니다.
ldconfig 를 실행 안시켰더니 shared library 를 찾을 수 없다고 제대로 실행이 되지 않기도 해요.

$ ldconfig

 

Install and compile Python

https://www.python.org/ftp/python/
파이썬 ftp 로 들어가면 파이썬 버전들을 전부 볼 수 있습니다. 전 현재 나온 최신 버전인 3.4.1 을 설치했습니다. 여기서 altinstall 로 실행해주어야, 알아서 전부 다 해줍니다.
Flask framework 는 python 3.3 이상 버전이거나 2.x 버전이 필요해요

// wget 명령으로 파이썬 압축본을 가져옵니다.
$ wget https://www.python.org/ftp/python/3.4.1/Python-3.4.1.tar.xz

// --no-check-certificate 옵션이 필요할 수 있습니다.
$ wget https://www.python.org/ftp/python/3.4.1/Python-3.4.1.tar.xz --no-check-certificate

// 압축을 풀어줍니다.
$ tar xf Python-3.4.1.tar.xz
$ cd Python-3.4.1

// 위의 Shared library 설정에서 /usr/local/bin 을 추가했으면 LDFLAGS 는 제거합니다.
$ ./configure --prefix=/usr/local --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
$ make && make altinstall

 

Intall Setuptools & pip

원래라면 yum 명령으로 yum install python-setuptools 를 돌리면 되겠지만,
일부 배포판에 easy_install 이 pip 를 가지고 있지 않기때문에, wget 으로 ez_setup.py 스크립트를 가져와서 설치해줍니다.

$ wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py

// 셋업툴 설치. python3.4 용으로 설치할때는 이렇게 해주고요. 여러버전의 파이썬을 사용할때를 위해 이렇게!
$ python3.4 ez_setup.py

// 특정버전(3.4에만)에 대해 pip 를 설치하려면 아래와 같이 해줍니다. 기본적으로는 easy_install pip
$ easy_install-3.4 pip

// 이제 pip 또는 pip3.4 명령으로 install, uninstall 을 할 수 있습니다.

 

Python virtual environment

virtualenv 를 통해 가상환경으로 해당 프로젝트에만 적용되는 파이썬 환경을 만들겁니다.
이것땜에 WSGI 를 통한 virtualhost 설정에서 엄청 해맸죠… 단 두줄만 추가하면 되었던것을..

우선 virtualenv 를 설치합니다.

$ pip3.4 install virtualenv

그리고 가상환경으로 돌아가는 프로젝트 디렉토리를 만들어주고, 가상환경을 설정해줍니다.

$ mkdir myproject
$ cd myproject
$ virtualenv-3.4 venv
New python executable in venv/bin/python
Installing setuptools, pip...done.
$

가상환경을 활성화하기 위해서, 만들어준 venv 의 /bin/activate 를 실행시켜줍니다.

// 이렇게 하거나 
$ . venv/bin/activate

// source 로 활성화를 시켜주어요.
$ source venv/bin/activate

// deactivate 시키려면
$ deactivate

 

Install Flask

virtualenv 를 activate 해 둔 상태에서, 이제 Flask 를 설치해줍니다.

$ pip install Flask

사실 easy_install 로도 Flask 를 설치할 수 있죠.

$ easy_install pip

 

 

python, easy_install, pip, virtualenv, flask 의 설치를 마쳤습니다. 그외에 다른 라이브러리와 개발도구들도 설치를 했구요.

간단한 python application 을 만들어서 테스트해봅니다.

 

Simple python application

from flask import Flask
app = Flask(__name__)

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

if __name__ == '__main__':
    app.run()

virtual env 위에 pip 나 easy_install 로 Flask 가 install 되지 않은 상태라면 Flask 를 import 해 올 수 없습니다. 나중에 virtualhost 설정에서 다시 얘기가 나오긴 하지만, 저는 지금 virtualenv 위에서 python 을 돌리면서 Flask 를 해당 프로젝트에 설치해서 웹서버를 돌리려는 거죠.

이제 hello.py 를 python 인터프리터로 실행해봅니다.

# python hello.py
 * Running on http://127.0.0.1:5000/

127.0.0.1:5000, 로컬호스트 포트 5000번으로 웹 브라우저를 실행시켜보면, Hello World! 가 찍혀 있는걸 확인할 수 있습니다. 역시 헬로 월드는 짱!!

 

Deploy with WSGI and Apache

이제 apache 로 외부에서 접속 할 수 있게 Hello World! 를 찍어볼 차례네요.
WSGI 를 설치해봅시다. Web Server Gateway Interface 는, 파이썬 스크립트를 웹서버로서 동작할 수 있게 해주는 게이트웨이라고 보면 되겠지요.

mod_wsgi 를 설치합니다. 아파치 모듈 mod_wsgi 는 2.3 이상의 python 웹 애플리케이션 호스팅을 위한 WSGI 호환 인터페이스입니다.

# yum install -y mod_wsgi

제대로 설치가 되었다면, /etc/httpd/modules/mod_wsgi.so 에서 확인할 수 있습니다.

이제 wsgi 파일을 작성해줍니다. 이 wsgi 애플리케이션은 아파치 가상호스트에서 실행되며 파이썬 애플리케이션을 실행시켜줍니다. 아파치로 배포하기 위해, 파이썬 애플리케이션을 한번 감싸주는 구조가 되겠지요.

import sys
sys.path.insert(0, '/path/to/the/application')

activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

from hello import app as application


// 제 경우엔 /home/novafactory/test 경로로 지정을 해 볼게요
import sys
sys.path.insert(0, '/home/novafactory/test')

activate_this = '/home/novafactory/test/venv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

from hello import app as application

우리는 가상환경(virtual env)에서 실행시킬것이기 때문에, 코드 중간의 내용이 반드시 들어가야 합니다. virtual environment 에서 실행하지 않을것이라면 필요없는 문장이죠.

activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

이 코드는 해당 프로젝트에서(해당 프로젝트의 virtual environment 에서) Flask 를 찾아서 연결해줍니다. 우리는 Flask micro framework 로 웹서버를 만들고 있기때문에, 가상환경에 설치된(위에서 pip install Flask 로 설치한) Flask 가 꼭 필요합니다. 가상환경인 경우는 이런 방식으로 Flask 와 가상 호스트를 WSGI 애플리케이션으로 연결해줍니다.

이제 httpd.conf 파일에 virtual host 를 추가해줍니다. virtual host 기본 설정은 다루지 않아요. 이미 되어있다고 가정합니다.

<VirtualHost *:80>
    ServerName test.novafactory.net
    DocumentRoot /home/novafactory/test

    WSGIScriptAlias / /home/novafactory/test/test.wsgi
    WSGIScriptReloading On

    <Directory /home/novafactory/test>
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

다른 부분들은 기본적인 virtual host 설정과 크게 다르지 않습니다.
두 문장이 WSGI 에 관여하는데요.

  • WSGIScriptAlias: 위에서 만든 test.wsgi 를 설정해줍니다.
  • WSGIScriptReloading On: script(파이썬 스크립트 등)가 바뀌었다면 아파치 재배포없이 reloading 을 할 수 있습니다. (가끔씩 스크립트가 바뀌기 전 내용이 출력되기도 함)

httpd.conf 파일을 저장하고 아파치를 재시작해줍니다. CentOS 에서는 아래의 명령으로 아파치를 재시작 할 수 있습니다.

# service httpd restart

 

간단간단한 내용들을 합쳐놓으니 내용이 꽤 길어졌네요.
이제 실제로 apache 와 wsgi 를 통한 flask 로 만든 python 웹 애플리케이션이 잘 배포 되었는지 확인할 차례입니다.

test.novafactory.net

 

제 실제 도메인에 서브 도메인으로 test 를 사용해 연결해 보았습니다.
test.novafactory.net 에서 확인할 수 있습니다.

 

– P.S –
저는 virtualenv 관련해서 가상환경이기에 설정해 주어야 하는것들을 놓친다거나, ldconfig 을 실행해 주지 않아서 Shared library 를 찾지 못해 에러가 난다거나 하는 등의 삽질을 많이 했습니다.
삽집을 끝마친후(?) 생각하면 너무 당연한 것들인데, 꼭 처음할때는 놓치고 지나가게 되네요. ^^;

어쨋든 이제 기본 설정은 끝났습니다! 아파치와 wsgi 를 통한 배포도 해보았구요!! 그럼 이제 콘솔에서 작업 안하구 파이참에서 작업을 해봐야겠네요.

JetBrain 의 파이참은 프로패셔널 버전과 커뮤니티 버전으로 나뉘는데 커뮤니티 버전은 Flask 를 지원해주지 않아서, 프로패셔널을 트라이얼로 사용해보고 있습니다.  안드로이드 스튜디오에 길들여져서 그런지, 정말 사고 싶네요 🙂 일단 좀 더 써보고..

아직 파이썬 프로그램은 제대로 작성해보지도 않았다는게 함정 ㅋㅋ 지금까지는 설정만 했음. 으악.

8 thoughts on “Python, Flask, WSGI, Apache 설정 삽질 ㅠ on CentOS 6

  1. Pingback: buy fitflops

  2. Pingback: hoverboard

  3. Pingback: birkenstock australia clearance

  4. Pingback: Brazilian Virgin Hair

  5. Pingback: discount christian louboutin

  6. Pingback: 8 strap suspender belt ebay

  7. Pingback: homepage

  8. Pingback: Smart Balance Wheel

Leave a Reply