CentOS 8
Sponsored Link

Apache httpd : mod_perl の設定2019/12/26

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

[root@www ~]#
dnf --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>
    # ディレクトリ配下は全て perl-script 扱いになる
    SetHandler perl-script
    # 指定拡張子のみ perl-script 扱いにする場合は上行を無効化して当行を追記
    AddHandler perl-script .cgi
#    PerlResponseHandler ModPerl::Registry
    # PerlRun モード指定行を追記
    PerlResponseHandler ModPerl::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";

my $a = 0;
&number();

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

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

[root@www ~]#
curl https://www.srv.world/perl/test-mod_perl.cgi

number $a = 1
[4] 実行コードをメモリ上にキャッシュする [Registry] モードの設定です。
[root@www ~]#
vi /etc/httpd/conf.d/perl.conf
Alias /perl /var/www/perl
<Directory /var/www/perl>
#    SetHandler perl-script
    AddHandler perl-script .cgi
    # Registry モード指定行有効化
    PerlResponseHandler ModPerl::Registry
#    PerlResponseHandler ModPerl::PerlRun
    PerlOptions +ParseHeaders
    Options +ExecCGI
</Directory>

[root@www ~]#
systemctl restart httpd

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

number $a = 1
[root@www ~]#
curl https://www.srv.world/perl/test-mod_perl.cgi

number $a = 2
[root@www ~]#
curl https://www.srv.world/perl/test-mod_perl.cgi

number $a = 3
[root@www ~]#
vi /var/www/perl/test-mod_perl.cgi
#!/usr/bin/perl

use strict;
use warnings;

print "Content-type: text/html\n\n";

my $a = 0;
&number($a);

sub number {
    my($a) = @_;
    $a++;
    print "number \$a = $a \n";
}

[root@www ~]#
curl https://www.srv.world/perl/test-mod_perl.cgi

number $a = 1
[root@www ~]#
curl https://www.srv.world/perl/test-mod_perl.cgi

number $a = 1
[root@www ~]#
curl https://www.srv.world/perl/test-mod_perl.cgi

number $a = 1
[6] なお、[(サーバーのホスト名またはIPアドレス)/perl-status/] にアクセスすると [mod_perl] のステータスが確認可能です。
関連コンテンツ