GlassFish アップデートで障害発生

このサイトで稼働させてきた GlassFish 4.0 を新しい 4.1 にアップデートしたら Jenkins が動かなってしまいました。

GlassFish 4.0 は 4.1 のスナップショットより不安定だとか話があったので、Update Tool を使って 4.1 にアップデートして起動したら…動かない…あれ?

そんな訳で、コンフィギュレーションをゼロから作り直したり、必要もないのに (1台でw) クラスターにしていたのをシングル サーバーに変えたりとか、試行錯誤してみた結果、WordPress は復旧したものの Jenkins はどうやっても初期化エラーで動かないという問題が解消できませんでした。クラス ローダーの挙動に影響されてるように見えるんですがねえ。

PHP について

どうでも良い話ですが、私は個人的に PHP が嫌いなのです。それが Quercus で WordPress を動かしている一つの理由。

それでも WordPress を使う理由は、PHP 以外で書かれた WordPress に匹敵するソフトウェアが見つけられなかったこと。全くどういうわけか、広く使われている Web アプリケーションの多くが PHP で書かれているので避けては通れない。

避けて通れないなら、別の方法 (Quercus) を使ってやろうというのがせめてもの抵抗であるわけです。

Quercus で動かす WordPress で見つかった問題点 2

Quercus で使うときの問題点はまだあったな。忘れてた。

タイムゾーン設定で Asia/Tokyo を選択すると、それ以降の設定項目が表示されなくなりました。とりあえず UTC+9 に設定して回避したけども、一度この状態になっちゃうと Web からは修復できなくなるので MySQL を直接叩いて直すはめになります。

WordPress の pingback 不具合

WordPress pingback がどうも機能してないっぽいのはこれのせいか?

…/wp-includes/class-http.php:1279: Warning: CURL option ‘10065’ unknown or unimplemented

オプション 10065 は CURLOPT_CAINFO で、非正規の SSL 証明書を使用するサーバーの発行元 CA を指定する機能のようなのだが、どうも WordPress の pingback サーバーがこれに該当してしまうらしい。

一応 Quercus にバグ報告しておいた。

Quercus で動かす WordPress で見つかった問題点

Quercus を使って Java アプリケーション サーバーで WordPress を稼働させているのは既に書いたとおりですが、WordPress からのメール送信でサブジェクトが割れて本文に入ってしまうという問題がある模様です。コメント モデレーションの通知で発覚しました。

時間が許せば原因を探ってみたいと考えていますが、いつになることでしょうね? (^^)

Quercus を使って WordPress を動かしてみた

Java で書かれた PHP 互換処理系として Quercus というものがあります。PHP で書かれたアプリケーションを Java アプリケーション サーバー上で動作させることができるというものですが、実はこのブログを書いている WordPress も Quercus 上で動かしていたりします。

実のところ WordPress を Quercus で動かすためには、いくつか越えなければいけないハードルがあったわけなので、そのいくつかをここに記しておきます。

文字化け

最初に気が付くのはやはり文字化けでしょう。これにはいくつか理由が挙げられますが主なものは次の二つです。

  • PHP が基本的にマルチバイト文字列であるのに対して Java は UTF-16 を使っている。
  • WordPress が MySQL に特化していることにより JDBC との不整合がある。

最初のものは WEB-INF/php.ini (Quercus の php.ini ファイル) で unicode.semantics = 1 として PHP6 のように Unicode を使うように指定することで回避することができる場合もありますが、PHP6 はキャンセルになった模様ですし、別のところで問題が出る可能性があるのでここでは使いません。代わりに、Java を騙して UTF-8 マルチバイト文字列を ISO-8859-1 だと思わせる方法を取ります。そのために WEB-INF/php.ini ファイルで mbstring.internal_encoding = UTF-8 と指定します。

しかしこれだけでは JDBC ドライバーが勝手に Unicode に変換して MySQL テーブル上で文字化けを誘発しますので、もう一手売っておく必要があります。何をするかというと、MySQL の JDBC クライアントのプロパティで characterEncoding=ISO8859_1 と指定するだけです。

こんなことをすると普通なら逆に文字化けを引き起こしそうなものですが、WordPress の MySQL 特化設計のおかげで、MySQL サーバー側には適切なエンコーディングが設定がされるので、JDBC ドライバーは何も知らずにバイト列を素通してしまって文字化けが回避されるという望ましい結果が得られます。

ほかにも手間取りそうなところはありますが、今回はここまでとします。