今回はそんなことをやっていきます。以前Laravelアプリケーションや静的アプリケーションをエックスサーバーで動かすっていうことをやったけど、今回はFlaskを動かしていきたい。
ローカルでFlaskアプリケーションを作って、それをエックスサーバーに突っ込んで動かすっていうことをやっていく。ちょっと面倒なところもあるけど、まあやっていこう。
公開するFlaskアプリケーション
まずはエックスサーバーで公開するFlaskアプリケーションを作成しよう。今回はこの超シンプルなTODOアプリケーションをエックスサーバーで動かしたい。
とりあえず動けばいいやっていうノリで書いたからコードはグチャッているけど、エックスサーバーで動かせるかどうか試していきたい。
ちなみにPythonとFlaskのバージョンはそれぞれ以下です。
- Python・・・3.10.0
- Flask・・・2.0.2
このアプリケーションをエックスサーバーで動かしていきます。
エックスサーバーのスペックを見てみる
今回はFlaskだからPythonが必要ですよね。それとデータベースにはMysqlを使っているからMysqlが使えるか確認しないといけません。
PyhonもMysqlを使えるからいけそうですよね。
公開方法はCGI・FCGIを使う
Flaskでアプリケーションをローカルで動かす時には組み込みサーバーを使って、localhostでアクセスして確認するっていうことをやると思うけど、組み込みサーバーは本番環境に向かないので使いません。
軽量で簡単に使用できますが、規模の拡大・縮小をうまくはできないため、Flaskの組み込みサーバは本番環境のために適したものではありません。
ドキュメントにいくつか選択肢が書かれているけど、今回はCGIやFCGIあたりを使っていこうかなーと思います。エックスサーバーではCGIもFCGIも使える。
CGIファイルをちょっと書いて、.htaccessをちょっといじって画面を表示するようにしよう。
エックスサーバーにFlaskが動く環境を用意する
ここからは実際にエックスサーバーを使ってアプリケーションを公開するための作業をしていきます。もしどのプランを選んだらいいか分からなかったら、以下の記事を参考にしてみてください。
(エックスサーバーは10日間の無料期間があります)
Minicondaをインストールして作業する
Python関連で何か開発するときによく使うpipだけど、これをエックスサーバーでも使いたいです。だけどエックスサーバーのようなレンタルサーバーにはroot権限がないのでpipを使うことはできません。
調べるとLinuxbrew経由でPython(+pip)入れたりAnaconda(Miniconda)通してそこからpip入れたりといったものが出てくる。
LinuxBrewはHomebrewに統合されたから、使うとHomebrew使えよって怒られそうです。Miniconda使ってやります。
Minicondaをインストールする
Minicondaからインストーラーを取得できるからそこから入手する。取得するインストーラーだけどエックスサーバーのOSはLinuxなのでLinuxのものを取得。
インストーラーをダウンロードしたら、それをFTPソフトでエックスサーバーに繋いでアップロードします。
FTPソフトはCyberduckを使ってやっているけど、Cyberduck使う場合はエックスサーバーのCyberduckの設定を見てみてください。使うFTPソフトはなんでもいいです。
これでターミナルから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配下で色々行う感じですね。
.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アプリケーションが動いてくれました。
エックスサーバーでFlaskアプリケーションを動かすっていうことをやりましたが、CGIを使って動かすことができました。
Flaskアプリを動かすといってもレンタルサーバーでどこまでできるんだろう?って思うんじゃないかなと思います。
やってみないと分からない部分が多いはずなので、10日間無料期間のあるエックスサーバーで試してみるといいと思います。
本格的にプログラム扱うならVPSを使おう
レンタルサーバーであるエックスサーバーだとroot権限がないので、自由にいろいろインストールして環境を作るといったことができません。
なので、きちんと動く環境を作りたい場合はXserver VPSを使うのをお勧めします。