1
0

More than 3 years have passed since last update.

UbuntuServer18.04 + Apache2でPythonCGIを動かすまで

Last updated at Posted at 2019-12-24

経緯

  • デスクトップの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

内容は

/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の設定を変更する。

/etc/apache2/conf-available/charset.conf
# 一行追記
AddDefaultCharset UTF-8

筆者の場合はこれで解消された。

502 Bad Gateway(応答なし)

  • ルーターのポート開放はできているか
  • ファイアーウォールの設定を解除できているか
    • sudo ufw allow 80
  • Apacheは起動しているか

これらの可能性をもう一度洗い直してみよう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0