mod_perlを有効にするとperlバージョンて固定されるのね知らなかったよ。[Mac][Apache]
現象と原因
mod_perl.so が有効になっていると、webサーバ上で動作するperlのバージョンは固定化されるから。
※ 見つけた時って何処からバージョン5.18.4が来ているのかわからなくて、PC全体にGrep Findかけて、mod_perl.soの中からバージョン文字列見つけたんだよ。それを再現しようと手を変え品を変えてやってみたけど再現できなかった。夢だったのだろうか?
LoadModule perl_module libexec/apache2/mod_perl.so
mod_perl を有効にした Mac でスクリプト実行ユーザ名とスクリプト実行時の環境変数を見ます。
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バージョンはこれだ
> SERVERSOFTWARE="Apache/2.4.51 (Unix) PHP/7.3.29 modperl/2.0.9 Perl/v5.18.4"
シェバンに v5.34.0 バージョンの perl を指定しても、モジュール版 perl を使うので無駄でした。
モジュール版の意味が高速化ですからね。
※ シェバンてのはファイル先頭に書く、実行ファイルとオプションの行の事です。
これ>
- #!/usr/local/bin/perl
- #!/usr/bin/perl
解決方法
違うバージョンの perl を使いたい場合は、mod_perl.so を外しましょう。
行の先頭に # を一つ入れるだけです。
# LoadModule perl_module libexec/apache2/mod_perl.so
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 が使用されます。
解決方法 その2
Docker で Perl 使えばいいと思う