月別アーカイブ: 2014年4月

Apache 2.4 で PHP (mod_php) が動かなくなってた件

先日の件はPHP-FPM に切り替えることで対処。

pkgsrc/www/php-fpm をインストール。
/etc/rc.conf に php_fom=YES を追加して php-fpm を起動。

/usr/pkg/etc/httpd/httpd.conf で以下のモジュールを有効に。

LoadModule proxy_module lib/httpd/mod_proxy.so
LoadModule proxy_fcgi_module lib/httpd/mod_proxy_fcgi.so

php5_module の設定が残っている場合は削除。

Apache の ProxyPassMatch ディレクティブを使ってPHP ファイルへのアクセスを php-fpm へ転送する設定。ProxyPassMatch の第1引数は URL のルートからのパスにマッチする正規表現、第2引数の fcgi://127.0.0.1:9000 以降は対応する PHP ファイルの絶対パスを指定する。

ProxyPassMatch ^/~alice/(.*\.php)$ fcgi://127.0.0.1:9000/home/alice/public_html/$1

…userdir が絡むと面倒だな。

zoneedit と ddclient

zoneedit の dynamic DNS の更新に ddclient (pkgsrc/net/ddcleint) を利用していたのだが、エラーが出て更新できなくなってしまった。

zoneedit のアナウンスとかは見当たらなかったが、どうやら HTTPS でのみ更新が可能なように仕様が変更されたっぽい。

pkgsrc-2014Q1 の ddclient-3.6.6 は SSL が使用できないが、最新版では使用できるらしいとの話を聞きつけて、ddclient-3.8.2 を本家から持ってきて試してみたのだがエラーが出てうまくいかない。

syswrite() on closed filehandle GEN1 at ./ddclient line 1902.
Use of uninitialized value $result in numeric ne (!=) at ./ddclient line 1904.
WARNING:  cannot send to dynamic.zoneedit.com:443 (Bad file descriptor).

デバッグ出力を埋め込んで調べてみると、zoneedit の SSL 証明書の検証ができなくて失敗していることがわかった。

WARNING:  cannot connect to dynamic.zoneedit.com:443 socket: SSL connect attempt failed with unknown error error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed SSL connect attempt failed with unknown error error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

とはいえ、ブラウザはともかく、NetBSD で SSL ルート証明書の管理などしてない。どうしよう。

結局、検証は行わないように ddclient を修正して対処した。

@@ -1881,8 +1880,9 @@
             Proto => 'tcp',
             MultiHomed => 1,
             Timeout => opt('timeout'),
+            SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE(),
         );
-           defined $sd or warning("cannot connect to $peer:$port socket: $@ " . IO::Socket::SSL::errstr());
+           fileno($sd) or warning("cannot connect to $peer:$port socket: $@ " . IO::Socket::SSL::errstr());
     } else {
            $sd = IO::Socket::INET->new(
             PeerAddr => $peer,

SSL_VERYFY_NONE は IO::Socket::SSL 内で定義されている定数だが、他所から明示的に参照したいときはサブルーチンのように記述すれば良いらしい。

あと、IPアドレス取得用の URL も https://dynamic.zoneedit.com/checkip.html のように HTTPS しか受け付けなくなってしまった。上記の修正だけでは HTTP で取得しようとしてしまうのだが、ddclient.conf の web の引数に https:// を付けて記述すればよい。

use=web, web=https://dynamic.zoneedit.com/checkip.html, web-skip='IP Address'

pkgsrc-2014Q1 で Apache 2.4 と PHP 5.5 が動かなくなった

pkgsrc-2014Q1 がリリースされたのでアプリケーションをアップデートしていたところ、表題のように Apache が起動できなくなった。

$ sudo /etc/rc.d/apache start
Starting apache.
[Tue Apr 22 16:57:14.926914 2014] [:crit] [pid 19113:tid 3214934016] Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.
AH00013: Pre-configuration failed

tech-pkg 012766 で既に話題には出ていたようだ。

で、対処方法としては AP-PHP の代わりに PHP-FPM を使え ってことなのかな。めんどくさいなあ。

そもそも PHP-FPM って何やねん、というレベルなのだが、ぐぐったら こんなページ が見つかったので、あとで参考にさせてもらうことにしよう。

ということで、まだ壊れて動かないまま。

NetBSD 6.1.3 → 6.1.4

前回のアップデートと同じように更新。

と思ったら、build.sh install を実行すると etcupdate が自動的に実行されてた。前回はどうだったのかな。

$ sudo ./build.sh -O ../obj -T ../tools -U install=/
...
obsolete check:
        Remove obsolete file ///lib/libcrypto.so.8.0
        Remove obsolete link ///usr/lib/libcrypto.so.8.0
        Remove obsolete file ///usr/lib/libdes.so.8.1
        Remove obsolete file ///usr/lib/libssl.so.10.0
ptyfsoldnodes check:
postinstall checks passed: bluetooth ddbonpanic defaults dhcpcd envsys fontconfig gid gpio hosts iscsi makedev motd named pam periodic pf pwd_mkdb rc ssh wscons x11 xkb uid varrwho tcpdumpchroot atf catpages ptyfsoldnodes
postinstall checks failed: mtree obsolete
To fix, run:
    /bin/sh /u5/NetBSD/src/usr.sbin/postinstall/postinstall -s '/u5/NetBSD/src' -d // fix mtree obsolete
Note that this may overwrite local changes.
...

postinstall を手動で実行するところは前回と同じ。/home/NetBSD は /u5/NetBSD へのシンボリックリンクなので実パスが表示されている。

$ sudo /bin/sh /u5/NetBSD/src/usr.sbin/postinstall/postinstall -s '/u5/NetBSD/src' -d // fix mtree obsolete
Source directory: /u5/NetBSD/src
Target directory: //
mtree fix:
        Copied /tmp/_postinstall.7561.0/NetBSD.dist to ///etc/mtree/NetBSD.dist
obsolete fix:
        Removed obsolete file ///lib/libcrypto.so.8.0
        Removed obsolete link ///usr/lib/libcrypto.so.8.0
        Removed obsolete file ///usr/lib/libdes.so.8.1
        Removed obsolete file ///usr/lib/libssl.so.10.0
postinstall fixes passed: mtree obsolete
postinstall fixes failed:
$