Mac OSX をYosemiteにしたら自作CGIが動かないでござるの巻
タイトル通りなのですが、まず、localhostのファイルにアクセスすると、そもそもhttpデーモンが動いていない。
Mavericksにupdateしたときは、一応はApacheは動いていたのだが。。。
で、他所でも言われている通り、またOSのアップデート時にhttpd.confを書き換えられていた。
Apacheが2.2から2.4.9へと大幅にバージョンアップしたせいで、アクセスの許可/不許可の書き方が変わってしまっているかららしい、とのことでhttpd.confを書き換えてみたのですが、そもそもApacheが立ち上がらない。
%apachectl -t
を実行すると、mod_perl.soが開けない! と怒られた。
確かに、本当にmod_perl.soはなかった。
ということで、mod_perlのソースをダウンロードして、
%perl Makefile.pl
と打ち込むと、
Reading Makefile.PL args from @ARGV MP_CCOPTS = -std=gnu89 MP_APXS unspecified, using /usr/sbin/apxs no conflicting prior mod_perl version found - good. Configuring Apache/2.2.24 mod_perl/2.0.8 Perl/v5.18.2 [ error] '/usr/sbin/apxs -q MPM_NAME' failed: [ error] apxs:Error: Invalid query string `MPM_NAME'. [ error] Failed to obtain the MPM name.
というエラーが出て止まってしまう。
まずもって、Apacheのバージョンがおかしい。
確認のため、
%httpd -V
と入れると、
Server version: Apache/2.4.9 (Unix) Server built: Sep 9 2014 14:48:20 Server's Module Magic Number: 20120211:31 Server loaded: APR 1.4.8, APR-UTIL 1.5.2 Compiled using: APR 1.4.8, APR-UTIL 1.5.2 Architecture: 64-bit Server MPM: prefork threaded: no forked: yes (variable process count)
ですよねぇ〜ってなる。
おまけで、MPM_NAMEに入るべき値が"prefork"だということが分かる。
で、色々調べると、なんと、mod_perlの現在の正式リリース版(ver.2.0.8)は、Apache 2.4系に未対応だと判明。
そりゃ、Appleもベータ版のmod_perlを付けるわけにはいかんかったのだろうとお察しする。
う〜ん。仕方ないけど、今日は解散!!
2015.2/1 追記
さすがに不便なので、SVNで開発版のmod_perlを入れることにしました。
MOD_PerlのSVNをチェックアウト。
%svn co https://svn.apache.org/repos/asf/perl/modperl/trunk/ mod_perl-2.0
なんか聞かれるけど、Temporaryですと返答。
%cd mod_perl-2.0 %perl Makefile.PL MP_CCOPTS=-std=gnu89 MP_APXS unspecified, using /usr/sbin/apxs no conflicting prior mod_perl version found - good. Configuring Apache/2.4.9 mod_perl/2.0.9dev Perl/v5.18.2
ふむ、良い感じ。
続けて、makeすると
modperl_constants.c:1545:30: error: use of undeclared identifier 'APR_ENOKEY'
というエラーが出て止まってしまった。
調べたところ、これを回避するパッチがあるらしい。
この"0008-workaround-APR_ENOKEY-not-found.patch"を、mod_perl-2.0において、
%patch ./src/modules/perl/modperl_apache_includes.h < 0008-workaround-APR_ENOKEY-not-found.patch
を実行して、
%make clean %perl Makefile.PL MP_CCOPTS=-std=gnu89 %make
と再度makeしたところ、
[warning] mod_perl dso library will be built as mod_perl.so [warning] You'll need to add the following to httpd.conf: [warning] [warning] LoadModule perl_module modules/mod_perl.so [warning] [warning] depending on your build, mod_perl might not live in [warning] the modules/ directory. [warning] Check the results of [warning] [warning] $ /usr/sbin/apxs -q LIBEXECDIR [warning] [warning] and adjust the LoadModule directive accordingly.
どうやら成功したらしいので、インストール。
%sudo make install
それから、httpd.confを、mod_perl.soをロードするように書き換え(上記 Warning 参照)た後、httpd.conf のテスト。
%apachectl -t httpd: Syntax error on line 171 of /private/etc/apache2/httpd.conf: Cannot load libexec/apache2/mod_perl.so into server: dlopen(/usr/libexec/apache2/mod_perl.so, 10): Symbol not found: _modperl_handler_anon_add\n Referenced from: /usr/libexec/apache2/mod_perl.so\n Expected in: flat namespace\n in /usr/libexec/apache2/mod_perl.so
これは、もしかして。。。
%file mod_perl.so mod_perl.so: Mach-O universal binary with 2 architectures mod_perl.so (for architecture x86_64): Mach-O 64-bit bundle x86_64 mod_perl.so (for architecture i386): Mach-O bundle i386 %file /usr/sbin/httpd /usr/sbin/httpd: Mach-O 64-bit executable x86_64
アーキテクチャのアンマッチのようだ。i386アーキテクチャのコンパイルを外す必要がある。
%sudo make uninstall %make clean %export ARCHFLAGS="-arch x86_64" %export CFLAGS="-arch x86_64" %perl Makefile.PL MP_CCOPTS=-std=gnu89 %make %sudo make install %apachectl -t Syntax OK
今度は OKなので、Apacheを再起動。
%sudo apachectl -k restart
で、
[mpm_prefork:notice] : Apache/2.4.9 (Unix) PHP/5.5.14 OpenSSL/0.9.8za mod_perl/2.0.9dev Perl/v5.18.2 configured -- resuming normal operations
と、無事起動しました。
で、次に、Libapreq2をインストールします。
%tar libapreq2-2.13.tar.gz %cd libapreq2-2.13 %perl Makefile.PL %make
とすると、
Can't locate ExtUtils/XSBuilder/ParseSource.pm in @INC (you may need to install the ExtUtils::XSBuilder::ParseSource module) (@INC contains: /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Library/Perl/Updates/5.18.2/darwin-thread-multi-2level /Library/Perl/Updates/5.18.2 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 .) at Makefile.PL line 22. BEGIN failed--compilation aborted at Makefile.PL line 22.
というエラーでストップしました。ExtUtils::XSBuilder::ParseSourceをインストールする必要があると言っているので、
%cpan ExtUtils::XSBuilder::ParseSource
を実行。
%make clean %make
で、無事、make終了。
%sudo make install
を実行すると、
ld: library not found for -lapreq2 clang: error: linker command failed with exit code 1 (use -v to see invocation)
というエラーが発生。これは以前も見たエラーでした。
/System//Library/Perl/5.18/darwin-thread-multi-2level/Config_heavy.pl の
1276 : my $_archflags = exists($ENV{ARCHFLAGS}) ? $ENV{ARCHFLAGS} : '-arch x86_64 -arch i386';
を
1276 : my $_archflags = exists($ENV{ARCHFLAGS}) ? $ENV{ARCHFLAGS} : '-arch x86_64';
に書き換えて、
%cd .. %sudo rm -rf libapreq2-2.13 %tar libapreq2-2.13.tar.gz %cd libapreq2-2.13 %perl Makefile.PL %make %sudo make install
しかし、同じエラーが出ます。
%file ./glue/perl/xs/APR/Request/Apache2/Apache2.o Apache2.o: Mach-O 64-bit object x86_64 %file /usr/lib/libapreq2.3.8.0.dylib libapreq2.3.8.0.dylib: Mach-O 64-bit dynamically linked shared library x86_64
う〜ん。分からん。お手上げです。。。
まあ、それ以前に make test で Fail 判定だったので、今回は諦めます。。。