openssl が有効にならない その2(とりあえず解決)

そもそもの発端が 自分でビルドした PHP5.2.5 で '--with-openssl=/usr' を
指定したのに、phpinfo() でopenssl が enabled になっていなかった。

元々 Leopard にインストールされている Apache2.2.6 + PHP5.2.4 は
openssl が使用できる。phpinfo() でも openssl0.97l が有効になっている。


で、Apache の mod_ssl の指定が悪かったのかと思い、MacPorts でインストールしたopenssl0.98g を指定して、Apache を再ビルドしたら、make でエラーになった。

./configure \
'--enable-so' \
'--enable-modules=all' \
'--enable-mods-shared=all' \
'--enable-ssl=shared' \
'--enable-ssl' \
'--with-ssl=/opt/local' \

じゃあデフォルトのApache に自分でビルドした PHP5.2.5 を組み込んでみたらどうかと思い、
PHP5.2.5 の prefix を '--with-apxs2' としてデフォルトの Apache を指定した。
PHP5.2.5 の openssl のパスは '--with-openssl' と指定。
※ PHP5.2.5 をデフォルトの apache に組み込むと、元々ある PHP5.2.4 の libphp5.so を上書きしするので、
/usr/libexex/apache2/libphp5.so を libphp5.2.4.so とかにリネームする必要がある。


これで ./configure、make 、make install は問題なく終了。
apachectl -t を実行すると、以下のようなエラーとなる。

Syntax error on line 114 of /private/etc/apache2/httpd.conf: 
Cannot load /usr/libexec/apache2/libphp5.so into server: 
dlopen(/usr/libexec/apache2/libphp5.so, 10): no suitable image found. 
Did find:\n\t/usr/libexec/apache2/libphp5.so: mach-o, but wrong architecture

青いまま腐る さんに解説が書かれているが、64bit と 32 bit が混在しているのが原因っぽい。
MAC/drupalとかのメモ帳:WINDOWSユーザのためのMAC講座3:LEOPARDに --with-gd オプションでphpをインストールする。 - livedoor Blog(ブログ)
書かれている事を試してみたが、同様に実行できなかった。


ここまで試した事をまとめてみる。

  1. 自前のApache2.2.6 + PHP5.2.5 で デフォルトのopenssl を組み込んでみる → openssl が有効にならない
  2. 自前のApache2.2.6 + PHP5.2.5 で MacPortsのopenssl を組み込んでみる → Apache のビルドがこける
  3. デフォルトのApache2.2.6 + 自前のPHP5.2.5 を組み込んでみる → Apache が起動しない


じゃあ MacPorts の Apache2.2.6 ならどうだと、MacPorts から Apache2.2.6 をインストールしてみた。
で、自前の PHP5.2.5('--with-openssl-dir=/opt/local') を組み込んでビルド。
apachectl でApache を起動したら、エラーになった。

httpd: Syntax error on line 96 of /opt/local/apache2/conf/httpd.conf: 
Cannot load /opt/local/apache2/modules/mod_ssl.so into server: 
Symbol not found: _ssl_cmd_SSLCACertificateFile\n  
Referenced from: /opt/local/apache2/modules/mod_ssl.so\n  Expected in: flat namespace\n


ヱビスブログさんによると、デフォルトのと MacPorts のがコンフリクトを起こしている可能性があるとのこと。
http://thug4dev.com/index.php?/archives/194-LeopardMacPortsApache2mod_ssl.html
httpd.conf で LoadModule ssl_module modules/mod_ssl.so をコメントにすれば Apache は起動するとのことだが、
PHP で openssl を使用したいので、その方法は論外。


色々調べたら、MacPortstrac のチケットのコメントに 「古い mod_ssl で置き換えたら動いたよ」ってあった。
http://trac.macports.org/projects/macports/ticket/13182
※ 当然ながら自己責任です。


んで、デフォルトの /usr/libexec/apache/mod_ssl を /opt/local/apache2/modules/ にコピーして、
Apache を起動すると、起動できた。
/opt/local/apache/bin/httpd -M で確認してみると、ちゃんと ssl_module (shared) と表示される。


phpinfo() を確認してみると、やっぱり openssl が 有効になっていない。
PHP5.2.5 のビルドで、'--with-openssl-dir=/opt/local' にしてたので、
それを '--with-openssl' として PHP5.2.5 をビルドした。


phpinfo() をみると OpenSSL support enabled となった!
Zend_Http_Client で ssl なページにアクセスしたら、エラーにならずに取得できた!
ただ、phpinfo() の openssl のバージョンが OpenSSL 0.9.8g 19 Oct 2007 ってなってるのが気になるけど・・。
まぁ、そのうち MacPorts の mod_ssl が直ってくれると思うので、それまではこれで行こう。


すごくバッドノウハウ的(根本的な解決方法ではない)だと思うけど、とりあえず目的は達成できた。

Leopard を再インストール

新年になりました。去年は社会人になってから一番忙しい年だった。
燃え盛っているプロジェクトに突っ込まれたり、
これまた全くやったことのない言語で、ぼーぼーに燃え盛っているプロジェクトの末期に突っ込まれたり。
いきなりLLな言語使いからバイナリアン(まだなんちゃって)に転身させられたり・・。


今年はゆるーく、またーりとやっていきたい。


さて、年末から大いにはまっていた、Leopard に自分でビルドした PHP5.2.5 で openssl が有効になっていなくて、Zend_Http_Client で SSL なページを
取得しようとすると落て涙目になっていた件について。


年末に openssl をソースからビルドしたら、Apache2.2.6 を再度ビルドしたら make で転けるようになったので、OS から入れ直した。

バックアップ

再インストールの前に諸々のデータやら設定ファイルをバックアップする。

.rc 関係

まずは.rc関係のファイルをバックアップ。
.vim、.vimrc、.screenrc、.zshenv、.zshrc、.bash_profile、.bashrc をバックアップ。

設定ファイル関係

phpphp.ini、apachehttpd.conf、httpd-vhost.conf、MySQL の my.cnf をバックアップ。

データ関係

iTunes (/自分のホーム/ミュージック/iTunes/iTunes Music)
iPhoto (/自分のホーム/ピクチャ/iPhoto Library)
Thunderbird (/自分のホーム/ライブラリ/Thunderbird)
Safari (/自分のホーム/ライブラリ/Safari)
Firefox (/自分のホーム/ライブラリ/Application Support/Firefox)

iTunes の設定ファイルをバックアップするのを忘れてた(´・ω・`)

アプリのインストール

使用しているアプリはちょっと前に iusethis に登録してたので、アプリのダウンロードが楽だった。
http://osx.iusethis.com/user/heavenshell


開発環境は MacPorts から何故か cmigemo がインストールしようとしたら、エラーになる。

$ sudo port install cmigemo +utf8
      • > Fetching cmigemo
      • > Verifying checksum(s) for cmigemo
      • > Extracting cmigemo
      • > Applying patches to cmigemo
      • > Configuring cmigemo
      • > Building cmigemo with target {osx osx-dict}
      • > Staging cmigemo into destroot
Error: Target org.macports.destroot returned: xinstall: Cannot stat: /opt/local/var/macports/build/_opt_local_var_localports_textproc_cmigemo/work/cmigemo-1.3c/build/cmigemo, No such file or directory Error: Status 1 encountered during processing.

11月に vim を入れた際にはちゃんと入ったのに。
MacPorts のバージョンが 1.60 にしたのがダメだったのかと思い、1.5.0 に変えてインストールしてみてもインストールできない。


デバッグモードで インストールしてみて、表示されているメッセージを読んでみたら、
make でこけているみたい。ようわからん。
前できて、今回できなかった原因を考えると、Leopard のセキュリティアップデートで何か変わったのかな。


解決方法がわからないので、とりあえず保留。
MySQL5 + Senna をソースからビルドし、その他インストールに必要なライブラリを MacPorts で入れる。


ApachePHP のインストールについては次回に続く。。。

apache の make でエラー

openssl が有効にならないので、apache に組み込んだバージョンが悪いのかと思って、openssl のバージョンをあげてみた。
現状の openssl に上書きするのは怖いので、/usr/local/ssl というディレクトリを作って、
そこに最新の openssl をソースからビルドして、インストールした。

で、apache をビルドしてみた。

./configure \
"--prefix=/opt/local/apache2" \
"--enable-so" \
"--enable-rewrite=shared" \
"--enable-ssl=shared" \
"--with-ssl=/usr/local/ssl" \

エラーが出た。

Undefined symbols:
  "_BIO_set_callback_arg", referenced from:
      _start_connect in ab.o
  "_BIO_get_callback_arg", referenced from:
      _ssl_print_cb in ab.o
  "_SSL_CTX_set_info_callback", referenced from:
      _main in ab.o
  "_BIO_set_callback", referenced from:
      _start_connect in ab.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make[2]: *** [ab] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all-recursive] Error 1

・・・なんですかこれは・・・。
とりあえず _BIO_set_callback_arg でググってみた。
Re: [openssl.org #1539] : BUG: openssl-0.9.8e build bug on Mac OSX Intel Dual Core


ふむ・・・ openssl の PROBLEMS ってファイルに対処方法書いてあるよって事か。
PROBLEMS をみたら、

The workaround may be to change the following lines in apps/Makefile and
test/Makefile:

  LIBCRYPTO=-L.. -lcrypto
  LIBSSL=-L.. -lssl

to:

  LIBCRYPTO=../libcrypto.a
  LIBSSL=../libssl.a

It's possible that something similar is needed for shared library support
as well.  That hasn't been well tested yet.

十分テストしてないけど、変えたら動くかもよって事か。
apps/Makefile を書き換えて、 openssl に shared をつけてビルドして、apache を make してみた。


結果は同じ・・ヽ(`Д´)ノ

元に戻そうかと、apache の configure で openssl のパスを削除してビルドしても、
エラーが出るようになった(;・∀・)


Zend_Http_Client で SSL なページにアクセスしたいだけなのに orz

ん〜しょうがない問題を切り分けてみるか。
目標が自前でビルドした PHP で openssl が使う事なので、

  1. デフォルトの apache + PHP で openssl が使えることを確認する
  2. デフォルトの apache + 自前でビルドした PHP で openssl が使える事を確認する

それでもダメなら OS を再インストールしてクリーンにして 環境再構築。。。


タイムマシーン使っておけばよかった。
うまい事行ったら、タイムマシーンを使うようにしよう。

  • -

2007/12/31 17:09 追記
とりあえず 1. の「デフォルトの apache + PHP で openssl が使えることを確認する」で
Zend_Http_Client で SSL なページにアクセスできることは確認できた。
ということはやっぱり原因は opnessl が自前の PHP で使用できてない事か。


いまから 2. を試してみよう。

  • -

2007/12/31 17:57 追記
ビルドでこけた・・・なんかもうグダグダになってきた。
めんどくさいから OS から再インストールするか。
部屋も掃除したし、PC も掃除すると思えば。。。 orz

Virtual hosts の設定方法

めちゃくちゃ今更ながらな感がするけど、一応メモ。
(Linuxで設定するのと殆ど変わりません)


Leopard で HOST 名を設定するのが、以下の箇所になる。

システム環境設定 → 共有 → コンピュータ名編集 → ローカルホスト名

で、Apache2.2.6 の Virutal hosts を有効にするには、まず
httpd.conf の設定を変更する。
元からインストールされている Apache2.2.6 の場合、
/etc/apache2/httpd.conf を変更。


自分は/opt/local/apache2/ にインストールしたので、
/opt/local/apache2/conf/httpd.conf を変更する。

# Virtual hosts
Include conf/extra/httpd-vhosts.conf

そして、httpd.conf と同じ階層にある、extra というディレクトリの、
httpd-vhosts.conf というファイルに VirutalHost を設定する。


中に example として、設定例が記述されているので、参考にする。
※実際の Virutal Host は自分のサブドメイン名.マシン名としている
ドキュメントルートは、~/Sites に Web アプリケーションごとのディレクトリをきり、その中に設定している。

<VirtualHost *:80>
    ServerAdmin 自分のメールアドレス
    DocumentRoot ドキュメントルートのパス
    ServerName sub.localhost
    DirectoryIndex index.php
    <Directory "ドキュメントルートのパス">
      AllowOverride All
      Allow from All
    </Directory>
</VirtualHost>

本来なら Virtual Host ごとに ErrorLog、CustomLog を
設定するべきだろうが、今回は設定していない。


つづいて、hosts ファイルを変更する。
hosts ファイルは、/etc/hosts にある。
以下を追記する。

192.168.1.10  sub.localhost

あとは Apache を再起動させて、ブラウザで、sub.localhost にアクセスして、
Virtual Hostで設定したドキュメントルートのファイルが表示されれば成功。


Leopard はあんま関係ないな。。。