CentOS 7
 

Perl + mod_perl
2015/07/30
 
mod_perl をインストールして、Perl スクリプトの実行を高速化します。
[1] mod_perl をインストールします。
# EPEL からインストール

[root@www ~]#
yum --enablerepo=epel -y install mod_perl
[2] Perl インタープリタをメモリに常駐させるのみの PerlRun モードの設定です。
[root@www ~]#
vi /etc/httpd/conf.d/perl.conf
# 15行目:コメント解除 ( コードチェックしログに警告を表示 )

PerlSwitches -w
# 24行目:コメント解除 ( 汚染検出モード有効 )

PerlSwitches -T
# 30-36行目:以下のようにコメント解除

Alias /perl /var/www/perl
<Directory /var/www/perl>    
# mod_perl 環境下にするディレクトリ

    SetHandler perl-script    
# ディレクトリ配下は全て perl-script 扱いになる

#    AddHandler perl-script .cgi
   
# 指定拡張子のみ perl-script 扱いにするなら上行を無効にして当行を有効化

#    PerlResponseHandler ModPerl::Registry
   
PerlResponseHandler ModPerl::PerlRun
   
# PerlRunモード指定

    PerlOptions +ParseHeaders
    Options +ExecCGI
</Directory>
# 43-49行目:以下のようにコメント解除 & 追記

<Location /perl-status>
    SetHandler perl-script
    PerlResponseHandler Apache2::Status
   
Require ip 127.0.0.1 10.0.0.0/24
   
# アクセス許可範囲設定

#    Order deny,allow
#    Deny from all
#    Allow from .example.com
</Location>
[root@www ~]#
systemctl restart httpd

[3] テストスクリプトを作成して動作を確認します。以下のような結果が表示されれば OK です。
[root@www ~]#
mkdir /var/www/perl

[root@www ~]#
vi /var/www/perl/test-mod_perl.cgi
#!/usr/bin/perl

use strict;
use warnings;

print "Content-type: text/html\n\n";
print "<html>\n<body>\n";
print "<div style=\"width:100%; font-size:40px; font-weight:bold; text-align:center;\">";

my $a = 0;
&number();

print "</div>\n</body>\n</html>";

sub number {
    $a++;
    print "number \$a = $a";
}

[root@www ~]#
chmod 705 /var/www/perl/test-mod_perl.cgi

[4] 実行コードをメモリ上にキャッシュする Registry モードの設定です。
[root@www ~]#
vi /etc/httpd/conf.d/perl.conf
Alias /perl /var/www/perl
<Directory /var/www/perl>
    SetHandler perl-script
    PerlResponseHandler ModPerl::Registry    
# コメント解除

#
   PerlResponseHandler ModPerl::PerlRun    
# コメントにする

    PerlOptions +ParseHeaders
    Options +ExecCGI
</Directory>
[root@www ~]#
systemctl restart httpd

[5] [4] で作成したテストスクリプトにアクセスすると、変数の値がメモリ上にキャッシュされているため、以下のようにアクセスする度に値が増加します。 これが意図しない動作であれば、テストスクリプトの例の場合、Registry モードでは以下のようにコードを修正する必要があります。 Registry モードではこのように変数の扱い方等、注意が必要です。
[root@www ~]#
vi /var/www/perl/test-mod_perl.cgi
#!/usr/bin/perl

use strict;
use warnings;

print "Content-type: text/html\n\n";
print "<html>\n<body>\n";
print "<div style=\"width:100%; font-size:40px; font-weight:bold; text-align:center;\">";

my $a = 0;
&number(
$a
);
print "</div>\n</body>\n</html>";

sub number {
    my($a) = @_;

    $a++;
    print "number \$a = $a";
}
[6] なお、「http://(サーバーのホスト名またはIPアドレス)/perl-status/」にアクセスすると、mod_perl のステータスが確認可能です。
 
Tweet