본문 바로가기
Dev/웹서버

CentOS에서 Flask 환경구축 (Anaconda, Apache, mod_wsgi)

by bsion 2018. 8. 18.


순서


1. Apache (httpd) 설치 - 내 웹서버를 전세계에 뿌려줄 모듈

2. Flask 설치

3. mod_wsgi 설치 - Apache와 Flask를 연결시켜줄 모듈

4. 연결작업

5. 확인




1. Apache 설치


CentOS 를 설치하면 Apache는 기본적으로 설치되어있는 경우가 많다.

[root@localhost ~]# httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Jun 19 2018 15:47:03


APache eXtenSion (apxs) 도 설치되어있는지 확인한다.

설치되어있지 않은경우 yum install httpd httpd-devel




2. Flask 설치


독립적인 python 환경을 위해 anaconda 혹은 virtualenv 로 가상환경을 만들어 작업하기를 권장한다. 예전에는 virtualenv 를 이용하였으나 이번에는 anaconda 로 환경구축을 해보기로 했다. 

anaconda 사용법 : http://chematdev.tistory.com/5


가상환경을 활성화 시킨후 pip install flask 로 설치한다.




3. mod_wsgi 설치


mod_wsgi 공식 홈페이지가서 소스코드 다운로드

https://pypi.org/project/mod_wsgi/


편하게 다운로드 링크를 복사하여 wget 한다. 그리고 압축해제한다.

[root@localhost Downloads]# wget https://files.pythonhosted.org/packages/9e/37/dd336068ece37c43957aa337f25c59a9a6afa98086e5507908a2d21ab807/mod_wsgi-4.6.4.tar.gz
[root@localhost Downloads]# tar xzvf mod_wsgi-4.6.4.tar.gz
[root@localhost Downloads]# cd mod_wsgi-4.6.4


configure 옵션에서 apxs 경로와 flask 에서 사용할 파이썬 경로를 설정한다. (기본 경로로 사용한다면 안써도 무방하다.)

향후 apache 가 구동될 때 여기서 설정해둔 파이썬 경로로 실행이 되기때문에 매우 중요한 부분이다.

[root@localhost mod_wsgi-4.6.4]# ./configure --with-apxs=/usr/sbin/apxs --with-checking for apxs2... no
checking for apxs... /usr/sbin/apxs
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for prctl... yes
checking Apache version... 2.2.15
configure: creating ./config.status
config.status: creating Makefile


정상적으로 완료되었다면 설치한다.

[root@localhost mod_wsgi-4.6.4]# make && make install
..
생략
..
chmod 755 /usr/lib/httpd/modules/mod_wsgi.so


설치가 제대로 되었다면 아파치 경로에 mod_wsgi.so 파일이 생성된다. (ls /etc/httpd/modules)




4. Apache와 mod_wsgi연결작업


Flask 를 구동시킬 디렉토리를 생성한다.

[root@localhost ~]# cd /var/www/
[root@localhost www]# mkdir FlaskHome
[root@localhost www]# cd FlaskHome/
[root@localhost FlaskHome]# mkdir FlaskApp


이 위치에서 mod_wsgi 가 읽어들일 파일을 만들고 아래 내용을 추가한다. vi flaskapp.wsgi

첫번째 줄은 가상환경의 파이썬경로이므로 본인에 맞는 경로를 쓴다.

마지막줄의 from FlaskApp 은 앞서만든 Flask를 구동시킬 디렉토리이름이 되겠다.

#!/home/shared/anaconda3/envs/Flask/bin/python
import sys

sys.path.insert(0,"/var/www/FlaskHome/")

from FlaskApp import app as application


아파치 설정

아파치 config 파일을 열어서 맨 아래에 virtual host 를 추가한다. vi /etc/httpd/conf/httpd.conf

<VirtualHost *:80>

    DocumentRoot /var/www/FlaskHome/

    LoadFile /opt/anaconda/envs/Flask/lib/libpython3.6m.so.1.0
    LoadModule wsgi_module modules/mod_wsgi.so
    WSGIScriptAlias / /var/www/FlaskHome/flaskapp.wsgi
    WSGIScriptReloading On

    <Directory /var/www/FlaskHome/FlaskApp/>
        Order deny,allow
        Allow from all
    </Directory>

    <Directory /var/www/FlaskHome/FlaskApp/static/>
        Order deny,allow 
        Allow from all 
    </Directory>

</VirtualHost>

위의 LoadFile 부분은 본인이 사용하는 파이썬경로에 있는 so 파일경로를 젛는다.


Flask 기본설정

향후 html 파일을 읽는 디렉토리인 templates 과 기타 파일들을 읽는 static 디렉토리를 행성하고 파이썬 init 파일을 만든다. (__init__.py 는 이 파일이 존재하는 디렉토리 (/var/www/FlaskHome/FlaskApp) 을 파이썬으로 실행시킬경우 제일먼저 읽게되는 파일이라 생각하면 된다. 패키지나 앱 형태로 만들때 반드시 필요한 파일)

[root@localhost ~]# cd /var/www/FlaskHome/FlaskApp
[root@localhost FlaskApp]# mkdir templates static
[root@localhost FlaskApp]# vi __init__.py
from flask import Flask
app = Flask(__name__)

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

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




5. Apache 작동확인


[root@localhost ~]# service httpd start


만약 이러한 permission 관련 오류가 발생한다면

[root@localhost FlaskApp]# service httpd start

Starting httpd: httpd: Syntax error on line 1015 of /etc/httpd/conf/httpd.conf: Cannot load 
/opt/anaconda/envs/Flask/lib/libpython3.6m.so.1.0 into server: /opt/anaconda/envs/Flas
k/lib/libpython3.6m.so.1.0: cannot open shared object file: Permission denied

                                                           [FAILED]


다음 명령어를 실행시킨다.

[root@localhost ~]# chcon -t textrel_shlib_t /opt/anaconda/envs/Flask/lib/libpython3.6m.so.1.0


SELinux 보안정책때문에 발생한다고 한다.


각종 권한문제는 SELinux 에서 발생한다고 생각하면된다. 나는 보안이 매우 중요한 서버가 아니기 때문에 SELinux 를 해제시켰다.


정상적으로 아파치가 실행되었다면 아이피를 통해 접속을 해본다. Internal Error 가 발생한다면 에러로그 파일을 확인한다 vi /etc/httpd/logs/error_log

댓글