araki tech

for developers including me

ConoHa WINGでPython Webアプリを動かすのは簡単だった

ConoHa WINGでPython Webアプリを動かすのは簡単だった

はじめに

今までさくらレンタルサーバを使ってきた私ですが、さくらレンタルサーバでもPythonのWebアプリを運用していました。

しかも、ピュアなPythonだけでなく、FlaskとNumPyを取り入れたアプリなのでなかなか一筋縄ではいかなった記憶があります。

そして先日、さくらからConoHa WINGにサイトを全て引っ越したのですが、まだPythonを使ったWebアプリの移行はしていなかったので、ブログでその手順を備忘録的に残しつつやっていこうと思います。

ConoHa WINGについては、下記にリンク貼っておきます。(思いきりアフィリエイトリンクですが…)

Python on ConoHa WING

既存の環境を確認してみる

まずはConoHa WINGに標準でインストールされているPython環境を確認してみましょう。

SSH接続して確認してみると… (ConoHa WINGでのSSH接続は[ConoHa WING] SSH 接続する方法が参考になります)

$ python -V
Python 3.6.11

Python 3.6がデフォルトで入っていますね。

そしてPython 3.4以上ではpipも一緒にインストールされるので、ConoHa WINGのPythonデフォルト環境ではpipも使えます。

ただ、レンタルサーバではpip intsallってパーミッションの関係でいつも通りには使えないことが多いですが…

$ pip -V
pip 20.2.4 from /opt/alt/python36/lib/python3.6/site-packages/pip (python 3.6)
 
$ pip install numpy
...
Installing collected packages: numpy
Successfully installed numpy-1.19.5
 
$ pip list
Package    Version
---------- -------------------
numpy      1.19.5
pip        20.2.4
setuptools 38.5.2.post20200320

あれ?

すんなりインストールできてしまった。。。

そうなると話は早い、このままデフォルトのPython環境でなんとかしよう。

ここで注意が必要なのは、pyenvとかはデフォルトでは存在しないので、アプリごとに環境を分けてしっかり構築したい人、もしくはPython 3.7以上が必要な人は別途作業が必要になるということ。

ここでは割愛しますが、Conoha WingでPythonを使う方法。 – ネビ活 | ネットビジネス生活の記事が参考になりそうです。

デフォルトのPythonで必要な環境を構築する

現在私が管理しているPythonのWebアプリはNumPyとFlaskしか使っていないのでこれらをインストールします。

$ pip install numpy flask

Flaskも特にエラー吐かれることもなくインストールできました。

index.cgiを作成する

Flaskを使ったアプリをレンタルサーバ上で運用したときに、app.pyのような.py拡張子のままだとPythonとして処理されずにプレーンテキストが表示されてしまいます。

さらに、単に.cgiにすれば良いというわけではなく、WSGI (Web Server Gateway Interface) というインターフェースを利用する必要があります。

そこで、WSGIを担うindex.cgiを作成し、その中でPythonを指定、どのPythonアプリを実行するか指定してあげます

例として以下のような感じです。

#!/opt/alt/python36/bin/python3.6
# -*- coding: utf-8 -*-

import cgitb

from wsgiref.handlers import CGIHandler
from app import app
from sys import path

cgitb.enable()


class ProxyFix(object):

    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        # 以下は要変更
        environ['SERVER_NAME'] = "neuron.hirlab.net"
        environ['SERVER_PORT'] = "80"
        environ['REQUEST_METHOD'] = "GET"
        environ['SCRIPT_NAME'] = ""
        environ['PATH_INFO'] = "/"
        environ['QUERY_STRING'] = ''
        environ['SERVER_PROTOCOL'] = "HTTP/1.1"
        return self.app(environ, start_response)


if __name__ == '__main__':
    CGIHandler().run(app)

ここで大事なのは、CGIアプリは先頭行にどのインタプリタを使うかを指定してあげることです。

今回はPython 3.6で、ConoHa WINGでは以下のようになります。

#!/opt/alt/python36/bin/python3.6

あと、index.cgiのパーミッションを変更するのを忘れずに。

$ chmod 755 index.cgi

あとは、同階層のapp.pyにFlaskアプリを普通に実装すればOKです。

ローカルで開発したものに変更を加える必要がないのは良いですよね。

私のPython Webアプリの例ですが、neuron.hirlab.netで確認できます。

ちょっとマニアックなWebアプリですが、しっかり裏でNumPyとFlaskが動いています。

なぜpip installできたのか

さて、ConoHa WINGではなぜデフォルトのPython環境でpip installできたのでしょう?

他の方が書いたブログを見ると「できない」と書いてあるブログがあるので、もしかしたら最近仕様が変わったのかもしれません。

Pythonのpip installした先を見てみると、

$ pip show numpy
Name: numpy
Version: 1.19.5
Summary: NumPy is the fundamental package for array computing with Python.
Home-page: https://www.numpy.org
Author: Travis E. Oliphant et al.
Author-email: None
License: BSD
Location: /home/xxxxxxx/.local/lib/python3.6/site-packages
Requires: 
Required-by: 

ホームディレクトリのローカル環境にインストールされていますね

どうやらデフォルトでインストール先がローカル環境 (--userオプションがデフォルトでON?) になっているために、pip installができたということですね。

これはConoHaさんナイスだと思いました。

まあ、pyenvとかは無いのでアプリごとに環境を管理したい人にはあまり関係ない話かもしれませんが…

ともかく私個人としては、そんなに大層なPython Webアプリを作らないので、デフォルト環境で十分です。

最後に

今回は簡単ではありますが、ConoHa WINGの環境でPythonアプリを動作させる方法を紹介しました。

結論としては、ConoHa WINGでPythonアプリを動作させるのは他レンタルサーバよりも簡単ということ。

さくらレンタルサーバ時代は、CMakeをローカルにインストールして、NumPyのソースをビルドして… とめちゃくちゃ苦労したなぁ。

みなさんもこれを機にConoHa WINGでPythonアプリ試してみませんか?