このブログを検索

2011年4月22日金曜日

[Apache]Combined Log Formatの分間アクセス数を整形表示する

Apacheのログ形式がcombinedの場合で、分間アクセス数を整形表示します。
niceはつけてもつけなくても。
なお、この例ではリクエストドメインでの判定もしたいのでHostリクエストヘッダを追加しています。
$ nice -n 19 zcat /usr/local/apache/logs/access_log.Apr.16.gz | egrep 'soft|ez-soft|j-soft|w-soft|mytown' | cut -d' ' -f4 | cut -d: -f1-3 | sed -e "s/^\[//g" | sort | uniq -c
      8 16/Apr/2011:02:05
      7 16/Apr/2011:02:06

sortが必要なのは次の理由から。
高負荷時は、各リクエストの出力順番がズレる可能性があるためです。
・Combined Log Formatの時刻(%t)は、リクエストを受け取った時刻
・ログ出力されるのは、レスポンスを返したタイミング

長期間を調べる時は、10分ごとで。
$ nice -n 19 zcat /usr/local/apache/logs/access_log.Apr.15.gz | tail -5000 | egrep 'soft|ez-soft|j-soft|w-soft|mytown' | cut -d' ' -f4 | cut -d: -f1-3 | sed -e "s/.$//g" | sed -e "s/^\[//g" | sort | uniq -c
   2959 14/Apr/2011:13:2
   1889 14/Apr/2011:13:3

2011年4月3日日曜日

[MySQL]Maatkitを使ってサイズの大きいテーブルを探す

Maatkitで好きなコマンドの1つ、mk-find。
findコマンド互換のオプションなのでわかりやすい。

例えば、サイズが500K以上のテーブルを探す。
$ mk-find --tablesize +500k -hsssdbmra1 -ucheck --ask-pass
実行例は、次の通り。
Enter password: 
`area001i`.`t01_area_item_hist1`
`area001i`.`t01_area_temp_prev1`
`area001i`.`t01_area_user1`
`area001i`.`t01_area_user_item1`
`area001i`.`t01_area_user_stage1`

2011年3月8日火曜日

[MySQL]分離レベルを設定する

my.cnfのmysqldセクションに記述し、再起動すると反映されます。
set global transactionすることもできるようです。
分離レベルの詳細は公式InnoDB と TRANSACTION ISOLATION LEVELを参照してください。
[mysqld]
transaction-isolation=READ-COMMITTED
設定すると次のように表示されます。
mysql> show variables like 'tx_isolation';
+---------------+----------------+
| Variable_name | Value          |
+---------------+----------------+
| tx_isolation  | READ-COMMITTED |
+---------------+----------------+

2011年3月4日金曜日

[MySQL]スローログクエリを調査する

パッケージに同梱されているmysqldumpslowはスローログクエリを調査するのに便利です。
オプションを付けないと、次のようにリテラル値が表示されなかったり実行順にされます。
$ mysqldumpslow /var/lib/mysql/sssdbmy01-slow.log

Reading mysql slow query log from /var/lib/mysql/sssdbmy01-slow.log
Count: 2  Time=6.96s (13s)  Lock=0.00s (0s)  Rows=5844505.0 (11689010), backup[backup]@localhost
  SELECT /*!N SQL_NO_CACHE */ * FROM `t01_quiz0_user_item1`

Count: 2  Time=3.31s (6s)  Lock=0.00s (0s)  Rows=2649981.0 (5299962), backup[backup]@localhost
  SELECT /*!N SQL_NO_CACHE */ * FROM `t01_quiz0_user_area1`
               :
よく使っているオプションは、-a(リテラル値の表示)、-g(パターンマッチング)、-s(ソート)です。
次の例は、リテラル値の表示、カラムitem_qtyで検索、クエリタイムの降順ソートです。
$ mysqldumpslow -a -g item_qty -s t /var/lib/mysql/sssdbmy01-slow.log 

Reading mysql slow query log from /var/lib/mysql/sssdbmy01-slow.log
Count: 1  Time=12.49s (12s)  Lock=0.00s (0s)  Rows=7.0 (7), quiz0001iuser[quiz0001iuser]@sssdev1.sss.examples.co.jp
  select item_qty,count(user_id) item_qty from t01_quiz0_user_item1 where item_qty<>99
  group by item_qty
  order by item_qty

Count: 1  Time=2.02s (2s)  Lock=0.00s (0s)  Rows=7.0 (7), quiz0001iuser[quiz0001iuser]@sssdev1.sss.examples.co.jp
  select distinct item_qty from t01_quiz0_user_item1

2011年3月2日水曜日

Linuxのメモリ割り当て状況を確認する

$ LANG=C sar -R
実行結果は次の通り。
campgが負の値になるとキャッシュがあまり効いていません。
frmpg/s  ・・・  解放されたメモリのページ数/s
bufpg/s  ・・・  割り当てられたバッファのページ数/s
campg/s  ・・・  キャッシュしたページ数/s

00:00:01      frmpg/s   bufpg/s   campg/s
00:01:01      -604.87      0.17      0.08
00:02:01       312.58      0.13      0.05
00:03:01        -3.60      0.22      0.18
00:04:01      -192.49      0.27      0.10
00:05:01        22.62     -1.25    -40.25
00:06:01         6.82      0.23      0.00

2011年2月24日木曜日

[PHP]バージョンを見えないようにする

PHPの場合、Apacheのバージョンを見えなくするをした上で、さらにPHPの設定を変更します。

php.iniを次のように変更します。
expose_php = Off

●変更前
$ telnet sssdev1 80
Trying 192.xxx.xxx.xxx...
Connected to sssdev1.sss.indexweb.co.jp (192.xxx.xxx.xxx).
Escape character is '^]'.
GET /pinfo.php HTTP/1.1
Host: ssssfuka.indexweb.co.jp

HTTP/1.1 200 OK
Date: Thu, 24 Feb 2011 03:09:46 GMT
Server: Apache
ココ→★X-Powered-By: PHP/5.2.17
Transfer-Encoding: chunked
Content-Type: text/html
        :
●設定後
$ telnet sssdev1 80
Trying 192.xxx.xxx.xxx...
Connected to sssdev1.sss.indexweb.co.jp (192.xxx.xxx.xxx).
Escape character is '^]'.
GET /pinfo.php HTTP/1.1
Host: ssssfuka.indexweb.co.jp

HTTP/1.1 200 OK
Date: Thu, 24 Feb 2011 03:11:17 GMT
Server: Apache
★(表示されない)
Transfer-Encoding: chunked
Content-Type: text/html
        :

[Apache]バージョンを見えないようにする

Apacheのバージョンが見えるとセキュリティ上、問題があります。
例えば、そのバージョンにあるセキュリティホールを使われてしまうリスクがあるためです。
詳細はこちら。
http://httpd.apache.org/docs/2.2/ja/mod/core.html#servertokens

httpd.confに次のように記述します。
ServerTokens ProductOnly
●変更前
$ telnet sssdev1 80
Trying 172.xxx.xxx.xxx...
Connected to sssdev1.sss.indexweb.co.jp (172.xxx.xxx.xxx).
Escape character is '^]'.
GET / HTTP/1.1

HTTP/1.1 400 Bad Request
Date: Thu, 24 Feb 2011 01:08:00 GMT
ココ→★Server: Apache/2.2.1x (Unix) DAV/2 PHP/5.2.1x
Content-Length: 226
Connection: close
Content-Type: text/html; charset=iso-8859-1
       :
●設定後
$ telnet sssdev1 80
Trying 172.xxx.xxx.xxx...
Connected to sssdev1.sss.indexweb.co.jp (172.xxx.xxx.xxx).
Escape character is '^]'.
GET / HTTP/1.1

HTTP/1.1 400 Bad Request
Date: Thu, 24 Feb 2011 01:08:57 GMT
ココ→★Server: Apache
Content-Length: 226
Connection: close
Content-Type: text/html; charset=iso-8859-1
       :