今回はmixhostでCGIを使ってFlaskアプリケーションを動かすっていうことをやりたいと思います。Flaskのドキュメントにも書かれているCGIを使った方法です。
もし他のすべてのデプロイ手法で動かない場合、CGIは確実に動くでしょう。CGIはすべての主要なサーバでサポートされていますが、普通は性能的に最適化されていません。
ただレンタルサーバーは自由に色々コマンドを実行することができないので、anacondaを入れてやります。作るものアプリケーションはmysqlと接続してデータの入力と表示ができるものです。ではやっていこう。
mixhostではPythonが使える
mixhostではPython version2.7.5を実行することができる。
Pythonはサポート対象外となっておりますが、一部のサーバーを除き「Python version 2.7.5」が実行可能でございます。
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接続を使うといいでしょう。接続方法は以下の記事で紹介しているので参考にしてみてください。
アップロードしたフォルダ・ファイルは以下だけです。
├── 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でやってみてもいいかもしれません。