エックスサーバーでFlaskアプリケーションを公開する(Miniconda使う)

エックスサーバーでFlaskで作成したアプリを動かしたい

今回はそんなことをやっていきます。以前Laravelアプリケーションや静的アプリケーションをエックスサーバーで動かすっていうことをやったけど、今回はFlaskを動かしていきたい。

ローカルでFlaskアプリケーションを作って、それをエックスサーバーに突っ込んで動かすっていうことをやっていく。ちょっと面倒なところもあるけど、まあやっていこう。

DBも使ってFlaskアプリケーションが動くところまでやるよ

Flaskアプリケーションを作成する

まずはエックスサーバーで公開するFlaskアプリケーションを作成しよう。今回はこの超シンプルなTODOアプリケーションをエックスサーバーで動かしたい。 Flask初めて触ったんだけど、なんだかコンパクトにまとまっているフレームワークでいいですね。とりあえず動けばいいやっていうノリで書いたからコードはグチャッている。 Dockerで環境は作って使ったイメージはこちら。

  • python:alpine
  • mydql:5.7

アプリケーションのコンテナに入って確かめてみるとPythonのバージョンは3.10.0でした。flaskは2.0.2かな。

/app # python --version Python 3.10.0 /app # flask --version Python 3.10.0 Flask 2.0.2 Werkzeug 2.0.2

エックスサーバーのスペックを見てみる

今回はFlaskだからPythonが必要ですよね。それとデータベースにはMysqlを使っているからMysqlが使えるか確認しないといけません。

エックスサーバーで使用できるプログラム言語

よくある質問

PyhonもMysqlを使えるからいけそうですよね。

公開方法はCGI・FCGIにしようかな

Flaskでアプリケーションをローカルで動かす時には組み込みサーバーを使ってlocalhostでアクセスして確認するっていうことをやると思うけど、組み込みサーバーは本番環境に向かないので使いません。

軽量で簡単に使用できますが、規模の拡大・縮小をうまくはできないため、Flaskの組み込みサーバは本番環境のために適したものではありません

展開の選択肢(Deployment Options)

ドキュメントにいくつか選択肢が書かれているけど、今回はCGIやFCGIあたりを使っていこうかなーと思う。エックスサーバーではCGIもFCGIも使える。 CGIファイルをちょっと書いて、.htaccessをちょっといじって画面を表示するようにしよう。

高負荷なCGIスクリプトを使うのはやめよう

エックスサーバーの禁止事項にCGIの制限について書かれているところがあるから確認しておこう。 高負荷なCGIスクリプトの設置はできません。負荷が高そうだなと思ったら運用を見直したほうが良さそうですね。

エックスサーバーにFlaskが動く環境を用意する

Python関連で何か開発するときによく使うpipだけど、これをエックスサーバーでも使いたいです。だけどroot権限がないのでpipを使うことはできない。調べるとLinuxbrew経由でPython(+pip)入れたりAnaconda(Miniconda)通してそこからpip入れたりといったものが出てくる。 どうやってやろうか。。LinuxBrewはHomebrewに統合されたから、使うとHomebrew使えよって怒られそう。Miniconda使ってやりますかね。

Minicondaをインストールする

Minicondaからインストーラーを取得できるからそこから入手する。取得するインストーラーだけどエックスサーバーのOSはLinuxなのでLinuxのものを取得。

インストーラーをダウンロードしたら、それをFTPソフトでエックスサーバーに繋いでアップロード。

これはCyberduckを使ってやっているけど、Cyberduck使う場合はエックスサーバーのCyberduckの設定を見てみてください。 これでターミナルからSSHで接続してインストーラーを実行する。

SSH接続してインストーラーを実行する

SSH接続してインストーラーを実行したいです。SSH接続はエックスサーバーのSSH設定から設定をすることができる。

公開鍵認証の鍵も作ります。

生成されると自動で秘密鍵がダウンロードされるから、それを使ってエックスサーバーにSSH接続します。

$ chmod 600 ダウンロードした秘密鍵
$ ssh -i ダウンロードした秘密鍵へのパス サーバーID@ホスト名 -p 10022

コマンドを実行するとEnter passphrase for keyという風にパスフレーズが聞かれるから、設定したパスフレーズを入力すればOKです。サーバーIDとホスト名はそれぞれサーバーパネルトップとサーバー情報から確認することができる。

$ ssh -i 秘密鍵 サーバーID@ホスト名 -p 10022

接続したらインストーラーを実行。

$ sh Miniconda3-latest-Linux-x86_64.sh

色々問われるけど、画面に従って進めばインストールすることができる。インストール後に.bashrcを見てみるとminicondaのpathが記載されていますね。反映させます。

$ source .bashrc

これでPythonとpipを確認してみるとこんな感じ。pipもminiconda3ディレクトリの下にありますね。

ただFlaskはないからこれはインストールします。

$ conda install flask

flask入りました。

これで最低限の環境は整ったかな。

Flaskアプリケーションをエックスサーバーにアップロードする

flaskはインストールできたので、ローカルで作ったやつをエックスサーバーにアップロード。とりあえずappディレクトリごと突っ込みます。場所はpublic_html配下。

データベース設定する

今回のアプリケーションはこんな感じでpymysqlを使ってDB接続しているから、エックスサーバーのMysqlと接続できるようにする。

  return pymysql.connect(
    host="",
    db="",
    user="",
    password="",
    charset='utf8',
    cursorclass=pymysql.cursors.DictCursor
  )

MySQL設定から設定していこう。新たにデータベースとユーザーを作成して、そのユーザーに権限を与えます。

MySQLを追加します。

ユーザーも追加しましょう。

作成したユーザーにアクセス権を付与します。

これでPhpMyAdminに作成したユーザー名とパスワードでログインできるか確認しましょう。

ユーザー名とパスワードが聞かれるけど、さっき作成したユーザー名とパスワードを入力すればログインできるはず。ログインするとこんな画面になる。

クエリをここから実行することができるから、実際に使うテーブルをCREATE文で作っておきます。今回の場合todosテーブルが必要になるからtodosテーブルを作成。SeqelProで見れるものを打ち込むことにする。

これでテーブルはできたからそこにコードでアクセスできるようにしていこう。

コードに接続設定を記述する

今作成したデータベース名やユーザー名をコードに反映させる。

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

これでFlaskアプリケーションからエックスサーバーのMysqlに接続できるようになる。

必要なやつをインストール

今回mysqlへの接続にアプリケーションではpymysqlを使っているからそれをインストール。

$ conda install pymysql

これでアプリケーションから接続できるようになるはず。

CGI設定をする

今回はCGIで動かそうと思うんだけど、ディレクトリ構造はこんな感じでいきます。public_html配下で色々行う感じですね。

ドメイン名/public_html |--.htaccess |--app(flaskのアプリケーション) | |--index.cgi | |--index.py | |--templates | | |--index.html

.htaccess

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

RewriteRuleの/app/index.cgi部分は自分のアプリケーション名にしておこう。

app/index.cgi

#! /home/〇〇/miniconda3/bin/python

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

先頭はpythonが入っているパス。minicondaを使ったからminiconda配下にある。from index import appのindexは自分が作成したファイル名にしておきましょう。今回はindex.pyを参照したいからindexっていう指定をしている。 これでトップページにアクセスしたら、index.pyが参照されるはず。パーミッションは755にしておく。

文字コードに注意

htmlファイルがうまく動かずエラーになってしまった場合は文字コードを確認しよう。UTF-8にしておくといいんじゃないかな。

エックスサーバーのドメインで見れることを確認

URLにアクセスしてみるとちゃんと表示できました。画面いじってみるとこんな感じだ。

無事Flaskアプリケーションが動いてくれました。

 エックスサーバーはこのブログでも使っているよ

このブログは月間10万PVぐらいなんだけど、エックスサーバーで運営しています。簡単にプログラムも実行できるしWebサイトを公開することもできます。何かしたいことがあるならエックスサーバーおすすめですよ。