mod_pagespeed 正式版を導入してみる

とりあえず、CentOS 5.8 と CentOS 6.3 で確認。
但し、CentOS5系についてはかなり難儀です。

まず、CentOS 5.8 では gclientが動作しません。
これは、gclient が Python 2.5 以上で動作するからみたいです。

よって、python 2.6 をインストールする必要があります。
ここは割愛。epel あたりから yum で引っ張るといいです。
git も gperf も必要なので、epel で引っ張ってきます。

インストールしただけでは gclient は動作しません。
/usr/bin/python を /usr/bin/python26 のシンボリックリンクにしないといけないようです。(ファイル名が python 決め打ち?)

* CentOS 5系のみ

mv /usr/bin/python /usr/bin/python_ ; ln -s /usr/bin/python26 /usr/bin/python

そうしたらインストールコマンドを叩いていきます。
全て root でやってください。

mkdir -p ~/mod_pagespeed
cd ~/mod_pagespeed
svn co http://src.chromium.org/svn/trunk/tools/depot_tools
export PATH=$PATH:/root/mod_pagespeed/depot_tools/

depot_tools にパスを通すのがポイント。
export なのは、Shellがbashの為。

そうしたらソースの取得。

gclient config http://modpagespeed.googlecode.com/svn/branches/latest-beta/src
gclient sync --force --jobs=1
cd src
make BUILDTYPE=Release mod_pagespeed_test pagespeed_automatic_test
make BUILDTYPE=Release mod_pagespeed_test pagespeed_automatic_test
./out/Release/mod_pagespeed_test
./out/Release/pagespeed_automatic_test

上記でテストまで完了。
FAILが出ても(内容的に問題が無さそうなら)無視します。

make BUILDTYPE=Release
cd install
chmod 755 ./install_apxs.sh

権限を与えておく。
apacheをrpmで導入しているなら、apxsのパスを指定せず install_apxs.sh を叩いてください。
自分はソースコンパイルで導入したので、環境変数を指定します。

/bin/sh
APXS_BIN=/usr/local/apache/bin/apxs ./install_apxs.sh
Using /usr/local/apache/bin/apxs to determine installation location.

mod_pagespeed needs to cache optimized resources on the file system.
The default location for this cache is '/var/mod_pagespeed'.
Would you like to specify a different location? (y/N)

Preparing to install to the following locations:
/usr/local/apache/modules/mod_pagespeed.so (root:root)
/usr/local/apache/conf/pagespeed.conf (root:root)
/var/mod_pagespeed/cache (apache:apache)
/var/mod_pagespeed/files (apache:apache)

Continue? (y/N) y
Adding a load line for mod_pagespeed to /usr/local/apache/conf/httpd.conf.

Installation succeeded.
Restart apache to enable mod_pagespeed.

これでセットアップ完了。
動作には mod_version と mod_pagespeed 、 mod_deflate が必要です。
apache の conf 以下に pagespeed.conf ができているので、これを httpd.conf で include すれば完了です。
(おそらく最後の行に追加されているはず)

後は apache のリスタートで完了です。
早速このサイトに適応してみました。

メールフォームプロCGI 3.2.0 SSL利用時について

たまたま mailform pro を使わせて頂く機会がありました。

https + BASIC認証 + 強制httpsリダイレクト という特殊な環境下で見つけたバグ?というか仕様です。
最初にBASIC認証をし内容登録してthanksページを表示しようとすると、BASIC認証が再表示します。

おや?と思ってプロトコルログを取ってみると、thanksページ表示時に http を経由しているようです。
firefoxやchromeだと問題無いのですが、IEではそのBASIC認証を厳密にチェックしているようで
一度 http に落ちた時にBASIC認証を求められるようでした。

ソースを見てみると、functions.cgi でこんな表記がありました。

if(index($ENV{'SERVER_PROTOCOL'},'HTTPS') > -1){
	$refreshurl = 'https://' . $ENV{'SERVER_NAME'} . $uri . $refreshurl;
}
else {
	$refreshurl = 'http://' . $ENV{'SERVER_NAME'} . $uri . $refreshurl;
}

多分、ここ間違ってると思います。
$ENV{‘SERVER_PROTOCOL’} で取れるものは、HTTP/1.1とかHTTP/1.0で HTTPS という文字列は取れないと思います。
取るなら、$ENV{‘SERVER_PORT’} で 443 を取るべきなんでしょうが、SSLも443だけとは限りません。
HTTP_REFERER で https という文字列を取ってもいいのですが、referer も100%取れる訳ではありません。
SSL_SECURE_RENEG の true を取るのがこの場合ベストなんですかねぇ…

if(index($ENV{'SSL_SECURE_RENEG'},'true') > -1){
	$refreshurl = 'https://' . $ENV{'SERVER_NAME'} . $uri . $refreshurl;
}
else {
	$refreshurl = 'http://' . $ENV{'SERVER_NAME'} . $uri . $refreshurl;
}

一応これで動作するようです。
とはいえ、自分はプログラマでは無いのでおかしな挙動をするかも知れません。
ご利用の際には自己責任にて宜しくお願い致します。
当方はトラブル・障害に対して一切関知致しません。

CentOS 5 + libmemcached でエラー

libmemcached を CentOS 5.7 に導入しようとして、最新版の libmemcached 1.0.11 を導入しようとしたら、こんなエラーが表示されました。

make[1]: ディレクトリ `/usr/local/src/libmemcached-1.0.10' に入ります
  CXX    libmemcached/csl/libmemcached_libmemcached_la-context.lo
In file included from ./libmemcached/common.h:72,
                 from ./libmemcached/csl/common.h:40,
                 from libmemcached/csl/context.cc:38:
./libmemcached-1.0/memcached.h:46:27: error: tr1/cinttypes: No such file or directory
make[1]: *** [libmemcached/csl/libmemcached_libmemcached_la-context.lo] エラー 1
make[1]: ディレクトリ `/usr/local/src/libmemcached-1.0.10' から出ます
make: *** [all] エラー 2

どうやら CentOS の gcc のバージョンが古いようでコンパイルできないようです。
対策方法は2つ。
古いgccでもコンパイルが通る libmemcached まで落とす(1.0.4)か、gccのバージョンアップ。

yum install gcc44 gcc44-c++ libstdc++44-devel

上記で解消されます。