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環境を作ってみたまとめ - 薮蛇なエンジニアの開発備忘録
- CentOS6.7
- Python 2.7.11
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とは連携していませんがApacheでPythonのファイルを表示することができました。
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の使い方について調べてまとめようと思います。