Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
168
Help us understand the problem. What is going on with this article?
@yoshizaki_91

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アプリケーション」まで一気に学べる機械学習のマンツーマン家庭教師サービス「キカガク」に興味のある方はお気軽にご連絡ください。

168
Help us understand the problem. What is going on with this article?
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
yoshizaki_91
株式会社キカガク代表取締役の吉崎です。 人工知能・機械学習を初学者向けに無料で学べる『脱ブラックボックスコース』を提供しています。
kikagaku
教育の力で社会により良い変革を与えるため、AIを始めとする先端技術に関する教育とコンサルティングを行っています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
168
Help us understand the problem. What is going on with this article?