カテゴリー: Server

Python(bottle)をApacheで動かす

はじめに

以前、「配牌からアガれるかアガれないか予測する」を公開しました、tonnyです。
最近はもう少しスケールダウンさせて、何切る問題でディープラーニングを利用してみようと思っています。

データを収集するために、Webで公開してみようと思い、今回ブログ記事にまとめさせていただきます。
(以前はherokuで公開していたのですが、無料だと制約が大きかったので。。。)

環境

・CentOS 7.3.1611
・Python 3.6.1
・Apache 2.4.6
・bottle 0.13-dev

サーバーの立ち上げ

私のお試しサーバーであるConohaちゃんで構築しようと思います。

ユーザー作成などは以前の記事でまとめましたので、そちらをご参考ください。

Conohaのサーバーを借りて、CentOS+MySQL+nginxの環境を作ってみた。

[追記]
rootユーザーでPythonなどをインストールしないと、mod_wsgi絡みでエラーが起こるようなので、rootユーザーで進めました。
このあたりはちゃんと調査しないと。

Pythonのインストール

CentOS 7にはPython 2.7がデフォルトで入っているようですが、ローカルでは3系なので、3.6をインストールします。

こちらの記事を参考にさせていただきました。
Python 3 を CentOS 7 に yum でインストールする手順

IUS Community Project の yum リポジトリ

IUS Community Project という、最新のRPMパッケージを提供してくれる団体があるようなので、そちらからPython 3.6のyumリポジトリを追加させていただきます。

$ yum install -y https://centos7.iuscommunity.org/ius-release.rpm

Python 3.6を検索すると、ちゃんと見つかることが分かります。

$ yum search python36

インストール

$ yum install -y python36u python36u-libs python36u-devel python36u-pip

これで、Pythonがインストールされたので、バージョン確認しておきます。
ちなみに、オプションの`-V`は大文字です。

$ python3.6 -V
Python 3.6.1

このままでも良いのですが、デフォルトのpythonコマンドには2系のシンボリックリンクが貼られているので、こちらを3系に切り替えます。

$ ln -s /bin/python3.6 /bin/python3
$ unlink /bin/python
$ ln -s /bin/python3 /bin/python

これでpythonコマンドに3系が紐付きました。

$ python -V
Python 3.6.1

同様にして、pipコマンドのリンクも変えておきます。

$ ln -s /bin/pip3.6 /bin/pip
$ pip -V
pip 9.0.1 from /usr/lib/python3.6/site-packages (python 3.6)

Apacheのインストール

yumの修正

どうやらyum関連のファイルはPython2系で動いているようです。
そして、先ほどpythonコマンドを3系に紐付けたので、`yum`でコケるようになります。

これを回避するために、下記のファイルを修正しておきます。

  • /bin/yum
  • /usr/libexec/urlgrabber-ext-down

どこを修正するかというと、1行目の`#! /usr/bin/python`です。
こちらを下記のように2系で修正します。
お使いの環境によってはマイナーナンバーが違うかもしれません。
こちらのサイトを参考にさせていただきました。)

#! /usr/bin/python2.7

Apacheのインストール

$ yum -y install httpd

Apacheを起動させて、表示確認をしておきます。

$ systemctl start httpd

自動起動設定もしておきます。

$ systemctl enable httpd

WSGIを使用してPythonを動かす

WSGI(Web Server Gateway Interface)はWebアプリケーションからPythonを動かすインターフェースのことです。
What is WSGI?
こちらとApacheを連携させます。

こちらのサイトを参考にさせていただきました。
ApacheでPythonを動かしてみた(bottle利用)

各種インストール

`mod_wsgi`がApacheでPythonを動かすために必要なモジュールです。

$ 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

httpd.conf に追記

`/etc/httpd/conf/httpd.conf`に下記を追記し、Apacheを再起動します。

WSGIScriptAlias / /var/www/html/adapter.wsgi
$ systemctl restart httpd

adapter.wsgi を作成

テスト用に「Hello World!」を出力する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]

これで、ブラウザに再度アクセスして「Hello World!」が出力されれば成功です。

bottleとApacheの連携

軽量FWで有名なbottleを使用したいと思います。

bottleのソースファイルを取得

bottleはファイル1つのみですので、`wget`で取得してしまいます。

$ cd /var/www/html
$ wget http://bottlepy.org/bottle.py

adapter.wsgiの修正

先ほど作成した`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()

index.pyの作成

テスト用のPythonスクリプトを作成します。

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

@route('/')
def index():
    return "Hello from bottle"

if __name__ == '__main__':
    run(host='<ドメイン>', port=8080, debug=True, reloader=True)

これで、「Hello from bottle」が表示されれば、`index.py`が実行されていることが分かります。

さいごに

mod_wsgi周辺でかなり詰まりました。

今回は、テスト表示のみでしたが、実際にファイルを作成した場合にまた記事を書くことになりそうです。
本日はこのあたりで!

naoki85

シェア
執筆者:
naoki85

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

1か月 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前