5. アプリを公開する

作成したウェブアプリケーションを世の中の人に使ってもらえるようにします。

Flaskをデプロイする方法

参考:Deployment Options — Flask 0.10.1 documentation

色々ありますが、私は以下の3つがおすすめです。

  • apache の mod_wsgi
  • uWSGI + nginx
  • PaaS: heroku, dotCloud

mod_wsgi

  • 簡単。
  • でも、遅い

詳細は省略!

こちらの記事がオススメです。

uWSGI + nginx

  • uwsgi(とgunicorn)はわりとよく使われていそうなWSGIサーバー。

  • nginxからstaticファイルを直接配信させたり、キャッシュを使ったりできます。

  • ただし、Linux, nginxに関する知識も必要となります。

  • uwsgiサーバーを自動起動・自動再起動するのに他の仕組みを使う必要があります。
    • supervisor, circusなど

手順

  1. uwsgiのインストールをします。:

    pip install uwsgi
    
  2. nginxをインストールして設定をします。:

    location = /flaskr { rewrite ^ /flaskr/; }
    location /flaskr { try_files $uri @flaskr;}
    location @flaskr {
        include uwsgi_params;
        uwsgi_param SCRIPT_NAME /flaskr;
        uwsgi_modifier1 30;
        uwsgi_pass unix:/tmp/uwsgi.sock;
    }
    
  3. /path/to/flaskrにflaskrディレクトリを置きます:

    /path/to/flaskr/
      |- flaskr/
         |- __init__.py
         |- ...
      |- manage.py
      |- requirements.txt
    
  4. /path/to/flaskrにvirtualenvで必要なライブラリをインストールした環境を作ります:

    cd /path/to/flaskr
    virtualenv env
    source env/bin/activate
    pip install -r requirements.txt
    
  5. uwsgiを実行します。:

    sudo -u nginx /path/to/uwsgi -s /tmp/uwsgi.sock --chdir /path/to/flaskr --exec-as-user nginx -H env --module flaskr --callable app
    

PaaS: heroku

今日はherokuにデプロイしてみます。

  • PaaSを使えば、linuxとかnginxとかを直接意識する必要がなくなります。
  • アプリの開発に集中できます。
  • ただし、PaaSの枠を外れることをしようとすると諦める or がんばる必要がある。

1. アカウントを作成

_images/heroku_1.png _images/heroku_2.png _images/heroku_3.png _images/heroku_4.png _images/heroku_5.png

2. ツールをインストール

次のURLから各自のOSに合わせたToolbeltをダウンロードしてインストールします。

インストールが完了したら、terminalからheroku login を実行してherokuにログインできることを確認します。:

$ heroku login
Enter your Heroku credentials.
Email: daisuke@dkpyn.com
Password (typing will be hidden):
Found existing public key: /Users/daisuke/.ssh/id_rsa.pub
Uploading SSH public key /Users/daisuke/.ssh/id_rsa.pub... done
Authentication successful.

3. heroku用にファイルを変更

開発環境にgunicornをインストールします。:

pip install gunicorn

requirements.txtにgunicornを追加します。

requirements.txt

Flask
Flask-SQLAlchemy
Flask-Script
gunicorn

Procfileを追加する。

Procfile

web: gunicorn flaskr:app

Herokuのアプリを起動するForemanで起動のテスト:

$ foreman start
01:19:17 web.1  | started with pid 2062
01:19:17 web.1  | 2013-11-04 01:19:17 [2062] [INFO] Starting gunicorn 18.0
01:19:17 web.1  | 2013-11-04 01:19:17 [2062] [INFO] Listening at: http://0.0.0.0:5000 (2062)
01:19:17 web.1  | 2013-11-04 01:19:17 [2062] [INFO] Using worker: sync
01:19:17 web.1  | 2013-11-04 01:19:17 [2065] [INFO] Booting worker with pid: 2065

4. gitリポジトリを作成

作成しているflaskrをgitで管理するようにします。すでに作っていたらそのままでOK:

cd Flaskrを作成しているディレクトリ
echo '*.pyc' > .gitignore
git init
git add .
git commit -m 'init'

4. herokuのアプリを作成

heroku createでアプリを作成します。:

$ heroku create
Creating peaceful-wildwood-3278... done, stack is cedar
http://peaceful-wildwood-3278.herokuapp.com/ | git@heroku.com:peaceful-wildwood-3278.git
Git remote heroku added

自動でgitにremoteが追加されます。

5. herokuにpush

git push heroku master

ウェブのプロセスを0から1に設定:

$ heroku ps:scale web=1
Scaling web dynos... done, now running 1

プロセスの状態の確認:

$ heroku ps
=== web (1X): `gunicorn flaskr:app`
web.1: up 2013/11/04 01:24:53 (~ 52s ago)

7. 動作を確認

heroku createのときに表示されたURLで確認する。

わからなければ、herokuにログインしてappsのsettingsで確認する。

あとはgit remote -vでみるとか。 (herokuはあまり使ったことないので知ってる人いたら教えてー!:

git remote -v
heroku  git@heroku.com:gentle-beyond-1917.git (fetch)
heroku  git@heroku.com:gentle-beyond-1917.git (push)

8. uwsgi

ここではgunicornを使いましたが、uwsgiを使ってもできます。