Python3+CGI+データベースの動的サイトをさくらのレンタルサーバで構築

記事イメージ

動的アプリケーションの構築といえば、AWSやGCP、Azure等のクラウドプラットフォームを使用するのがデファクト・スタンダードになりつつ今日。これらは多機能かつスケーラブルである一方、従量制サービスで為替影響もうけるなど、コストが張りがちなハイエンド環境と言えます。

他方、月額定額等で利用できるさくらのレンタルサーバ等でも、CGIの仕組みを使用して、データベースを使用した動的アプリケーションを構築可能です。

大きな負荷がかかる計算や大規模サービスには向いているわけではありませんが、何らかのケースにおける一つの選択肢としていただくべく、PythonによるCGIアプリケーション構築の手法とコツを共有します。

尚、CGIソフトウェアをレンタルサーバーで稼働させる経緯を紹介した下記関連記事も併せてご参考ください。

関連記事:【CGI】昔のPerl製CGIをレンタルサーバーで動かしてみたので、その公開手順を共有

環境の概要

さくらインターネット社などのレンタルサーバは、主にホームページ用サーバーとして利用されています。

これらサーバー環境に付帯しているコンピューティングやデータベース(MySQL)環境はWordPress用に利用される場合が多いですが、CGIの仕組みを使えば動的アプリケーションの構築が可能です。

AWSなどクラウドコンピューティングサービスに比べると、強力な処理能力や拡張性、保守性は前提とされていない反面、安価に使用できることがメリットと言えます。アプリケーションの性質を勘案してこの環境が向いていると思われる場合はこの記事が役に立つと思います。

利用開始はさくらのレンタルサーバ公式ぺージ(PR)からご登録ください。

レンタルサーバーが向いているアプリの例
  • アクセス数が小規模なアプリ
  • 計算負荷が小さいアプリ
  • AWSなどを利用するにはオーバースペックと思われるアプリ

尚、さくらの公式サイトによると、データベース容量は次のようになっています。

・スタンダード3GB
・プレミアム4.5GB
・ビジネス8GB
・ビジネスプロ12GBです。

引用:データベースの作成・追加・削除・パスワード再設定をしたい

注意:さくらのレンタルサーバを利用する場合は、スタンダードプラン以上が必須

環境構築に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."が発生した場合

pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
SSLが使用できず、インストールがエラーで終了する場合があります。
SSLが使用できず、インストールがエラーで終了する場合があります

原因と解決

さくらの環境ではopensslはインストール済みのはずなので、利用できないというのなら別の要因があるはずです。

インストールしたPythonとopensslのバージョンの互換性がない可能性があります。本記事執筆時点のさくらのレンタルサーバの環境は次の通りでした。


% openssl version
OpenSSL 1.0.2o-freebsd  27 Mar 2018

例えばPython3.10ではOpenSSL 1.1.1が必須となっているため、この環境で動作させるにはOpenSSLのバージョンを上げるか、Pythonのバージョンを変更しましょう。

【社内PR】チーム・ウォーク

ステップ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アクセス、結果を動的表示

環境構築ができましたので、アプリケーションを組んでいきます。

次のようなファイルを設置していきます。

www(publicルート)
┗📁 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がたくさん出ます。ログを見ながら対処していきましょう。

Internal Server Error
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.
internal-server-error

対処の基本:ログの確認方法

さくらのレンタルサーバの場合、エラーログには次のように出力されます。

さくらのコンパネからログを見に行く経路
さくらのコンパネからログを見に行く経路
さくらのコンパネから確認したログ
さくらのコンパネから確認したログ

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)

(PR)

記事筆者へのお問い合わせ、仕事のご依頼

当社では、IT活用をはじめ、業務効率化やM&A、管理会計など幅広い分野でコンサルティング事業・IT開発事業を行っております。

この記事をご覧になり、もし相談してみたい点などがあれば、ぜひ問い合わせフォームまでご連絡ください。

皆様のご投稿をお待ちしております。

記事筆者へ問い合わせする

※ご相談は無料でお受けいたします。

この記事へのコメント

ニックネーム(任意)

返信通知先Emailアドレス(任意)

本文


* 感想やご意見等、お気軽にコメントください。但し、公序良俗に反するコメントはお控えください。
* 管理者が承認したコメントはこの箇所に公開させていただく可能性がございます。
* 返信通知先Emailアドレスは、筆者のみに通知され、公開されることはありません。返信通知先Emailを入力された場合は、コメントへの返信をこちらに掲載した際に通知させていただきます。その他の目的には使用いたしません。
* スパム対策のため、コメントは日本語のみ受け付けております。

堺財経電算合同会社 小規模IT構築サービス