Asial Blog

Recruit! Asialで一緒に働きませんか?

牧野克俊

システムエンジニア

大学時代のアルバイトでPHPと出会い、JpGraphをきっかけにアシアルを知って入社。
業務システムや携帯サイトなどのシステム構築を手がけ、最近では自社製品を担当。
趣味は音楽鑑賞、ゲーム、美術館めぐり。

たずさわった仕事

mysqlのレプリケーション

カテゴリ :
バックエンド(インフラ)
タグ :
Tech
MySQL
icon
今回の話題は、mysqlで行うレプリケーションについてです。
レプリケーションを行うとマスタで実行された更新系クエリがスレーブでも実行されるようになります。

PHPで画像処理

カテゴリ :
バックエンド(プログラミング)
タグ :
Tech
画像
モザイク画像
先日、色についての話題が出てきていたので、今回はPHPでできる画像処理について書きます。
PHPでは画像を扱える環境が整いさえすれば、簡単に画像処理のプログラムを作ることができます。

シリコンバレー体験記@4日目

カテゴリ :
日常
タグ :
日常
icon
こんばんは。今回初めて海外に来て、アメリカに住んでみるのもいいかも、と思っている牧野です。
今日はシリコンバレーツアーの4日目でしたが、シリコンバレーで働く人と会う予定は昨日までで全部終了し、今日からは完全に観光になりました。

apacheのアクセスログ

カテゴリ :
バックエンド(インフラ)
タグ :
icon
こんばんは、牧野です。
今回はアルゴリズムの話は置いておき、apacheの話題です。

先日、あるサイトのapacheのアクセスログを調べていて気付いたのですが、

リクエストがタイムアウトしてしまい、クライアントがデータを受信できなかった時でも
アクセスログにはリクエストのあった時間のログが残ってしまうんですね。。
ステータスコード200で。。。

これは、携帯でアクセスできるウェブサーバがあれば簡単に確認することができます。
(携帯の方がタイムアウトするまでの時間が短いので)

次のようなプログラムをサーバに置いて、

  1. <?php
  2. sleep(70);
  3. echo 'Hello!';
  4. ?>

あとはアクセスログを見ながらこのプログラムに携帯からアクセスするだけです。
すると、、、

通信開始

70秒経過前に端末側ではタイムアウトメッセージ

70秒後に、ステータスコードが200で、リクエストが合った時刻のログが書き込まれる

実際にどんなデータがやりとりされているかを見るには、Linuxなら
tcpdump
コマンドが使えます。

/usr/sbin/tcpdump -n 'port 80'
という感じで実行すると80番ポート流れるパケットの概要を見ることができます。
今回はポートだけを指定していますが、もっといろんなマッチング条件を指定することも可能です。

これを実行して改めてアクセスしてみると、

  1. 19:25:25.289060 210.136.161.151.44924 > 192.168.1.207.http: S 1392407767:1392407767(0) win 32768  1460,wscale 0,nop> (DF)
  2. 19:25:25.289093 192.168.1.207.http > 210.136.161.151.44924: S 573743362:573743362(0) ack 1392407768 win 5840  1460,nop,wscale 0> (DF)
  3. 19:25:25.292958 210.136.161.151.44924 > 192.168.1.207.http: P 1:123(122) ack 1 win 32768 (DF)
  4. 19:25:25.293023 192.168.1.207.http > 210.136.161.151.44924: . ack 123 win 5840 (DF)
  5. 19:26:17.095988 210.136.161.151.44924 > 192.168.1.207.http: F 123:123(0) ack 1 win 32768 (DF)
  6. 19:26:17.129320 192.168.1.207.http > 210.136.161.151.44924: . ack 124 win 5840 (DF)
  7. 19:26:35.290859 192.168.1.207.http > 210.136.161.151.44924: P 1:265(264) ack 124 win 5840 (DF)
  8. 19:26:35.290974 192.168.1.207.http > 210.136.161.151.44924: F 265:265(0) ack 124 win 5840 (DF)
  9. 19:26:35.294709 210.136.161.151.44924 > 192.168.1.207.http: R 1392407891:1392407909(18) win 0 (DF)
  10. 19:26:35.294711 210.136.161.151.44924 > 192.168.1.207.http: R 1392407891:1392407909(18) win 0 (DF)

最初ウェブサーバにパケットが飛んで、
ウェブサーバが返信
クライアント(docomoゲートウェイサーバ)がヘッダー情報送信
ウェブサーバ受け取り

ここでプログラムはsleep()。

クライアント(docomoゲートウェイサーバ)がタイムアウトして、コネクション切断リクエスト
ウェブサーバが返信
でも、ウェブサーバはデータ送信して、
続けてコネクション切断リクエスト送信
docomoゲートウェイサーバが返信
docomoゲートウェイサーバが2回接続終了リクエスト

となっているようです。(違ってたら教えていただけると助かります。)

やはり、apacheはコネクション切断リクエストを受け取った後でもかまわずレスポンスを返して、ステータスコード200が記録されているってことかな。
ちなみに、tcpdump実行時に -X オプションを追加すると、パケットデータが文字列で表示されるのですが、ネットワークを流れるデータを簡単に覗けることが実感できます。。

話をアクセスログに戻しますが、apacheの設定でログのフォーマットを変えることで、タイムアウトしたアクセスを判別できるようにすることが可能です。
例えば、httpd.confを

  1. LogFormat "%h %l %u %t \"%r\" %>s %b" common
  2. →LogFormat "%h %l %u %t \"%r\" %>s %b %D %X" common
  3. CustomLog logs/access_log combined
のように、LogFormatに%Dや%Xを加えておくと、タイムアウトのアクセス判別の参考に使えそうです。
(参考ページ)
http://httpd.apache.org/docs/2.2/ja/mod/mod_log_config.html

%Dはリクエストの処理にかかった時間(マイクロ秒)、%Xは応答が完了したときの接続ステータスを表します。
他にもいろんな出力が可能なので、必要に応じてカスタマイズしてはいかがでしょうか。

思考ゲームのアルゴリズム

カテゴリ :
日常
タグ :
Tech
アルゴリズム
minimax.png
HPの話題を期待していた人、すみません。
一応、技術っぽくアルゴリズムについてですが、PHPとは全然関係ありません。。

サーバーを触る仕事

カテゴリ :
日常
タグ :
日常
icon
こんばんは、牧野です。
今日は仕事のことを少し書いてみようと思います。

美味しい魚のお店

カテゴリ :
日常
タグ :
日常
icon
今日は食べ物ネタで。
近くにある魚が美味しいお店を紹介したいと思います。

タイピング

カテゴリ :
日常
タグ :
日常
icon
最近アシアルの一部では、あるタイピングゲームがブームです。それは…