CORESERVER V2でPythonのflaskを動作させる(後編)

前回はcoreserverでのpython環境構築とflaskパッケージの導入までを紹介しました。後編では実際にcoreserverでwebコンテンツを表示するまでをやってみたいと思います。

coreserverでpythonを動作させる

coreserverでpythonファイル(pyファイル)を認識させるためには、coreserverで認識可能なcgiをpyファイルで読込可能にする必要があります。V1では.htaccessに特定の記述をすればOKでしたが、V2でcoreserverの管理画面からファイルの紐づけ設定を行うことが出来るようになりました。

手順は、coreserverのマニュアルを参考にしてください。

https://help.coreserver.jp/manual/v2/apache-handler/

私はこのマニュアルを読まずに作業を進めていたので、気づくまでかなり悩んで作業をやってしまい時間が掛かってしまいました。

pythonプログラムを動作させる

作成したpythonプログラムを動作させるために、pythonプログラムを保存したディレクトリに、以下の.htaccessを配置します。今回は、index.pyにアクセスがあった場合に動作するように記述しています。

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

<Files ~ "\.py$">
    deny from all
</Files>

<追記>index.py 以外のpyファイルをピンポイントでアクセスできないようにするため、上記の.htaccessにpyファイルへのアクセスを禁止する記述<Files>のdeny設定を追加。
これをすることにより、pyファイルにアクセスすると「403 Forbidden」を返すようにセキュリティ対策しました。

動作させるpyファイルを作成

上記設定で、index.pyにアクセスすることが可能となるはずです。次にpythonプログラムでflaskを動作させる必要があります。index.pyを以下のように記述してください。

import cgitb
cgitb.enable()

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

1.2行目:Pythonスクリプトの例外処理を有効
4行目:Pythonを紐づけるハンドラーを設定
5行目:実行したいpythonファイルを設定
6行目:ハンドラーに実行関数を設定

これで、test.pyにあるapp関数が最初に実行されることになります。
サンプルでは、「Hello!」と表示されては動作OKです。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
  return "Hello!"

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

私が躓いた点

私が動作させるまでに、躓いた点は以下の2点。
coreserverだけの問題点かもしれませんが、紹介しておきます。

  1. アクセス権
  2. WEB画面が表示されない

アクセス権

最初に実行する、index.pyにはパーミッションに実行権限が必要となります。
index.pyは、755の権限を設定を行いアクセス可能とし、その他のpyファイルは外部からアクセス出来ないように、600の権限を設定することでセキュリティを確保する

WEB画面が表示されない

flaskで作成した機能で、NumPyやPandasをimportした時に画面が表示されない現象が発生しました。エラーメッセージも吐かないので原因が全く分からず作業が先に進めませんでしたが、いろいろ調査した結果、原因は、どうもWEBサーバのLiteSpeedがマルチスレッドに対応していないことではないかと思います。
起動のindex.pyに、マルチスレッドを無効することで対処することが出来ました。

import os
os.environ['OPENBLAS_NUM_THREADS']="1"

私の使用している商品や欲しい商品を紹介しています。ご参考にして頂けると幸いです。

https://touch-kun.net/2022/07/12/post-390/

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


上の計算式の答えを入力してください

CAPTCHA