Help us understand the problem. What is going on with this article?

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

More than 3 years have 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」にアクセスします。

スクリーンショット 2016-11-14 1.30.03.png

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 へアクセスします。

スクリーンショット 2016-11-14 1.39.17.png

ここまでは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 にアクセスしてみましょう。

スクリーンショット 2016-11-14 2.13.32.png

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

まとめ

FlaskはBottle同様に軽量でありながら、SSL通信まで非常に簡単に実装することができました。
また、Bottleと比較すると、解説記事の数が雲泥の差というほど多いです。

おまけ

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away