WEBアプリケーション研究室 開発ノート TOP

WEBアプリケーション研究室 開発ノート サーバー

スポンサーサイト

-------- --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

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

何度も調べてるので備忘録でメモします。

■特定のURLに来たアクセスをIPアドレスごとにグルーピングしてカウントする


zcat access_log.23.gz | grep -E 'GET [^"]+/path/to' | cut -d ' ' -f 1 | sort | uniq -c | sort -n


zcatは圧縮したままcat、grepのEオプションは拡張正規表現、cutは半角スペース(dオプション)で区切って1つ目(fオプション)のみを抜き出す。sortで並び替えた後、uniqで同じ物をまとめカウント付き(cオプション)で表示、改めてsortで数の昇順で並び替えてます。

■特定のURLのアクセスログを特定のデータのみ表示

zcat access_log.23.gz | grep -E 'GET [^"]+/path/to' | cut -d ' ' -f 4,5,1,6,7,8,11


cutコマンドはdオプションで区切り文字(デリミタ)を指定し、fオプションでn番目を指定して、特定の文字のみを抜き出すコマンドです。

■おまけ - 複数のログにまたがって検索

zcat access_log.23.gz access_log.22.gz access_log.21.gz


zcat(cat)はスペース区切りで複数のファイルを一気に出力可能です。


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


cat /path/to/access.log | grep 'GET / HTTP/1.1' | cut -d ' ' -f 1 | sort | uniq -c

ApacheのログでIP毎のカウント見るコマンド。上の例ではサイトのインデックス"/"へのアクセスを見てます。リスティング攻撃を受けてIPを特定するのに使いました。

Yahoo用とgoogle用です。

cat /path/to/access.log | grep 'GET / HTTP/1.1' | grep 'www.google.co.jp' | cut -d ' ' -f 1 | sort | uniq -c
cat /path/to/access.log | grep 'GET / HTTP/1.1' | grep 'search.yahoo.co.jp' | cut -d ' ' -f 1 | sort | uniq -c


ちなみにGoogleは熱心に対応してくれて、さらにIPフィルターもあるので安心しました。でもYahooはフィルターもないし対応いまいちでした。フィルター無いってまじですか?その態度や機能が収益の差なんだろうなあと思いました。

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

linux+apache+SSL(open ssl)+mod_rewriteの設定でハマったので書いておきます。

SSLの設定はこちらのサイトを参考にさせて頂きました。

ハマったのは、対象サーバーで既に多数の名前ベースのバーチャルホストを運用していたことです。そもそも、そのあたりの仕組みをあまり理解していなかったのが原因ですが・・・

名前ベースのバーチャルホストでは

NameVirtualHost *:80
このようにして、まず名前ベースで使うIPアドレス(ポート)を指定して
<VirtualHost *:80>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
</VirtualHost>
こんな感じでDocumentRootとServerNameのペアを登録していきます。他のサイトは80のまま運用したいので、このNameVirtualHostを443に変えてしまうわけには行きません。

名前ベースのバーチャルホストはIPベースと併用できます。
<VirtualHost 192.168.0.2:443>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
SSL........
</VirtualHost>
と別途書いてやります。

yumでmod_sslを入れたときは注意が必要です。
/etc/httpd/conf.d/ssl.conf
ここに設定ファイルが自動で作成されるのでそちらを編集するか、読み込まないようにしましょう。

そのサイトはmod_rewriteを使用してindex.phpに全てを集めるような(ZendFrameworkのControllerのような)システムのサイトだったのですが、https://www.domain.tld/以外、下の階層が一切表示されません。

しばらく悩みましたが、なんてことはない、
<Directory "/www/domain">
AllowOverride All
</Directory>
.htaccessの上書きを許可するのを忘れてました。

また下らないことではまってしまった・・・

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

まず、findコマンドでファイルのリストを取ります。結果をパイプでコピーコマンドに渡しますので、相対パスでリストしたいので、コピーしたいソースのディレクトリに入ります。

また、リストにディレクトリが含まれると、再帰的にコピーしてしまい、取り除きたいディレクトリもコピーしてしまうので、-typeを指定してファイルのみ検索します。

ディレクトリを取り除くのは、-regexを使用します。-nameはファイル名に対するパターンです。複数取り除きたいときは-regexを繰り返し使用できます。


cd /path/to/src/dir
find ./ -type f -regex '\./path/to/except/dir1/.*' -regex '\./path/to/except/dir2/.*'
この段階で一回コマンドを実行して、期待するファイルをリストアップしてるか確認するといいでしょう。

コピーですが、cpコマンドは全てのファイルを指定したディレクトリ一箇所に集めてコピーしてしまうので、階層構造を保てません。そこでcpioコマンドを使います。

find ./ -type f -regex '\./path/to/except/dir1/.*' -regex '\./path/to/except/dir2/.*' | cpio -pdv /path/to/dest/dir
cpioのオプションの意味は

cpio --help
で見ることが出来ます。

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

teeというコマンドがあります。
標準・エラーともに出力するならこんな感じでしょうか。


command 2>&1 | tee file.txt

    このエントリーをはてなブックマークに追加
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。