「apache」でCGIを動かしてみる。
■「apache」の設定変更。
[bibo-roku@centos ~]# sudo vi /etc/httpd/conf.modules.d/00-mpm.conf
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:
# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so ←「#」外す。
[bibo-roku@centos ~]# sudo vi /etc/httpd/conf.modules.d/01-cgi.conf
# This configuration file loads a CGI module appropriate to the MPM
# which has been configured in 00-mpm.conf. mod_cgid should be used
# with a threaded MPM; mod_cgi with the prefork MPM.
<IfModule mpm_worker_module>
LoadModule cgid_module modules/mod_cgid.so
</IfModule>
<IfModule mpm_event_module>
LoadModule cgid_module modules/mod_cgid.so
</IfModule>
<IfModule mpm_prefork_module> ←これ。
LoadModule cgi_module modules/mod_cgi.so
</IfModule>
[bibo-roku@centos modules]$ ls | grep mod_cgi
mod_cgi.so ←両方共に存在。
mod_cgid.so ←両方共に存在。
[bibo-roku@centos /]$ sudo vi /etc/httpd/conf/httpd.conf
# Further relax access to the default document root:
<Directory "/var/www/html">
---省略---
Options Indexes FollowSymLinks ←原文。
Options Includes ExecCGI FollowSymLinks ←変更後。
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" ←エイリアスと実際の場所。
#AddHandler cgi-script .cgi ←原文。
AddHandler cgi-script .cgi .pl ←コメントアウト解除、追記。
|
|
MPMは当方の環境では「prefork」を選ぶ必要があるそうですので、「prefork」のコメントアウトを解除します。「worker」「event」はコメントアウトします。
「/etc/httpd/conf.modules.d/01-cgi.conf」を確認すると、「prefork」=「mod_cgi.so」で「event」と「worker」は「mod_cgid.so」ということのようです。
「/etc/httpd/modules」を確認すると両方のモジュールが確認できました。
「/etc/httpd/conf/httpd.conf」の<Directory "/var/www/html">の設定を「ExecCGI」を追記することでこのディレクトリでも「CGI」を利用することができるようになります。
意味はSSIの許可(コマンドExec含む)、CGIの許可、シンボリックリンク許可。
「ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"」は本来「CGI」を置くディレクトリである「/var/www/cgi-bin/」をエイリアスにより「/cgi-bin/」と表記できるようにしています。
アドレスは「
http://192.168.0.66/cgi-bin/test.cgi」となります。
コメントアウト解除します。
「AddHandler cgi-script .cgi .pl」と追加して、使用できる拡張子を増やします。
■「apache」でCGIを動かす準備。
[bibo-roku@centos modules]$ whereis perl ←「perl」の確認。
perl: /usr/bin/perl /usr/share/man/man1/perl.1.gz
[bibo-roku@centos modules]$ sudo ln -s /usr/bin/perl /usr/local/bin/perl ←シンボリックリンク作成。
[bibo-roku@centos modules]$ whereis perl ←「perl」の再度確認。
perl: /usr/bin/perl /usr/local/bin/perl /usr/share/man/man1/perl.1.gz
[bibo-roku@centos ~]$ ll /var/www/
合計 8
drwxr-xr-x. 2 root root 4096 4月 21 00:51 2015 cgi-bin
drwxr-xr-x. 4 root root 4096 5月 4 22:01 2015 html ←所有者確認。
[bibo-roku@centos ~]$ sudo chown apache:apache /var/www/html/ ←所有者変更。
[bibo-roku@centos ~]$ ll /var/www/ ←所有者再確認。
合計 8
drwxr-xr-x. 2 root root 4096 4月 21 00:51 2015 cgi-bin
drwxr-xr-x. 4 apache apache 4096 5月 4 22:01 2015 html ←確認。
|
|
「perl」にシンボリックリンクを張るために現状の場所を確認し、/usr/local/bin/perlにリンクを張ります。
「/var/www/html」ディレクトリの所有者を「apache」に変更します。
■「apache」でCGIを動かす。
[bibo-roku@centos ~]$ sudo vi /var/www/html/index.html ←テスト用HTMLファイル作成。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>テストページ</title>
</head>
<body>
HTML(html)表示テスト
</body>
</html>
[bibo-roku@centos ~]$ sudo vi /var/www/html/index.shtml ←テスト用SHTMLファイル作成。
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>テストページ</title>
</head>
<body>
SHTML(SSI)表示テスト<BR>
<!--#echo var="DATE_LOCAL" -->
</body>
</html>
[bibo-roku@centos ~]$ sudo vi /var/www/html/test.cgi ←テスト用CGIファイル作成。
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print "<META http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">";
print "<title>テストページ</title>\n";
print "</head>\n";
print "<body>\n";
print "CGI表示テスト\n";
print "</body>\n";
print "</html>\n";
[bibo-roku@centos ~]$ sudo chown apache:apache /var/www/html/index.html ←作成ファイルの所有者変更。
[bibo-roku@centos ~]$ sudo chown apache:apache /var/www/html/index.shtml
[bibo-roku@centos ~]$ sudo chown apache:apache /var/www/html/test.cgi
[bibo-roku@centos ~]$ ll /var/www/html/ ←確認。
合計 24
-rw-r--r--. 1 apache apache 199 5月 5 23:11 2015 index.html
-rw-r--r--. 1 apache apache 233 5月 5 23:14 2015 index.shtml
-rw-r--r--. 1 apache apache 326 5月 5 23:19 2015 test.cgi
http://192.168.0.66/
HTML(html)表示テスト ←GOOD
http://192.168.0.66/index.shtml
SHTML(SSI)表示テスト
Tuesday, 05-May-2015 23:46:43 JST ←GOOD
http://192.168.0.66/test.cgi
Internal Server Error ←NG
[bibo-roku@centos html]$ sudo chmod 755 test.cgi ←パーミッションを変更。
[bibo-roku@centos html]$ ls -l
合計 40
-rw-r--r--. 1 apache apache 199 5月 5 23:11 2015 index.html
-rw-r--r--. 1 apache apache 233 5月 5 23:14 2015 index.shtml
-rwxr-xr-x. 1 apache apache 326 5月 5 23:19 2015 test.cgi ←755に。
http://192.168.0.66/test.cgi ←再度確認。
CGI表示テスト ←GOOD
|
|
テスト用のファイル「HTML」「SHTML」「CGI」を作成し、所有者を「apache」に変更し、「apache」の再起動を行いブラウザで開いてみます。
しかし「HTML」と「SHTML」は表示されたものの「CGI」はエラーが出てしまいました。前者は表示されるのですから「apache」は一応動いていると思います。
となると、「CGI」を実現させる何かが間違っているのでしょう。「パッケージ」「モジュール」「設定」「所有者」というところでしょうか。
インターネットで検索してみると
ディレクトリのパーミッション
CGI ファイルのパーミッション
Perl のパスの違い
改行コード
UTF-8 の BOMコード
文法エラー
「モジュール」の不足
.htaccess の問題
Perl のバージョン
などがあるようです。調べていきますと、「test.cgi」のパーミッションが「644」でした。「755」に変更します。
表示できました!
表示は出来ましたが、理由が解らないのでこれを機に調べてみます。
パーミッションは以下の表のようになっています。
オーナー |
グループ |
それ以外 |
読み込み |
書き込み |
実行 |
読み込み |
書き込み |
実行 |
読み込み |
書き込み |
実行 |
r |
w |
x |
r |
w |
x |
r |
w |
x |
4 |
2 |
1 |
4 |
2 |
1 |
4 |
2 |
1 |
まずは「index.html」ですがこれは「644」ですから
「オーナー」→「読み込み」「書き込み」
「グループ」→「読み込み」
「それ以外」→「読み込み」
HTMLファイルは読み込むだけですから、「644」のままでも表示できたということでしょうか。
次に「index.shtml」ですがこれは「644」ですから
「オーナー」→「読み込み」「書き込み」
「グループ」→「読み込み」
「それ以外」→「読み込み」
SHTMLファイルは動的なページと言えるようですが、HTMLに埋め込むだけで使用できるとのことですから、パーミッションも読み込むだけで「644」のままでも表示できたということでしょうか。時間を表示しているので、情報を引き出して(実行して)いるようにも思えるのですが……。
まずは「test.cgi」ですがこれは「644」でしたから
「オーナー」→「読み込み」「書き込み」
「グループ」→「読み込み」
「それ以外」→「読み込み」
CGIはSHTMLと同様に動的なページを作成できますが、埋め込みのタイプではなく、perlに渡して実行し、HTMLを生成する必要があるため、「読み込み」と「実行」が必要なのではないでしょうかね。
そのため、「perl」のパスを間違えたままでアクセスすると、ソースだけ表示されますが、これは「読み込み」だけだからでしょう。
その後色々試してみました。結局のところ「オーナー」は「apache」なので当方の状況でブラウザを見る場合「グループ」と「それ以外」は無関係かもしれません。
ブラウザで見るという行為は「それ以外」が「読み込み」をする物だと思ったのですが。「770」にしても見られるので間違いのようですね。
そして「オーナー」を「1」にしても「Internal Server Error」発生。実行はできても「読み込み」ができていないからでしょう。
「オーナー」を「5」にしてみると案の定表示されました。ただ、HTMLファイルに書き込むようなプログラムの場合「書き込み」も必要となり「7」にしなければならないのではないでしょうか。それとも単にHTMLファイルの編集する権限のことかな。
ちょっと話が逸れてしまいますが、「cat /etc/passwd」にて「apache」のユーザーIDが48ということがわかりました。
次に「ps alx」で「httpd」の付くプロセスのユーザーIDを見てみると「48」でした。
やはりプロセスを動かしている「オーナー」に「7」を付与するのが正しいみたいですね。
2015-05-06 22:36
nice!(0)
コメント(0)
トラックバック(0)
共通テーマ:パソコン・インターネット
コメント 0