mixhostでCGIを使ってFlaskアプリケーションを動かす【anaconda】

mixhostでFlaskアプリケーション動かしたいんだけど・・・
CGI使って動かすことできますよ。

今回はmixhostでCGIを使ってFlaskアプリケーションを動かすっていうことをやりたいと思います。Flaskのドキュメントにも書かれているCGIを使った方法です。

もし他のすべてのデプロイ手法で動かない場合、CGIは確実に動くでしょう。CGIはすべての主要なサーバでサポートされていますが、普通は性能的に最適化されていません。

CGI

ただレンタルサーバーは自由に色々コマンドを実行することができないので、anacondaを入れてやります。作るものアプリケーションはmysqlと接続してデータの入力と表示ができるものです。ではやっていこう。

mixhostでflask動かしてみよう。

mixhostではPythonが使える

mixhostではPython version2.7.5を実行することができる。

Pythonはサポート対象外となっておりますが、一部のサーバーを除き「Python version 2.7.5」が実行可能でございます。

RubyやPythonの利用可否について

Terminalから確かめてみるとちゃんとありますね。

他のpythonコマンド見てみてもpython2.7が実行されるようになっています。

今のPythonって3系が主流だと思うけど、2.7.5なら使うことができるようですね。ただ今回Flaskアプリケーションを動かすにあたってflask環境を作る必要があります。

root権限がないので自由にモジュールをインストールはできないので、anacondaを入れてやろうと思う。anacondaに入っているpythonを使ってやっていくから3系のpythonを使うよ。

CGIで動かすFlaskアプリケーション

今回mixhostで動かすFlaskアプリケーションはこれ。Todoアプリです。

単純にタスクを入力したらそれが画面に表示されるというもの。環境はどんな感じかというとこんな感じです。

使用しているimageは以下の2つ。

  • python:alpine
  • mysql:5.7

これで動いているアプリケーションをmixhostで動かしたいと思う。ただmixhostではdockerは使わないしCGIで動かすから使うファイルだけを使います。それとデータベースを使うので、mixhostでデータベースの作成もします。

mixhostに申し込む

もしまだmixhostに申し込んでいない場合は申し込んで使えるようにしましょう。おすすめはスタンダードプランです。

mixhostにドメインを追加する

どこから取得したドメインでもいいけど、mixhostに取得したドメインを追加します。アドオンドメインから追加できる。

ドメインを追加したらそのドメイン名のフォルダが作られる。

このフォルダにアプリケーションに必要なファイルを入れていくっていう流れです。

Flask環境を作る

root権限がないのでpipコマンドを使ってモジュールをインストールすることはできません。なので自分で環境を作ります。minocondaをインストールしようとしたけど失敗したので、anacondaでやります。

// pyenv
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
bashrcに記述
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
export TMPDIR="$HOME/tmp"
export PYTHON_PATH=./
eval "$(pyenv init -)"
$ source ~/.bashrc
$ pyenv install anaconda3-5.3.1

anacondaをインストールしたらパスを通します。

$ echo 'export PATH=/home/〇〇/.pyenv/versions/anaconda3-5.3.1/bin:$PATH' >> ~/.bashrc

これでコマンドが使えるから必要なものをインストール。flaskと今回はアプリケーションでpymysql使っているからそれも入れます。

$ conda install flask
$ pip install pymysql

pythonもanacondaの中に入っているからそのpythonを使ってやりましょう。

Flaskアプリケーションのファイルをmixhostにアップロードする

次はFlaskアプリケーションのファイルをmixhostにアップロードします。アップロードにはSFTP接続を使うといいでしょう。接続方法は以下の記事で紹介しているので参考にしてみてください。

アップロードしたフォルダ・ファイルは以下だけです。

app
├── index.py
└── templates
─ └── index.html

db接続して情報を取得するindex.pyと画面のindex.htmlですね。

CGIファイルを作成する

今回CGIを使うのでCGIファイルを作成します。作成する場所はpublic_html/ドメイン名フォルダ/app直下。

#! /home/iezkmtsu/.pyenv/versions/anaconda3-5.3.1/bin/python

from wsgiref.handlers import CGIHandler
from index import app
CGIHandler().run(app)

先頭にmixhostのpythonのパスを記述してCGIの記述を書けばOK。それとindex.cgiのパーミッションは0755にしておきます。

.htaccessを作成する

作成したCGIファイルに合わせてドメインフォルダの直下に.htaccessを作成して編集します。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /app/index.cgi/$1 [QSA,L]

mixhostでデータベースを作成する

Flaskアプリケーションからデータベースに接続するので、そのデータベースを作ります。cPanelからMysqlデータベースを選択。

好きなデータベース名を入力して[データベースの作成]をクリック。

作成されると追加されましたという表示がされます。

ユーザーも作りましょう。ユーザー名とパスワードを入力して[ユーザーの作成]をクリック。

ユーザーをデータベースに追加してユーザーに権限を与えます。

必要なテーブルを作成する

必要なテーブルがあるのでそれを作成しておきます。phpmyadminからユーザー名とパスワードを入力してログイン。

今回はmigrationファイルも特にないので、SQLを実行してtodosテーブルを作成しました。これでデータベースの設定は終わったので、次はアプリケーションの設定にいきましょう。

ファイルのデータベース接続情報を書き換える

mixhostで作成したデータベースにアクセスできるように、コードで書いているDBの接続情報を書き換えます。

  return pymysql.connect(
    host="localhost",
    db=作成したデータベース名,
    user="作成したユーザー名,
    password=作成したパスワード,
    charset='utf8',
    cursorclass=pymysql.cursors.DictCursor
  )

ドメインにアクセスして確認する

ドメインにアクセスして確認してみると、ちゃんと動きました。

ちょっと面倒だけど、CGI使えばこういったこともできなくはないですね。cgiファイル作ったり.htaccessいじったりしないといけないけど、pythonのアプリケーションを動かしたい人はmixhostでやってみてもいいかもしれません。