Posted at

PythonのFlaskを初めて触ってから30分で本番環境にデプロイ+ HTTPS通信まで完成

More than 1 year has passed since last update.


はじめに

前回、Bottleで30分でデプロイ出来るところまで書き、Bottleは非常に扱いやすかったのですが、SSL通信をサポートするには cherrypy を使ったりと何かと面倒になってきたので、今度は Bottle と並んで軽量なPythonのWebフレームワークである 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 


これで http://example.com: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()


変更点は以上になります。

これで、https://example.com にアクセスしてみましょう。

見た目は同じですが、https://... で動作しているはずです。


まとめ

FlaskはBottle同様に軽量でありながら、SSL通信まで非常に簡単に実装することができました。

また、Bottleと比較すると、解説記事の数が雲泥の差というほど多いです。


おまけ

フォローお待ちしています!

サービス紹介

「数学→プログラミング→Webアプリケーション」まで一気に学べる機械学習のマンツーマン家庭教師サービス「キカガク」に興味のある方はお気軽にご連絡ください。