2022年10月22日

Flaskアプリケーションをレンタルサーバー(heteml)で公開するための手順をまとめてみました

レンタルサーバーはヘテムル(heteml)をよく利用しているのですが、この度とある要件のためPHPでは対応しづらく、Pythonで実装する機会がありました。

そのためにFlaskを導入したのですが、レンタルサーバーで、特にhetemlでFlaskを動作させるためにいくつか躓いたポイントがあったので、「FlaskをとりあえずレンタルサーバーでWEBアプリケーションとして公開したい」という方のために備忘として書いてみました。

hetemlはサーバー番号によって使えるPythonのバージョンなど異なる場合がありますので、ご使用の環境に合わせてご確認下さい。

この記事の対象
・Flask初心者
・Flaskをレンタルサーバーで公開したい方
・hetemlを利用している方

Pythonのバージョンを確認

ローカルで一通り開発が済んでいたので、いよいよhetemlで公開できるかどうかを試すために、まずはPythonのバージョンを確認します。振り返ればこの時点で既に罠が仕掛けられていました。

SSHで接続後、Pythonのバージョン確認のためのコマンドを打ってみます。

$ python --version
Python 2.7.5

あれ、バージョン2.7.5なのか、と思いつつ、気にせず作業を進めていたのですが、ローカルの開発環境ではPython3.7だったことから、「Python2系と3系の違いの壁」にぶつかりました。

形態素解析のMecabを使用していたのですが、文字列の型の違いによりローカルで動作していたプログラムがサーバー上ではエラーになってしまったのです。

「これはマズい」と思ってhetemlのマニュアルを確認したところ、Pythonは3系が利用できるようでした。

https://support.heteml.jp/hc/ja/articles/360042135454-CGI-SSI-PHP-sendmail

なんで自分の環境は2.7.5なんだろう、と思ってサポートに問い合わせしたところ、「python」というコマンドを「/usr/local/bin/python3.7」とすることで、Python3を利用できることがわかりました。

$ /usr/local/bin/python3.7  --version
Python 3.7.15

これに気付かずPython2系のままpipをインストールしてFlaskをインストールして。。。と進めてしまっていたため、かなり躓いてしまいました。

Python3でpipをインストール

無事にPython3で実行できることを確認できたので、改めてpipをインストールします。

$ wget https://bootstrap.pypa.io/get-pip.py
$ /usr/local/bin/python3.7 get-pip.py

pipのバージョンを確認してみます。

$ pip -v
-bash: pip: コマンドが見つかりません

あれ、インストールしたのに。。。ということで、別のコマンドで実行。

$ /usr/local/bin/python3.7 -m pip -v
Usage:
  /usr/local/bin/python3.7 -m pip  [options]
~~以下略~~

こちらは表示されました。どうやらパスが通っていないようでしたので、パスを通します。

$ ls ~/.local/bin
pip3  pip3.10  pip3.7

このようにpipがあれば、以下のコマンドでパスを通します。

$ export PATH=$PATH:~/.local/bin

その後、以下のコマンドで実行出来れば、バージョンを確認できます。

$ pip -v
Usage:
  /usr/local/bin/python3.7 -m pip  [options]
~~以下略~~

Flaskをインストール

ここまでくれば、もう少しです。以下のコマンドでFlaskをインストールしましょう。

$ pip install flask

Flaskのインストールが完了したら、まずは最小のファイル構成でFlaskの動作を確認してみましょう。

CGIでFlaskを動作させる最小構成

おそらく以下の3ファイルが、レンタルサーバーでCGIを使用したFlaskの最小構成だと思います。この3ファイルを、Flaskのアプリケーションを設置したいフォルダにアップロードして下さい。CGIファイルはパーミッションの設定が間違えていると500エラーになりますので、注意しましょう。また、pythonのパスやドメインなどは適宜編集して下さい。

index.cgi
※必ずパーミッションを「700」にして下さい

#!/usr/local/bin/python3.7

from wsgiref.handlers import CGIHandler
from app import app

import os

os.environ['SERVER_NAME'] = 'www.materialpot.com'
os.environ['SERVER_PORT'] = '443'
os.environ['REQUEST_METHOD'] = 'GET'

CGIHandler().run(app)

app.py

# -*- coding: utf-8 -*-
from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/', methods=['GET'])
def index():
    return 'hello world!'

if __name__ == '__main__':
    app.run()

.htaccess

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

  deny from all

これでアップロードしたURLにアクセスすると、app.pyが実行されて「hello world!」が表示されます。.htaccessでindex.cgiに集約し、app.pyで処理を実行、.pyファイルはアクセス出来ないようにする、といった設定になっています。

以上、Flaskアプリケーションをレンタルサーバー(heteml)で公開するための手順でした。

コメントを残す

メールアドレスが公開されることはありません。