カテゴリ: apache

仕事でサーバの移転をしていて、Apache2.0系のmod_auth_mysqlが入ったサーバーから、Apache2.2系にセットアップし直したときに、ApacheのAPIの違いから上手く入らずちょっとハマッタのでメモしておきます。

そもそもAPIの違いでApache2.0系からApache2.2系への移行が上手くいかないんですけど、既に同じ問題に直面したことが有る方がいらっしゃって、Apache2 - MySQL認証 / うにっくすさんの覚え書きに手順がありました。

ながれとしては、mod_auth_mysqlを公式サイトからダウンロード、上のサイトで紹介されているpatchをあてて、インストールとなります。

公式サイト
  http://sourceforge.net/projects/modauthmysql/

ダウンロードリンク
  http://sourceforge.net/projects/modauthmysql/files/modauthmysql/3.0.0/mod_auth_mysql-3.0.0.tar.gz/download 

ダウンロードしたファイルとpatchを同フォルダにおいて
$ tar zxvf mod_auth_mysql-3.0.0.tar.gz
$ cd mod_auth_mysql-3.0.0
$ patch -p0 < ../mod_auth_mysql.c.patch
$ sudo /usr/local/apache2/bin/apxs -cia -I/usr/local/mysql/include/mysql/ -L/usr/local/mysql/lib64/mysql/ -lmysqlclient -lz -lm mod_auth_mysql.c; 
でインストールとLoadModuleまで完了です。ただ、このまま起動すると下記のエラーになります。
[error] Internal error: pcfg_openfile() called with NULL filename [error] [client 192.168.0.1] (9)Bad file number: Could not open password file: (null)
これはmod_auth_basic.soより後に記述するとそうなるようで、先にmod_auth_basicが動作してエラーになってしまうようです。mod_auth_basicより先にロードすればいいと記述をみかけたんですが、mod_auth_basicとかメジャーな物は、動的じゃなくて静的にくみこまれている場合も多く、自分の環境がそうだったのですが、ここで詰まってしまいました。

色々さがしていたら海外のMLで解決法をみつけました。

AuthType Basic
AuthUserFile /dev/null
AuthBasicAuthoritative Off

AuthMySQLEnable On
Require valid-user
AuthMySQLHost localhost
AuthMySQLDB test
AuthMySQLUser www
AuthMySQLPassword pass
AuthMySQLUserTable user
AuthMySQLNameField key
AuthMySQLPasswordField secretkey

いったんAuthUserFileを/dev/nullにして、AuthBasicAuthoritativeをOffにします。こうすると、認証ファイルに該当ユーザーが無い場合、下位の認証プロセスに認証を委譲するようにどうさするみたいです。mod_auth_basicのページにも書いてありました。なるほどですねー。勉強になりました。
このエントリーをはてなブックマークに追加

最近Google AnalyticsのMobile版がひっそりと始まりましたね。
ホントにひっそりで、場所がわかり辛いのですが、

https://www.google.com/analytics/settings/check_status_profile_handler


ここの、

  1. Instructions for adding tracking
  2. Advancedタブ
  3. 1 What are you tracking?
  4. A site built for a mobile phone
を選択するとでてきます。

導入方法 Perl編

  1. 「2 Paste code on your mobile site」のコードをviewから呼び出せるところに準備
  2. htmlあたりに<img src="[% google_analytics_get_image_url() %]">書く
  3. 「3 Copy this file to your root directory」にあるga.plをcgi起動出来るように設定するか、同様の内容を作る

さっそく導入してみたんですが、どうもsessionの同定が出来てないっぽいです。
別集計で出したUUが2,000ぐらいなのに、Analyticsだと10,000になっていたりします。
なんでかと思い調べたところ・・・

# Generate a visitor id for this hit.
# If there is a visitor id in the cookie, use that, otherwise
# use the guid if we have one, otherwise use a random number.
sub get_visitor_id {
  my ($guid, $account, $user_agent, $cookie) = @_;

  # If there is a value in the cookie, don't change it.
  if ($cookie ne "") {
    return $cookie;
  }

  my $message = "";
  if ($guid ne "") {
  # Create the visitor id using the guid.
    $message = $guid . $account;
  } else {
  # otherwise this is a new user, create a new random id.
    $message = $user_agent . get_random_number();
  }

  my $md5_string = md5_hex($message);

  return "0x" . substr($md5_string, 0, 16);
}

ん?

# If there is a visitor id in the cookie, use that, otherwise
# use the guid if we have one, otherwise use a random number.

あれ、docomo以外みてくれてない・・

というわけで修正しました。独自でやってもできるけどキャリア判別とかが煩雑だったので、HTTP::MobileAgent使っています。0.27以降がdocomoID対応なんで、それ以降を使います。


--- ga.pl	2009-11-12 21:27:23.000000000 +0900
+++ ga.pl.new	2009-11-12 21:22:04.000000000 +0900
@@ -6,6 +6,7 @@
 use Digest::MD5 qw(md5_hex);
 use LWP::UserAgent;
 use URI::Escape;
+use HTTP::MobileAgent;
 use strict;
 
 # Tracker version.
@@ -59,9 +60,10 @@
   }
 
   my $message = "";
-  if ($guid ne "") {
-  # Create the visitor id using the guid.
-    $message = $guid . $account;
+  my $user_id = _get_user_id();
+  if ($user_id ne "") {
+  # Create the visitor id using the uesr_id.
+    $message = $user_id . $account;
   } else {
   # otherwise this is a new user, create a new random id.
     $message = $user_agent . get_random_number();
@@ -192,4 +194,14 @@
   write_gif_data($new_cookie, $utm_url);
 }
 
+sub _get_user_id {
+    my $agent = HTTP::MobileAgent-&gt;new; 
+    return $agent-&gt;user_id
+        if $agent-&gt;is_docomo;
+    return (split('_', $ENV{HTTP_X_UP_SUBNO}, 2))[0]
+        if $agent-&gt;is_ezweb;
+    return substr($ENV{HTTP_X_JPHONE_UID}, 1, length($ENV{HTTP_X_JPHONE_UID}))
+        if $agent-&gt;is_vodafone;
+}
+
 track_page_view();


当て方はga.plと上のga.pl.patchを同じディレクトリに置いて

$ patch -p0 < ga.pl.patch


このパッチでは、端末ID送信しない設定の端末とか、端末ID送信しないwillcomとかをスルーしちゃいます。厳密に計測するには、アプリケーション側で端末IDみて、なければユニークなID(session id)とかを使うべきですが、これだけでもそこそこの制度がでるので、さっくりやりたい人はこっちで良いと思います。

このエントリーをはてなブックマークに追加

↑このページのトップヘ