コンピュータ・インターネットノウハウをみんなで自由に編集し合える!

Ubuntu(debian系)環境のapache2でのCGI設定方法 コンピュータ・インターネット

※Debian GNU/Linux派生のUbuntuでしか実行確認はしていません。
※設定変更を反映させるためには sudo apache2ctl restart をTerminalで行なってください。

まずはapache2をインストール。apache1は知りません。
Synapticパッケージマネージャでも、Terminalからsudo apt-get install apache2でも、ここは何でも構いません。
何やらこのapache2が曲者で、初めてapacheを触ろうとして「Linux apache」とかでぐぐっても中々書いてることと自分の環境が違ってて戸惑う。
どうやらDebian系とそれ以外のLinuxでのApache2の構成が微妙に違うらしい。

普通は/etc/apache2/以下に設定ファイルが全部入っていて、その中のhttpd.confを変更するのだが、ubuntuだとhttpd.confの中身は空っぽのファイルになっている。
まずまっさきにubuntuで設定する中身は、実は全部、同じディレクトリの中にあるapache2.confに書いてあって、httpd.confには追記分を書きこんでください、という仕組みらしい。(apache2.conf中でhttpd.confをincludeしてる)

インストールしたてのapache2の状態だと、HTMLとCSSは通常通り使えますが、まだWANに向けて公開できていませんし、CGIも/usr/bin/cgi-bin/以下のディレクトリでしか動作しないようになっています。しかも、拡張子は.cgiしか対応していません。

そのため、まずは.phpとか.plとか.rbとかの拡張子のCGIも動作出来るように設定します。

先程説明した、/etc/apache2/httpd.confをsudoで(ユーザ上のディレクトリなんで当然管理者権限で)geditなりemacsなり好きなエディタで開きます。
そこに「AddHandler cgi-script .cgi .rb .pl .php」と記述して上書き保存。
たったこれだけ。
ただ、もちろんこれは普通にrubyとかperlとかphpとかインストールしないと動作しません。
あと、こっちももちろんだけど、面倒だからって/

  • にして全てのファイルに対してCGI許可なんて、セキュリティ的に危険すぎるので絶対に辞めてください。



次に、DocumentRootの設定。
DocumentRootは何かというと、例えば自分のIPアドレスが123.123.123.123だったとして、このアドレスに最初にアクセスされたらどのディレクトリを見せるかを決めるところです。日本語おかしいかもです。
デフォルトだと、DocumentRootが/var/www/以下になっていて、ここに本当に全部のファイルを記述すると、ユーザよりも上のディレクトリなのでいちいち管理者権限でエディタ起動しなくちゃいけなくて、非常に不便です。
しかもユーザより上の層にアクセスさせるって、それだけで何かセキュリティ的に不安になりますよね(笑)


という事で、DocumentRootはどこを触ればいいかというと、
/etc/apache2/sites-available以下にあるdefaultを開きます。
そうすると、しょっぱなからいきなり
<VirtualHost

  • :80>

ServerAdmin webmaster@localhost
DocumentRoot /var/www
のような記述があると思います。
これは80番ポートでアクセスしてきた端末に対して、DocumentRoot /var/wwwで対応する、という意味です。
80番ポートは、httpのウェルノウンポートなので、他に理由がなければ特に変更する理由は無いでしょう。
ただし、スカイプは確かデフォルトでなぜか80番ポートを利用しているので、どちらも初期設定のままだと一緒に利用出来なかったはずです。
スカイプは別に他ポートでも問題無いので、普通にスカイプの設定から見ると80番ポートを使用しない、という設定があるので、おとなしくそこにチェックを入れましょう。
ServerAdminは、まぁ自分の好きなように書いてください。
そこの下の行のDocumentRootが今回の目的。この行を自分のアクセスして欲しいディレクトリに設定します。
ちなみに私は、研究室と自室で同じファイルを編集したかった(進捗報告をCGIで作って、家でも研究室でも編集したかった)ので、/home/user_name/Dropbox/purezen/と記述しています。
user_nameの部分は、自分のユーザネームを記述してください。
linuxとかunixでは、ユーザ以下のディレクトリを記述するとき~(チルダ)と記述しますし、それはapacheも例外ではないのですが、DocumentRootにはチルダは利用できないのでフルパスを記述してください。
ちなみに、初期設定のまんまだと、DocumentRootを変更したまま、ブラウザを立ち上げてURLのところにlocalhost(自分のIPアドレス)を入力すると、そのディレクトリの中が丸見えになるだけです。
(localhostができない場合、2つのローカルIPアドレスを持っている可能性があるので、ifconfigをして自分のIPアドレスを調べて、自分のローカルIPアドレスをURL欄に手打ちしましょう)
通常、httpでそのディレクトリにアクセスされた場合、まっさきに「index.html」というファイルを探して表示します。見つからないと、ディレクトリ一覧を表示してしまうだけです。
この、一番最初にアクセスされる、初期設定だとindex.htmlになっているファイルの事を、DirectoryIndexと呼びます。
DirectoryIndexも一応変更可能で、優先順位まで付けられます。
まぁ、ここは無理に俺流なんてやらないほうが無難なので、特殊な事情が無い場合を除いてそのままでいいでしょう。

例えば私の場合は、最初に ~/Dropbox/purezen/index.html にアクセスさせて、そこがプレゼンのメニューになっています。
進捗報告1~現在番号まで表示していて、そこからCGIを利用したプレゼンのページにリンクを作っています。
CGIの基本的な知識として、なぜか動かなかった場合は、いちいち/bar/log/apache2/error.logを見るのもいいですが、まず最低限、
sudo chmod +rx File_name と、シェバングくらいは確認しましょう。
Terminal上でlsを使うと、カレントディレクトリに存在するファイル一覧が見れて、ls -lを使うと、権限も含めてファイル一覧が見れるようになります。
-rwxr-x--- 2 user user 4096 MM月 DD HH:MM FILE_NAME
的な感じで表示されると思うんですけど、一番左側のrとwとxで1セットになってます。
わかりやすく区切ると、
- rwx r-x ---
と見ることが出来ます。
read , write , executeの頭文字で、このrwx1セットが3つ書いています。左側から確か、user,group,otherの順番になっていて、許可していない部分にはハイフンが記述されています。
上の例だと、ユーザはrwx全部記述されているので、編集、読み込み、実行すべてが許可されています。しかし、グループの人だとr-xと書かれているので、読み込みと実行しかできません。
other、つまり外部から来た他人はどれも許可されていません。
管理者権限で実行すると、もちろん全部可能です。
普通にgedit file_nameでファイルを作成すると、多分標準だとotherの部分が---となっているので、パーミッションを変更してあげる必要があります。
sudo chmod +rx file_nameで、読み込みと実行を可能にしてあげましょう。絶対に、+wはしないでください。編集されたらただのセキュリティホールです。
あるいは記述方法としては、このwrxをビットに見立てて、許可を1,拒否を0としてみると、111 101 000と見ることが可能です。これを2進数を使って、sudo chmod 755 file_nameとかにすると、2進数の755にあわせて、権限が 111 101 101 になるので、結果的に +rx と同じことが出来ます。


・シェバングに関して
普段Terminal上でプログラムを実行する時、ruby sample.rbのような感じでRubyを実行すると思うんですけど、サーバにはruby命令ができません。なので、Terminal上で./sample.rbで実行出来るような状態にしておかないと、CGIとして動作させることは出来ません。
実行させるためには、プログラムの1行目にシェバングを記述します。
#!/usr/bin/ruby
のような感じです。
こうやって、プログラムがインストールされている場所をシェバングに記述すると、そこを勝手に実行してくれます。
1行目にシェバングを正しく記述してあるプログラムだと、terminal上でいちいちruby sample.rbなんてやらなくても、sample.rbだけで実行出来るようになります。
目的のプログラムがどこにインストールされてるか分からない時は、便利なコマンド which を使いましょう。
which ruby とかTerminal上で実行すると、Rubyのインストールされているパスを教えてくれます。便利です。


私と同じようにプレゼン目的でCGIを使おうとしてる人用に、ディレクトリ及びページ及び権限付与プログラムのソース書いておきます
`mkdir #{ARGV[0]}`
where=`pwd`
where.chomp!
progn = 1
while progn<30 do
`cp #{where}/temp.txt #{where}/#{ARGV[0]}/page#{progn}.rb`
progn = progn + 1
end
progn = 1
while progn<30 do
`sudo chmod +rx #{where}/#{ARGV[0]}/page#{progn}.rb`
progn = progn + 1
end
sudo ruby このプログラム名.rb ディレクトリ名 で実行すると、現在のディレクトリ以下に起動引数で指定したディレクトリ名のディレクトリを作って、そこにpage1.rbからpage30.rbまでのrubyファイルを用意してくれて、権限付与もしてくれます。
さらに、このプログラムと同じディレクトリに、temp.txtというファイルを用意しておくと、そのファイルをテンプレートとして、page1.rbからpage30.rbに記述してくれます。

これでapacheは動作するはずだけど、、、書き忘れとか無いよね?おれ

http://moeeee.blog101.fc2.com/blog-entry-1727.html

関連ノウハウ

このノウハウを評価する

評価、コメントするにはサービスに登録してください。

サービス登録をする

コメントを見る

コメントするにはサービスに登録してください。

サービス登録をする

この記事を通報する

ノウハウを書く