SSブログ

「apache」でCGIを動かしてみる。 [Apache]

「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」を付与するのが正しいみたいですね。






nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。