動的アプリケーションの構築といえば、AWSやGCP、Azure等のクラウドプラットフォームを使用するのがデファクト・スタンダードになりつつ今日。これらは多機能かつスケーラブルである一方、従量制サービスで為替影響もうけるなど、コストが張りがちなハイエンド環境と言えます。
他方、月額定額等で利用できるさくらのレンタルサーバ等でも、CGIの仕組みを使用して、データベースを使用した動的アプリケーションを構築可能です。
大きな負荷がかかる計算や大規模サービスには向いているわけではありませんが、何らかのケースにおける一つの選択肢としていただくべく、PythonによるCGIアプリケーション構築の手法とコツを共有します。
尚、CGIソフトウェアをレンタルサーバーで稼働させる経緯を紹介した下記関連記事も併せてご参考ください。
◇目次
環境の概要
さくらインターネット社などのレンタルサーバは、主にホームページ用サーバーとして利用されています。
これらサーバー環境に付帯しているコンピューティングやデータベース(MySQL)環境はWordPress用に利用される場合が多いですが、CGIの仕組みを使えば動的アプリケーションの構築が可能です。
AWSなどクラウドコンピューティングサービスに比べると、強力な処理能力や拡張性、保守性は前提とされていない反面、安価に使用できることがメリットと言えます。アプリケーションの性質を勘案してこの環境が向いていると思われる場合はこの記事が役に立つと思います。
利用開始はさくらのレンタルサーバ公式ぺージ(PR)からご登録ください。
- アクセス数が小規模なアプリ
- 計算負荷が小さいアプリ
- AWSなどを利用するにはオーバースペックと思われるアプリ
尚、さくらの公式サイトによると、データベース容量は次のようになっています。
注意:さくらのレンタルサーバを利用する場合は、スタンダードプラン以上が必須
環境構築にSSH接続を使用しますが、最安のライトプランはSSHが使用できません。(2022年10月現在)
ライトプランを利用中の場合は、プラン切り替えはできないので、一旦解約の上改めてさくらのレンタルサーバ公式(PR)から新規でスタンダード以上を利用開始する必要があります。
また、多少値段は上がりますが高い安定性を期待したい場合はエックスサーバー(PR)もオススメです。同等内容の作業をこなせば同じようにデプロイできると思われます。
ステップ1:環境構築(SSH接続~Python3.9のインストール)
多くのレンタルサーバーでプリインストールされているのはPython2系のため、Python3系で開発したい場合は独自でインストールする必要があります。
SSH接続でターミナルに直接コマンドを流していくことになります。
注意点として、さくらを含むレンタルサーバの多くではsudo権限が解放されていません。そのため、HOMEディレクトリを中心に作業していくことが必要です。
SSH接続
MacのターミナルやWindowsのコマンドプロンプトなどから、以下のコマンドを実行します。(Windowsの場合、バージョンが古いとSSHコマンドがない場合があります)
usernameにコンパネ接続のユーザー名、XXXXにサーバー番号を入替で入力してください。パスワードを要求されますので、コンパネと同じパスワードを入力します。
$ ssh username@wwwXXXX.sakura.ne.jp
ワーキング用ディレクトリを作成・移動
サーバーに接続出来たら、ホームディレクトリ下に作業ディレクトリを作成してインストール作業を行う場とします。
% cd ~
% mkdir wk
% cd wk
Pythonプログラムのダウンロード、展開
今回はPython3.9.15を使用します。ちなみにこの記事執筆時点での最新バージョンはPython3.10系ですが、こちらはOpenSSL1.0.2系が使用不可でさくらのデフォルト環境には適合しません。そこで今回は回避して3.9系をチョイスします。
% wget https://www.python.org/ftp/python/3.9.15/Python-3.9.15.tgz
% tar xvzf Python-3.9.15.tgz
Python3のインストール
~/local/pythonディレクトリにインストールします。
% cd Python-3.9.15
% ./configure --prefix=$HOME/local/python/ --with-system-ffi LDFLAGS="-L $HOME/local/lib/" CPPFLAGS="-I $HOME/local/include/"
% make
% make install
Python3へのパス通し
続いて.cshrcを編集してパスを通します。viで編集していきます。
% vi ~/.cshrc
該当行を見つけて次のように変更します。
~/.cshrc 変更前
set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin)
~/.cshrc 変更後
set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin $HOME/local/python/bin)
setenv PYTHON $HOME/local/python/lib
保存したら、変更を反映して完了です。
% source ~/.cshrc
% rehash
pip3でmysqlclientのインストール
ここまでで、Python3.9のインストールやpip3などへのパス開通が完了です。
今回はMySQLにアクセスするため、mysqlclientをインストールしておきます。
% pip3 install mysqlclient
トラブルシューティング:pipでエラー"the ssl module in Python is not available."が発生した場合
原因と解決
さくらの環境ではopensslはインストール済みのはずなので、利用できないというのなら別の要因があるはずです。
インストールしたPythonとopensslのバージョンの互換性がない可能性があります。本記事執筆時点のさくらのレンタルサーバの環境は次の通りでした。
% openssl version
OpenSSL 1.0.2o-freebsd 27 Mar 2018
例えばPython3.10ではOpenSSL 1.1.1が必須となっているため、この環境で動作させるにはOpenSSLのバージョンを上げるか、Pythonのバージョンを変更しましょう。
ステップ2:DB構築~テスト用のテーブルを作り値を入れる
今回はPythonのCGIからデータベースにアクセスするため、先に構築します。
データベース設定は、さくらのレンタルサーバのコントロールパネルからUIベースで操作していきます。
データベースができたら、phpMyAdminにアクセスします。アカウント情報は先ほど設定したユーザー名・パスワードで入れます。
ここではtest_tableというテーブルを作成、カラムはidとvalという2つを用意します。実験用にとりあえず3行挿入してみます。
SQL
INSERT INTO `test_table`
VALUES (1, 'aaaa'),(2, 'bbbb'),(3, 'cccc')
ステップ3:フォームとCGIを作成してDBアクセス、結果を動的表示
環境構築ができましたので、アプリケーションを組んでいきます。
次のようなファイルを設置していきます。
┗📁 cgi
┣ test-form.html --CGIにPOSTするためのフォーム
┗ post-action.cgi --POST内容を処理して動的表示
まずは送信側のフォームを作ります。こちらは静的で通常のHTMLファイルです。
cgi/test-form.html
<!DOCTYPE html>
<html lang="ja">
<title>CGIテスト</title>
</head>
<body>
<form method="POST">
IDを入力してね
<input type="text" name="id">
<input type="submit">
</form>
</body>
</html>
続いてCGIを作成します。POSTの値を受け取り、DBに問い合わせ、結果をHTMLで表示します。
1行目の「#!/home/XXXXXXXXX/local/python/bin/python3」は、実際にPython3をインストールしたディレクトリの絶対パスを指定します。XXXXXXXXXの部分に登録したユーザー名が入っていると思います。
post-action.cgi
#!/home/XXXXXXXXX/local/python/bin/python3
# -*- coding: utf-8 -*-
import sys, io, cgi, MySQLdb, traceback
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
#Form入力値受取
form = cgi.FieldStorage()
inputed_val = form['id'].value
#DB接続
connection = MySQLdb.connect(host='mysqlXXXX.db.sakura.ne.jp', user='XXXXX', passwd='XXXXXXXX', db='sakai3_cgi_test', charset='utf8')
try:
cursor = connection.cursor()
#SQL実行
sql = 'SELECT val FROM test_table WHERE id=%s'
cursor.execute(sql, [int(inputed_val)])
#結果セットから結果を取得
resultSet = cursor.fetchone()
result_val = resultSet[0]
#結果を表示
html = """Content-Type: text/html\n\n
<!DOCTYPE html>
<html lang="ja">
<hrad>
<meta charset="utf-8"/>
<title>CGIテスト結果</title>
</head>
<body>
<p>ポストされた値は%s</p>
<p>データベースから得られた値は、%sでした。</p>
</body>
</html>
"""
print(html % (inputed_val, result_val))
except Exception as e:
print('Content-Type: text/html\n\n<span>%s</span>' % traceback.format_exc())
finally:
connection.close()
ディレクトリ・ファイルのパーミッション設定
ファイル設置が終わったところで、一旦サーバー(Linux)に戻ります。chmodコマンドでCGIファイルの実行権限を付与する必要があります。
サーバー提供者が推奨の権限を提示している場合が多いので、それに従うのがよいでしょう。ここでは755権限を付与しています。
尚、ディレクトリにも同じ権限を付与するのをお忘れなく。
% cd ~/www
% chmod 755 cgi
% cd cgi
% chmod 755 post-action.cgi
準備完了、実行
設定がうまく行っていると、データベースから取得した結果が表示されます。
トラブルシューティング 500Internal Server Errorへの対処
CGI構築をしていくと、とにかく色々な理由で500がたくさん出ます。ログを見ながら対処していきましょう。
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator at [no address given] to inform them of the time this error occurred, and the actions you performed just before this error.
More information about this error may be available in the server error log.
対処の基本:ログの確認方法
さくらのレンタルサーバの場合、エラーログには次のように出力されます。
AH01215: suexec policy violation: see suexec log for more details
さくらの環境では頻出のエラーログです。このログは複数の要因で発生します。
ファイル権限によるエラー
chmodを行う工程を飛ばすとこのエラーが発生します。上記に設定方法を解説しています。
CGIファイルのエンコードをUTF-8に、改行コードをLFに
CGIファイルのエンコードや改行コードの影響で動作しない場合があります。(CRLFだと基本的に動作しません)
エディタの機能などを使用して改行コードをLFに変換しましょう。
1行目のPythonパス指定
環境にもよりますが、#!/usr/bin/env python式の記述方法が存在します。うまく行かない場合は書き換えを検討しましょう。
その他のエラー:通常のPython Syntaxエラー等もこのログフォームで確認できる
アプリケーションエラーについては適宜対処しましょう。
以上です。有難うございました。さくらのレンタルサーバの利用開始はこちらのバナーからどうぞ。(PR)
記事筆者へのお問い合わせ、仕事のご依頼
当社では、IT活用をはじめ、業務効率化やM&A、管理会計など幅広い分野でコンサルティング事業・IT開発事業を行っております。
この記事をご覧になり、もし相談してみたい点などがあれば、ぜひ問い合わせフォームまでご連絡ください。
皆様のご投稿をお待ちしております。