bottleで動くPythonコードをApacheを使って公開する方法

テクノロジー

PythonでWebサービスを作りたい場合には、djangoを使うのが一般的だったかと思います。しかし、ごく簡単なPythonコードを動かす場合には、わざわざ機能豊富なフレームワークを使うまでもなく、もっとササッと使えるフレームワークとしてbottleを使う方法があります。これを使えば簡単にWebサービスとして起動できますが、Apacheを使って本番環境で起動する場合の手順の情報はあまり多くないように思います。個人的にmod_wsgiあたりで詰んだので、解消した手順を記します。

前提

  • 環境はさくらインターネットのVPS
  • Pythonのバージョンは3.6.3

手順

  1. とりあえずポート8080(Apache使用せず)で起動させる
    1. bottle超初歩入門の内容を実行
    2. 動作を確認
      • [code language="bash"]curl http://localhost:8080/hello/world[/code]
  2. bottleと動かしたいPythonコード(index.pyとする)を/var/www/htmlにコピー
  3. Apacheをインストールし、80ポートを開ける
    1. さくらのVPS講座第3回の「1. httpサーバーApacheをインストールする」
  4. Apacheと連携させる(Python(bottle)をApacheで動かすを参考にしました)
    1. mod_wsgiをインストール
      • [code language="bash"]yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel yum install -y httpd-devel python-devel gcc yum install -y mod_wsgi[/code]
    2. adapter.wsgiファイルを/var/www/html/adapter.wsgiとして作成
      • [code language="python"]# -*- 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()[/code]
    3. confファイルを/etc/httpd/conf.d/test.conf として作成(/etc/httpd/conf/httpd.confに下記のコードを追記しても良いが、/etc/httpd/conf/内の*.confファイルも別途読み込まれるので、Webサービスごとに分離したい)
      • [code language="bash"]touch /etc/httpd/conf.d/test.conf[/code]
    4. test.confファイルに次の内容を書き込んで保存
      • [code language="python"]LoadModule wsgi_module modules/mod_wsgi.so WSGIScriptAlias / /var/www/html/adapter.wsgi[/code]
  5. Apacheを再起動して動作確認
    • [code language="bash"]systemctl restart httpd[/code]

なおApacheに連携させた後は、/var/www/html/index.pyを明示的に実行しておく必要はありません(Apacheにリクエストがあると実行される模様)。またエラーログは/var/log/httpd/error_logに吐かれているので、うまくいかないときは参考にして下さい。私の環境ではbottleが見つからないというエラーが出ていたので、index.pyの始めに

[code language="python"]import sys
sys.path.append('/var/www/html')[/code]

を追記して、明示的にbottleの場所を指定しています。

なお、index.pyやbottle.pyをすべて/var/www/html直下に突っ込んでしまっています(root権限で)が、本当は別の場所に分離するべきだと思います。