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

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

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

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

DBも使って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の組み込みサーバは本番環境のために適したものではありません

    展開の選択肢(Deployment Options)

    ドキュメントにいくつか選択肢が書かれているけど、今回は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を使うのをお勧めします。