なろう分析記録

『小説家になろう』をふくめ『ネット小説投稿サイト』を分析する。コード置き場,主にPython,javascript,たまに創作。

pythonファイルをCGIとしてレンタルサーバー上でphp経由でCorn実行することで「500 Internal Server Error」を回避する方法

.pyファイルをCGIとしてそのまま実行するのには限界がある

レンタルサーバーなどでpythonが使用できるサーバーはそこそこあります。

ただし普通のやり方では重い処理や重いプラグインを呼び出す処理は「500 Internal Server Error」として処理を拒絶されたりします。

そんな時はphp経由で.pyを実行する方法が有効です。

ここではXREAサーバーを例に.pyphp経由CGIとして実行する方法を解説したいと思います。

f:id:karupoimou:20190521183208p:plain:w400
実行例


準備

f:id:karupoimou:20190521182200p:plain
必要なファイル

.htaccess」の作成

AddHandler cgi-script .py

.htaccessファイルを作成し上記の内容を記載して保存します。
この内容は「.pyはCGIとして扱う」という宣言です。

※なおwindows上で「.」を先頭にしてファイルを保存するためには「.htaccess.」と記載すればOKです。
qiita.com

各種ファイルの作成

今回は下記の3つのファイルを作成します。

test.py    メインのファイル
test.sh    アクセス権限など書く
test.php   アクセス先

以下、各ファイルの記述内容の説明。

test.py

#!/virtual/ユーザー名/.pyenv/versions/3.7.0/bin/python
# -*- coding: utf-8 -*-
print('Content-type: text/html; charset=UTF-8\n')

import pandas as pd

a = [1,2,4,2,5,2,1,3,2,1,9,4,5]
b = [7,6,6,5,4,4,5,6,7,7,5,6,6]

df = pd.DataFrame(a,b)

print(df)

test.sh

#!/bin/bash
DIR='/virtual/ユーザー名/public_html/test'
PYTHON='/virtual/ユーザー名/.pyenv/versions/3.7.0/bin/python'

cd ${DIR}
${PYTHON} test.py

test.php

<?php
$data = array();
exec("/virtual/ユーザー名/public_html/test/test.sh 2>&1", $data);

echo("<html><body><pre>");
var_dump($data);
echo("</pre></body></html>");

今回phpでは単純にpython実行時のログを表示するようにしています。

サーバーにアップロードし、ファイル属性を「705」にする

外部からのCorn実行を受け付ける際にはファイル属性を「705」にしておく必要があります(755でも可)

f:id:karupoimou:20190521182919p:plain:w400
属性変更

また各ファイルに記述しているファイルのパスについてご注意ください。
今回の例では最上部公開フォルダ「public_html」の中に「test」フォルダを作って4つのファイルを入れています。

実行

phpの場所をそのままブラウザのURLに打ち込めばOKです。

http://www.ドメイン名.com/test/test.php

f:id:karupoimou:20190521183208p:plain:w400
実行結果

その他

Cornの機能は大体のレンタルサーバーに付いていますが、もし付いていな場合は以下のサイトを使うことで代用できます。

cron-job.org

参考にしたページ

soudakyoto-ikou.hatenadiary.jp
レンタルサーバーでpythonで画像を作って自動ツイートするbotの作成について

errormaker.blog.fc2.com

qiita.com
XREAも基本CORESERVERと同じやり方でいけます。