mod_perlを有効にするとperlバージョンて固定されるのね知らなかったよ。


# mod_perlを有効にするとperlバージョンて固定されるのね知らなかったよ。[Mac][Apache]

## 現象と原因

mod_perl.so が有効になっていると、webサーバ上で動作するperlのバージョンは固定化されるから。

※ 見つけた時って何処からバージョン5.18.4が来ているのかわからなくて、PC全体にGrep Findかけて、mod_perl.soの中からバージョン文字列見つけたんだよ。それを再現しようと手を変え品を変えてやってみたけど再現できなかった。夢だったのだろうか？

```config:/etc/apache2/httpd.conf 抜粋 188行目ぐらい mod_perl.so が有効になっている図
LoadModule perl_module libexec/apache2/mod_perl.so
```

mod_perl を有効にした Mac でスクリプト実行ユーザ名とスクリプト実行時の環境変数を見ます。

```bash
    FireZone ~$ cat /var/www/printenv.pl
    #!/usr/local/bin/perl
    use warnings;
    use Data::Dumper;
    use feature qw(say);
    use utf8;
    binmode STDIN,  ":utf8";
    binmode STDOUT, ":utf8";
    binmode STDERR, ":utf8";
    
    print "Content-type: text/plain; charset=utf-8\n\n";
    print "getpwuid\n";
    
    print getpwuid($>);
    
    ##  printenv -- demo CGI program which just prints its environment
    foreach $var (sort(keys(%ENV))) {
        $val = $ENV{$var};
        $val =~ s|\n|\\n|g;
        $val =~ s|"|\\"|g;
        print "${var}=\"${val}\"\n";
        # print "${var}=\"${val}\"<br />\n";
    }
    ### EOF printenv
    __END__
    0
    FireZone ~$ curl http://localhost/printenv.pl
    getpwuid
    _www*70700World Wide Web Server/Library/WebServer/usr/bin/false140733193388032CONTEXT_DOCUMENT_ROOT="/var/www"
    CONTEXT_PREFIX=""
    DOCUMENT_ROOT="/var/www"
    GATEWAY_INTERFACE="CGI/1.1"
    HTTP_ACCEPT="*/*"
    HTTP_HOST="localhost"
    HTTP_USER_AGENT="curl/7.64.1"
    PATH="/Users/lucky/perl5/bin:$PATH"
    PERL5LIB="/Users/lucky/perl5/lib/perl5:$PERL5LIB"
    PERL_CPANM_OPT="--local-lib=/Users/lucky/perl5"
    QUERY_STRING=""
    REMOTE_ADDR="::1"
    REMOTE_PORT="49870"
    REQUEST_METHOD="GET"
    REQUEST_SCHEME="http"
    REQUEST_URI="/printenv.pl"
    SCRIPT_FILENAME="/var/www/printenv.pl"
    SCRIPT_NAME="/printenv.pl"
    SERVER_ADDR="::1"
    SERVER_ADMIN="you@example.com"
    SERVER_NAME="localhost"
    SERVER_PORT="80"
    SERVER_PROTOCOL="HTTP/1.1"
    SERVER_SIGNATURE=""
    SERVER_SOFTWARE="Apache/2.4.51 (Unix) PHP/7.3.29 mod_perl/2.0.9 Perl/v5.18.4"
    FireZone ~$
```

ハイキタコレー。
実行時ユーザは \_www さん。
サーバ実行時perlバージョンはこれだ

＞ SERVER<sub>SOFTWARE</sub>="Apache/2.4.51 (Unix) PHP/7.3.29 mod<sub>perl</sub>/2.0.9 Perl/v5.18.4"

シェバンに v5.34.0 バージョンの perl を指定しても、モジュール版 perl を使うので無駄でした。
モジュール版の意味が高速化ですからね。
※ シェバンてのはファイル先頭に書く、実行ファイルとオプションの行の事です。
これ＞

-   \#!/usr/local/bin/perl
-   \#!/usr/bin/perl

## 解決方法

違うバージョンの perl を使いたい場合は、mod_perl.so を外しましょう。
行の先頭に # を一つ入れるだけです。

```conf:/etc/apache2/httpd.conf 抜粋 188行目ぐらい
#LoadModule perl_module libexec/apache2/mod_perl.so
```

```bash
    FireZone ~$ curl http://localhost/printenv.pl
    getpwuid
    _www*70700World Wide Web Server/Library/WebServer/usr/bin/false140733193388032CONTEXT_DOCUMENT_ROOT="/var/www"
    CONTEXT_PREFIX=""
    DOCUMENT_ROOT="/var/www"
    GATEWAY_INTERFACE="CGI/1.1"
    HTTP_ACCEPT="*/*"
    HTTP_HOST="localhost"
    HTTP_USER_AGENT="curl/7.64.1"
    PATH="/Users/lucky/perl5/bin:$PATH"
    PERL5LIB="/Users/lucky/perl5/lib/perl5:$PERL5LIB"
    PERL_CPANM_OPT="--local-lib=/Users/lucky/perl5"
    QUERY_STRING=""
    REMOTE_ADDR="::1"
    REMOTE_PORT="50279"
    REQUEST_METHOD="GET"
    REQUEST_SCHEME="http"
    REQUEST_URI="/printenv.pl"
    SCRIPT_FILENAME="/var/www/printenv.pl"
    SCRIPT_NAME="/printenv.pl"
    SERVER_ADDR="::1"
    SERVER_ADMIN="you@example.com"
    SERVER_NAME="localhost"
    SERVER_PORT="80"
    SERVER_PROTOCOL="HTTP/1.1"
    SERVER_SIGNATURE=""
    SERVER_SOFTWARE="Apache/2.4.51 (Unix) PHP/7.3.29"
    FireZone ~$
```

これで、シェバンの記載通りに perl が使用されます。

## 解決方法　その２

Docker で　Perl 使えばいいと思う