UbuntuにApache導入してWebサーバ立てるまでのかゆいところ
Apache導入、CGIスクリプトの作成とファイルアクセス
そもそも、なぜApacheが必要なのか
WebブラウザにHTML等要求されて、応答を返すなどという仕組みは(当たり前だが)本来備わっていないので、これを可能にするApacheというWebサーバーを導入することが必要。
こんなの書くまでもないけど、以下を見れば違いが分かる(Apacheの場合)。
webサーバが動いていないマシン:
$ curl http://localhost
curl: (7) Failed to connect to localhost port 80: 接続を拒否されました
webサーバが動いているマシン:
$ curl http://localhost
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
(中略)
</html>
*Apacheの場合、localhostにアクセスするとdefault page的なものが表示される。
CGIってなにそれ?
CGI(Common Gateway Interface)は、ウェブサーバ上で好きなプログラムを動作させる仕組み.
名前のとおり、単なるInterfaceなので、様々な様々な言語で実装されている. Pythonもその1つ.
-- 2017年6月10日 追記 --
私の説明がゴミなので、古いSoftware Designに書いてあった一節も引用させて頂く。
CGIというのは Common Gateway Interfaceの略で、単純に言うとブラウザからWebサーバに置いてあるプログラムを起動するための仕様です。CGIという言葉はInterfaceを指すので、CGIで動く(動かされる)プログラムのことは、CGIプログラムやCGIスクリプトという方が丁寧です。スクリプト言語で書いた場合はCGIスクリプトというのが良いでしょう。
CGIプログラムはどんな言語で作っても構いません。C言語で書いても良いわけですが、この領域ではLightweight Language(LL言語)で書かれることがほとんどであり、伝統的にはPerl、PHPが多く、最近ではRuby、Pythonもよく使われます。
開眼シェルスクリプト第19回 by 上田隆一 (Software Design 2013 July P.122)
実行環境?
Ubuntu 16.04
Apache/2.4.18
↑これを参考にした。ホームディレクトリ直下で
$ mkdir public_html
及び
$ chmod 770 public_html
として、(groupのpermissionは7にしないとだめなはず。)
続けて、
$ a2enmod userdir
ユーザーディレクトリの指定かな?
$ a2enmod cgid
CGIを使用可能にする。
を入力。
このあと、URLの先にもあるように、
mime.conf を編集して、.cgi の拡張子を持つファイルを cgi-script として処理するよう設定する。userdir.conf を編集して、public_html ディレクトリに ExecCGI Option を付加する。
(これをやらないと、cgiファイル読むときに、web-serverが、これXMLだわwwとか言って読みだしてエラー吐いて死ぬ)
を行ってから再起動して終了。
Permissionについて
普通にCGIからサーバーのファイル触ろうとするとPermission denied食らう。
$ chmod 777 [FILE] ってしちゃえば行けるが、危険すぎる。
Apache2の場合はwww-dataなるuserがapacheを動かしているということを知る。
以下のサイトとか参考にする。Stack overflowのやつはわざわざvarwwwusersとかいうグループを追加しているが、必要ない。(下記参考)
$ less /etc/apache2/envvars
とすることで、apacheの環境変数覗ける。
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
と記されており、userもgroupも"www-data"になっていることが分かる。
よって使用しているディレクトリ(今回cgiを書いているのは~/public_html/以下である)に対して、
$ sudo chgrp -R www-data ~/public_html
と入力してやる。(~/public_html以下のファイルを、グループ"www-data"の所有物にする. -R はRecursive(再帰))
次に、
$ sudo chmod -R 770 ~/public_html
としてやることで、適切なPermissionとなり、apacheがpublic_html配下のファイルにアクセスできるようになる。