Python의 Flask를 처음 만진 후 30분 만에 프로덕션 환경에 배포 + HTTPS 통신까지 완성

소개



전회, Bottle로 30분에 배포할 수 있는 곳까지 써, Bottle은 매우 취급하기 쉬웠습니다만, SSL 통신을 서포트하려면 cherrypy 나란히 가벼운 Python 웹 프레임 워크인 Flask를 사용합니다.

개발 환경


  • OS: CentOS release 6.8
  • Apache: 2.2.15 (Unix)
  • Python 3.5.2
  • mod_wsgi 4.5.6

  • 환경 구축부터 Hello Flask!까지(5분)



    이쪽은 로컬(수중의 Mac)로 작업을 해 갑니다.
    $ pip3 install flask
    

    app.py
    # coding: utf-8
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/")
    def hello():
        return "Hello, Flask!"
    
    if __name__ == "__main__":
        app.run()
    

    서버 시작
    $ python3 app.py
    

    브라우저에서 로컬 호스트로 "http://127.0.0.1:5000”으로 이동합니다.



    Bottle과 마찬가지로 매우 쉽습니다.
    이번에는 DB의 조작이나 템플릿에 대해서는 언급하지 않지만 물론 그들도 모두 지원하고 있습니다.

    프로덕션 환경에서 https 통신까지



    여기에서 서버에서 작업합니다.

    환경 구축(10분)



    시작하려면 CentOS에 필요한 패키지를 설치합니다.
    $ sudo yum groupinstall "development tools"
    $ sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
    $ sudo yum install  httpd-devel python-devel
    

    그리고 python3.5 시스템과 패키지 관리 도구 pip을 설치합니다.

    python3.5 및 pip3.5 설치
    $ sudo su # rootで操作していきます
    $ cd /usr/local/src
    $ wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz
    $ tar zxvf Python-3.5.2.tgz
    $ cd Python-3.5.2
    $ ./configure --enable-shared
    $ make && make altinstall
    $ ln -s /usr/local/bin/python3.5 /usr/bin/python3
    $ ln -s /usr/local/lib/libpython3.5m.so.1.0 /lib64/
    $ python3.5 --version  # 最後にバージョンの確認ができればpythonのインストール完了
    Python 3.5.2
    # 同時にpip3.5もインストールされるので、シンボリックリンクを貼る
    $ ln -s /usr/local/bin/pip3.5 /usr/bin/pip3.5
    $ pip3.5 --version
    pip 8.1.1 from /usr/local/lib/python3.5/site-packages (python 3.5)
    

    프로덕션 환경에서 Apache와 함께 작동하는 데 필요한 mod_wsgi도 설치합니다.

    mod_wsgi 설치
    $ cd /usr/local/src
    $ wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.5.6.tar.gz
    $ tar zxvf 4.5.6.tar.gz
    $ cd mod_wsgi-4.5.6
    $ ./configure --with-apxs=/usr/sbin/apxs --with-python=/usr/local/bin/python3
    $ make && make install
    $ chmod 755 /etc/httpd/modules/mod_wsgi.so 
    

    임베디드 서버에서 Flask 동작 확인(5분)



    환경이 갖추어졌으므로, 우선은 Flask의 임베디드 서버로 동작 확인할 수 있는 곳까지를 해설해 갑니다.

    Flask 설치
    $ pip3.5 install flask
    

    /var/www/html/app.py
    # coding: utf-8
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/")
    def hello():
        return "Hello, Flask!"
    
    if __name__ == "__main__":
        app.run(host="example.com", port=8000)
    

    임베디드 서버 시작
    $ python3.5 app.py 
    

    이제 ぁ tp : // 에어 mpぇ. 코m:8000에 액세스합니다.



    여기까지는 OK입니다.

    Apache와 mod_wsgi로 프로덕션 서버 구축(10분)



    Apache 구성 파일을 편집합니다.

    /etc/httpd/conf.d/flask.conf
    # http通信はhttps通信へ強制リダイレクト
    <VirtualHost *:80>
      ServerName example.com:80
      RewriteEngine on
      RewriteCond %{HTTP_HOST} ^example\.com
      RewriteRule ^/(.*)$ https://example.com/$1 [R=301,L]
    </VirtualHost>
    # https通信の設定はこちら
    <VirtualHost *:443>
      SSLEngine on
      SSLProtocol all -SSLv2
      SSLCertificateKeyFile   /etc/httpd/conf/ssl.key/server.key
      SSLCertificateChainFile /etc/httpd/conf/ssl.crt/internal.crt
      SSLCertificateFile      /etc/httpd/conf/ssl.crt/server.crt
      DocumentRoot /var/www/html/api
      ServerName example.com:443
      CustomLog /var/www/html/access.log common
      ErrorLog  /var/www/html/error.log
      AddDefaultCharset UTF-8
      WSGIScriptAlias / /var/www/html/adapter.wsgi
      <Directory "/var/www/html/">
        options Indexes FollowSymLinks +ExecCGI
      </Directory>
    </VirtualHost>
    

    Apache 재부팅
    $ sudo service httpd restart
    

    SSL 통신의 열쇠나 설정에 관하여 불명한 점이 있는 분은, 「 사쿠라 VPS에 SSL 인증서를 도입하여 HTTPS 통신 구축 」로 쓰고 있으므로, 이쪽을 봐 주세요.

    wsgi 파일을 편집합니다.

    /var/www/html/adapter.wsgi
    # coding: utf-8
    import sys
    sys.path.insert(0, '/var/www/html')
    
    from app import app as application
    

    다음에, 조금 정도의 app.py 도 프로덕션 환경에 맞추어 다소 변경합니다.

    /var/www/html/app.py
    # coding: utf-8
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/")
    def hello():
        return "Hello, Flask!"
    
    if __name__ == "__main__":
        app.run()
    

    변경점은 이상입니다.
    이제 htps : // 에아 mpぇ. 이 m 에 액세스해 봅시다.



    외형은 동일하지만 https://...에서 작동해야 합니다.

    요약



    Flask는 Bottle처럼 가볍지만 SSL 통신까지 매우 쉽게 구현할 수있었습니다.
    또한 Bottle과 비교하면 해설 기사의 수가 구름 진흙의 차이라고 할 정도로 많습니다.



    따라 기다리고 있습니다!
  • Qiita: Carat 요시자키
  • twitter: @에서 t_ 요시자키
  • 하테나 블로그 : Carat COO 블로그
  • 홈페이지: Carat

  • 서비스 소개
    「수학→프로그래밍→Web어플리케이션」까지 단번에 배울 수 있는 기계 학습의 맨투맨 가정 교사 서비스 「키카가쿠」에 흥미가 있는 분은 부담없이 연락해 주세요.

    좋은 웹페이지 즐겨찾기