ApacheでPythonを動かしてみた(bottle利用)

概要

前の記事ではPythonプログラムをサーバに公開するためにApacheを利用しました。

(前の記事→ApacheでPythonを動かしてみた(mod_wsgiをソースからインストール) - 薮蛇なエンジニアの開発備忘録

しかし少し調べてみると、Pythonは自前でWEBサーバ機能を持っているらしくミドルウェア無しでもサーバとして公開できるようでした。またbottleというシンプルなフレームワークを使えばURLルーティングなども分かりやすくできるようです。…そんな簡単にできたなんて!

とはいえサーバ用ミドルウェアを使っておいた方が安定すると思うので、Apacheでbottleフレームワークを利用する方法について調べてみました。

これで、自分がやりたかった「Pythonでプログラム書いてサーバに公開する」ためのインフラがほぼできたと思います。

前提

Pythonはpyenvでインストール済みで、ApacheなどのWEBサーバは未インストール状態を想定しています。また、OSとPythonは以下の前提です。

Pythonのインストール方法:CentOSにPython環境を作ってみたまとめ - 薮蛇なエンジニアの開発備忘録

bottleでサーバ公開

apacheをインストールする前に、bottleだけでサーバを公開してみます。

bottleのセットアップ

bottleは1ファイルで構成されていて、それを参照したpythonファイルを実行すればサーバを起動できるようです。ほぼ公式のサンプルで起動してみます。

(参考サイト:Bottle: Python Web Framework — Bottle 0.13-dev documentation

mkdir hoge
cd hoge
wget https://raw.githubusercontent.com/bottlepy/bottle/master/bottle.py

vim index.py

from bottle import route, run, template

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

run(host='【サーバのIPアドレス】', port=8080)

python index.pyで実行。

http://【サーバのIPアドレス】:8080/hello/world へブラウザからアクセスするとHello world!と表示されました。

Apacheのインストール

必要なパッケージをインストールします。 前の記事ではPython用モジュールのmod_wsgiをソースからインストールしましたが、yumでインストールしたら簡単にできたので今回はその方法にします。

yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
yum install -y httpd-devel python-devel
yum install -y mod_wsgi
pip install --upgrade pip

Apache設定ファイルに追記。

vim /etc/httpd/conf/httpd.conf

WSGIScriptAlias / /var/www/html/adapter.wsgi

pythonファイルを作成

vim /var/www/html/adapter.wsgi

def application(environ,start_response):
    status = '200 OK'
    output = 'Hello World!'
    response_header = [('Content-type','text/plain'),
                        ('Content-Length',str(len(output)))]
    start_response(status,response_header)
    return [output]

これでApacheを再起動してサーバにアクセスすれば、まだbottleとは連携していませんがApachePythonのファイルを表示することができました。

Apacheとbottleを連携

Apacheと連携するためには、mod_wsgiを使って表示するpythonファイルからbottleアプリケーションを呼び出すらしく、bottle呼び出し元のことをアダプターと言ようです。

(参考サイト:Apache + mod_wsgiでBottleフレームワークのアプリケーションを動かす - Symfoware

Apacheの動作確認に作っておいたadapter.wsgiの内容を以下で置き換えます。

vim /var/www/html/adapter.wsgi

# -*- coding:utf-8 -*-
import sys, os
dirpath = os.path.dirname(os.path.abspath(__file__))
sys.path.append(dirpath)
os.chdir(dirpath)
import bottle
import index
application = bottle.default_app()

先ほどはbottleのファイルを適当なディレクトリに置いたので、adapterと同じ階層へ移動します。 また、bottleで表示用のpythonファイルを作成します。

mv ~/hoge/bottle.py /var/www/html/bottle.py
vim /var/www/html/index.py

vim index.py

# -*- coding:utf-8 -*-
from bottle import route, run, template
from bottle import TEMPLATE_PATH

@route('/')
def index():
    return "HELLO WORLD!"

if __name__ == '__main__':
    run(host='0.0.0.0', port=8080, debug=True, reloader=True)

念のためApacheを再起動してhttp://【サーバのIPアドレス】へブラウザからアクセスするとHELLO WORLD!が表示されました。

まとめ

Python用のbottleというフレームワークApacheで動かすことができました。 ただ、調べてる間にPython用Webサーバはnginxが定番のような印象を受けました。 そちらも後で調べるとして、とりあえず直近で次回はbottleの使い方について調べてまとめようと思います。