PythonのBottleを初めて触ってから３０分で本番環境にデプロイ

## 開発環境

* OS：CentOS release 6.8
* Apache：2.2.15 (Unix)
* Python 3.5.2
* mod_wsgi 4.5.6

# 環境構築（１０分）

ここからはサーバー上で作業していきます。

はじめに、CentOSで必要なパッケージをインストールします。

```bash
$ 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をインストールします。

```bash: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 もインストールします。

```bash: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 
```

# 開発環境で試してみる（５分）

Bottleがいかに速く開発環境を立ち上げられるかお見せします。

まず、Bottleのインストールです。
これはたった一行で完了します。

```bash:bottleのインストール
pip3.5 install bottle
```


`index.py` に以下を書き込み、サーバーを立ち上げるだけです。

```bash:作業ディレクトリへ移動
$ mkdir api
$ cd api
$ vim index.py
```

```py:index.py
from bottle import route, run, template

@route('/<name>')
def index(name):
    return template('<b>Hello {{name}}</b>!', name=name)

run(host='example.com', port=8000)
```

example.com の部分はお持ちのドメインもしくは、IPアドレスをお使い下さい。
※ 8000番ポートが空いている必要があります。

pythonのファイルを実行することで、サーバーが起動できます。

```
$ python3.5 index.py 
Bottle v0.12.10 server starting up (using WSGIRefServer())...
Listening on http://example.com:8000/
Hit Ctrl-C to quit.
```

ここで、「http://example.com:8000/ryosuke」にアクセスしてみます。


![スクリーンショット 2016-11-13 22.56.23.png](https://qiita-image-store.s3.amazonaws.com/0/130181/39781761-81ce-bb6c-d48d-f94cabcda912.png)


とても簡単に、サーバー構築までできました。
Bottle恐るべしです。


# 本番環境の構築

先ほどは、開発環境でしたが、Apacheを使って本番環境まで一気に構築していきます。

## Apacheの設定を変更後、Pythonとの疎通確認（５分）

Apacheの設定ファイルに追記

```bash:
$ sudo vim /etc/httpd/conf/httpd.conf
```

```bash:/etc/httpd/conf/httpd.conf
WSGIScriptAlias / /var/www/html/adapter.wsgi
```

```bash:Apacheを再起動させて変更を反映
$ sudo service httpd restart
```

疎通確認用の `adapter.wsgi` を作成します。

```py:/var/www/html/adapter.wsgi
def application(environ,start_response):
    status = '200 OK'
    output = b'Hello World!'
    response_header = [('Content-type','text/plain'),
                        ('Content-Length',str(len(output)))]
    start_response(status,response_header)
    return [output]
```

ApacheのWebサーバーが読めるように、権限を変更していきます。

```bash:権限の変更
$ chmod 755 adapter.wsgi
```

これで、IPアドレスにアクセスし、確認してみます。

![スクリーンショット 2016-11-13 23.29.47.png](https://qiita-image-store.s3.amazonaws.com/0/130181/e9d47425-cf49-da3b-686f-50b12a1d509e.png)


うまく行きました（ちょっと感動）。

## ApacheとBottleの連携（１０分）

本番環境用に `adapter.wsgi` と `index.py` を書き換えましょう。

```py:/var/www/html/adapter.wsgi
# coding: utf-8
import sys, os
import bottle

dirpath = os.path.dirname(os.path.abspath(__file__))
sys.path.append(dirpath)
os.chdir(dirpath)

import index
application = bottle.default_app()
```

```py:/var/www/html/index.py
# coding: utf-8
from bottle import route, run, template
from bottle import TEMPLATE_PATH

@route('/')
def index():
    return "Hello World! Bottle and Apache!"
run(host='example.com', port=80)
```

アクセスするディレクトリごと権限を変更しておきます。

```bash:
$ chmod -R 755 /var/www/html
```

これで、http://example.com にアクセスすると、以下のように動作していれば完成です。

![スクリーンショット 2016-11-13 23.38.42.png](https://qiita-image-store.s3.amazonaws.com/0/130181/85fb3bd6-5993-faed-d7fe-af91f77379bf.png)

Bottleは非常に簡単に扱うことができ、オススメできるフレームワークだなと思いました。
Djangoはデプロイで非常に苦しむので、小規模のAPIであればBottleがオススメです。

# おまけ

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

* Qiita: [Carat 吉崎](http://qiita.com/carat_yoshizaki)
* twitter：[@carat_yoshizaki](https://twitter.com/carat_yoshizaki)
* はてなブログ：[Carat COOのブログ](http://carat-tech.hatenablog.com/)
* ホームページ：[Carat](http://caratinc.jp)

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