経緯
- デスクトップのWindows10がぶっとんだ
- Djangoが使えなかった
- でもでもWebアプリっぽいの作りたい!
そうだ!CGIにしよう!
というなんとも情けない経緯で始めることになりました。
実際にやってみると微妙なところで結構詰まったりしたので___この通りにすればとりあえずは動くはず___と言うのを紹介していきます。
前準備
- サーバに固定IPアドレスを割り当てる
- 自宅であればルーター設定から割り当てられるはず
- 携帯とか会社はわかんない
- ネットワークをDDNSと紐付ける(MyDNS.JPの説明)
- 117.125.xxx.xxxとかでアクセスするのダサい
- グローバルIPアドレスを晒すことになり非常に危険
- なんかそれっぽくなる
- Python3をインストール済み
Apache2の準備
インストール
sudo apt install apache2
これ一行で問題なし。
UbuntuServerの導入時に「LAMP Server」を選択していればインストールはすでに終わっているので無視して構わない。
cgiモジュールの有効化
user@hostname:~# sudo a2enmod cgid
Enabling module cgid.
To activate the new configuration, you need to run:
systemctl restart apache2
user@hostname:~# sudo systemctl restart apache2
有効化が正常に完了していれば/usr/lib/cgi-bin
がドCGIのドキュメントルートとして認識されます。
このままでは通常のドキュメントルート/var/www/html
と場所が違いすぎて面倒なのでドキュメントルートの変更を行う。
ドキュメントルートの変更 #任意
新規ファイルを作成する。
user@hostname:~# sudo vi /etc/apache2/conf-available/cgi-bin.conf
内容は
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
Options +ExecCGI
AddHandler cgi-script .cgi .py
</Directory>
作成できたら設定ファイルをApache2に認識させる必要がある。
user@hostname:~# mkdir /var/www/cgi-bin
user@hostname:~# sudo a2enconf cgi-bin
Enabling conf cgi-bin.
To activate the new configuration, you need to run:
service apache2 reload
user@hostname:~# sudo systemctl restart apache2
##コーディングの注意点
- Shebangの記入は必須
- ないと正常に認識されない
- 開発環境とサーバで環境が変わる場合はShebangの変更を忘れない
もしもエラーが出たら
403 Forbidden(権限エラー)
該当のファイルの権限が間違っている可能性がある。
ターミナルでファイルの場所を開き権限を設定する。
user@hostname:~# sudo chmod 755 xxx.cgi
500 Internal Server Error(スクリプトエラー)
多分一番わかりにくいエラーコード。
エラーログを見るのが一番だけどありがちなのを2つ紹介する。
1. Pythonモジュールがインストールされていない
ModuleNotFoundError: No module named 'hoge'
が表示されたらとりあえずpip install hoge
でOK。
pipコマンドでインストールできなければGithubから探してくるのも一つの手段。
2. 日本語が入るとエラーになる
実際に遭遇した例だと半角文字のみの場合は問題なく表示されるが全角文字が含まれるとエラーになったことがあった。
どんな手を使ってもファイルを読み出す時点で文字化けしていたのではさすがにスクリプト内で対処するのは難しい。
そこでApache2の設定を変更する。
# 一行追記
AddDefaultCharset UTF-8
筆者の場合はこれで解消された。
502 Bad Gateway(応答なし)
- ルーターのポート開放はできているか
- ファイアーウォールの設定を解除できているか
sudo ufw allow 80
- Apacheは起動しているか
これらの可能性をもう一度洗い直してみよう。