19 posts categorized "WEBサーバ 【人気】"

October 28, 2010

WEB上からapacheの生ログを見ることができるようにするプログラム

apache生ログをWEB上から見たいという要望を受けて簡単にPHPで作ってみましたのでご紹介致します。突っ込みどころ満載かと思いますが、その場合はコメントに記載いただけましたら幸いです。改善的コメント大歓迎です。

※重大な警告:この手のスクリプトは重大なセキュリティホールを招く場合がありますので、もし実利用される場合は十分ご注意ください。


【プログラムの概要】
今回作成したプログラムでは、特定ディレクトリ内のファイルリストを取得して一覧を出します。そして一覧の中から特定ファイルをクリックするとそのファイルの最後10行(もしくは指定行数)を表示するというものです。例えばこんな感じです。

web1 top>
tail -

access_log 38543
access_log 5435
access_log 23533
error_log 10206
error_log 236
error_log 1256


【プログラム】
これを実現するプログラムは以下の通りです。特に難しいことはやってないので容易に理解できるかと思います。(赤字の部分を直して使ってください)

■logview.php

<?php
$scripturl = "http://www.example.com/admin/logview.php";
$basedir = "/var/log/httpd";

global $f_cmd;
global $f_filename;
$f_numlist = 10;
if (isset($_GET["c"])) $f_cmd = htmlspecialchars(@$_GET["c"], ENT_QUOTES);
if (isset($_GET["f"])) $f_filename = htmlspecialchars(@$_GET["f"], ENT_QUOTES);
if (isset($_GET["n"])) $f_numlist = htmlspecialchars(@$_GET["n"], ENT_QUOTES);

if (strpos($f_filename, "..") !== FALSE) {
     print "You can't use '..'.";
     exit;
}

print `/bin/hostname` . "<a href='$scripturl'>top></a><br />";
?>

<form method="GET" action="viewlog.php">
  <input type="hidden" name="c" value="<?=$f_cmd?>" />
  <input type="hidden" name="f" value="<?=$f_filename?>" />
  tail -<input type="text" name="n" size=3 value="<?=$f_numlist?>" />
  <input type="submit" />
</form>

<pre>
<?php
//--------------------
//ログ一覧表示
//--------------------
if ($f_cmd == "") {
    $lists = `ls -lb  $basedir/*log* |awk '{print $9,$5}'`;
    $arr_lists = split("\n", $lists);
    foreach ($arr_lists as $list) {
        $list = str_replace($basedir."/", "", $list);
        $arr_list = split(" ", $list);
        if ($arr_list[1] != 0) {
            $arr_list_new = str_replace("error", "<font color=red>error</font>", $arr_list[0]);
            print "<a href='$scripturl?c=p&f=$arr_list[0]'>$arr_list_new</a> $arr_list[1]<br />";
        }
    }
}

//--------------------
//ログ表示
//--------------------
if ($f_cmd == "p" && !empty($f_filename)) {
    system("tail -$f_numlist $basedir/$f_filename");
}
?>
</pre>
</html>

| | Comments (3) | TrackBack (1)

March 17, 2009

サーバにアンチウィルスソフトを入れない選択

サーバにアンチウィルスソフトを入れるのは常識と思われるかもしれません。しかし現実問題としてサーバにアンチウィルスソフトを入れてないサイトが非常に多いのです。そこで今回は何故サーバにアンチウィルスソフトを入れないサイトが多いのか述べてみます。

【理由1: サーバ用アンチウィルスソフトは高い】
PC用アンチウィルスソフトだと無料~数千円。それに対してサーバ用は数万円となります。サーバ台数が1台ならなんとか買えますが、サーバ台数が数百台とか数千台の規模になってくると全サーバにアンチウィルスソフトを入れることが財政上困難という場合があります。(無論それだけサーバを必要とするサイトであればそれなりに儲かっているだろうというツッコミはありそうですが)

【理由2: アンチウィルスソフトは重い】
パフォーマンスを追求しているWEBサイトにおいて、アンチウィルスソフトの動作はあまりにも重すぎます。アンチウィルスを入れたせいでフロントエンドWEBサーバの台数を5割増しにしなければならなくなったなどといった話しはよくある話しです。

【理由3: OSをカーネルレベルでいじっているため市販のアンチウィルスソフトが使えない】
ある程度の規模のサイトになると、何らかの形でOSをカーネルレベルでいじっている可能性が高いです。そうなってくると当然アンチウィルスソフトメーカーは動作を保証してくれません。メーカーが動作を保証してくれないアンチウィルスソフトなんて怖くて使えません。

【サーバにアンチウィルスソフトを入れなくて大丈夫なの?】
となると「サーバにアンチウィルスソフトを入れなくて大丈夫なの?」という疑問が当然出るかと思います。これは何とも答えにくい問いです。まず確実に言えるのは「アンチウィルスソフトが入っていれば100%安心ということは絶対ない」ということ。これを前提に、他の手段でセキュリティ対策を施すことになります。例えば、

・ファイアウォールレベルでサービスで使っていないTCP/UDPポートをふさいだり怪しいパケットを遮断する。
・WAF(WEBアプリケーションファイアウォール)などで怪しいリクエストを遮断する。
・重要なデータが入っているサーバ(DBなど)はネットワーク的に奥の奥のほうに置き、簡単にたどり着けないようにする。
・アプリケーション開発時にセキュリティホールがないよう最大限注意する。

などです。

| | Comments (2) | TrackBack (0)

November 12, 2008

httpd.confがどこにあるか簡単に見つけ出す方法

必要に迫られてhttpd.conf(apacheの設定ファイルですね)の所在地を簡単に見つけ出す方法を調べましたのでご紹介します。

【1. httpdのオプションを使う方法】
---------------------------------------------------
% httpd -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80 is a NameVirtualHost
default server www.example.com (/usr/local/apache2/conf/httpd.conf:1053)
port 80 namevhost www.example.com (/usr/local/apache2/conf/httpd.conf:1053)
---------------------------------------------------
のように出てきます。

【2. locateコマンドを使う】
---------------------------------------------------
% locate httpd.conf
/usr/local/apache2/conf/httpd.conf
---------------------------------------------------
のように出てきます。ただしlocate用のデータベースがないと使えません。データベースはroot権限でupdatedbコマンドを実行して作成する必要があります。

| | Comments (0) | TrackBack (0)

July 09, 2007

メンテナンス画面を簡単に出してみる

私が昔やっていた方法はメンテナンス画面表示専用ノートPCを用意する方法です。ノートPCにApacheを入れて超軽量メンテナンス画面データを置いておきます。メンテ時間になったらロードバランサーの向き先を切り替えるか、LANケーブルごとぷちっと差し替えることでメンテナンス画面に切り替えます。(ただし後者の場合はネットワーク機器にMACアドレスのキャッシュが残ることで通信できなくなる可能性があるのでその場合は適切に処理します)

さて、なぜこのような方法を取るようにしたか。

・まずメンテナンス画面専用機器を用意したのは、サーバのセキュリティパッチを適用したり再起動したりといったサーバ自体のメンテナンスが発生する場合単純に面倒くさいからです。

・ノートPCにしたのはバッテリーが付いているので一定期間バッテリーで動くからです。これなら電源まわりのメンテナンスも可能になります。

・専用ノートPCとは言ってもかなり低スペックのマシンでも十分だったので秋葉原で1万円で買ってきた超おんぼろPCでした。メンテナンスを行っていたのは深夜ばかりでしたし、メンテナンス画面が超軽量だったのでこの程度のマシンでも十分なんです。

メンテナンス画面と言えば、以下のようなことにも気をつけてました。

・メンテ終了予定時間近くになると急激にアクセスが増えてくるので、わざとメンテ終了時間を長めに書いておいた。

・メンテ時間を過ぎるとユーザの怒りが大きいので、そういう意味でもわざとメンテ終了時間を長めに書いておいた。

・メンテ終了予定時間を過ぎるとF5(or CTRL+F5)、俗称F5アタックを使ってリロードを試みる人が増えるのでますますサーバ負荷が上がってページが見えなくなる。これを防ぐためにいろいろなテクニックを使った(方法は内緒)。

・少しでもサーバ負荷を減らすために、HTTP Response headersを書き換えてWEBブラウザのキャッシュに残るようにした。ただしあまり長い時間キャッシュさせるとメンテが終わってもメンテ画面のままなのでほどほどにする。

| | Comments (0) | TrackBack (0)

January 06, 2007

WEBサイトの閉じ方について考える

WEBサイトの作り方について述べられた文献は多いですが、WEBサイトの閉じ方について述べられた文献は滅多に見ません。そこで今回は私が考えるWEBサイトの閉じ方について考えてみたいと思います。

【WEBサイト閉鎖までに行うこと】
流れとしてはこんな感じになるでしょう。

1.まず最初に「WEBサイトを○月○日に閉鎖します」というアナウンスを出す。
2.閉鎖日になったら「このサイトは○月○日に閉鎖しました」というアナウンスに切り替える。(WEBサーバごと切り替えるのが良し)
3.サービスに使っていたサーバを適切に処理する。
4.その後閉鎖告知ページを残すのであれば、そのページが残るように適切に処理する。

WEBサイト閉鎖はネガティブな作業であるためあまり気合が入らないかもしれませんが、最後まできちんと気を抜かずにがんばりましょう。

【閉鎖告知用サーバでよくあること】
・COPYRIGHT表記が古いまま
  →「Copyright (C) 1998 ○○」という表記を残す必要があるならきちんと毎年更新しましょう。

・WEBサーバにセキュリティパッチが適用されていない。
  →管理者不在になるためか、セキュリティパッチが適用されていない例が多いです。こういったサーバが踏み台にされやすいです。

・リンク切れ多発。
  →リンク先が更新された場合、きちんとリンクを変えましょう。

などなど、お粗末なことが多いです。閉鎖告知用サーバを持つのであればサービス用サーバ同様きちんと管理しましょう。

【おすすめ】
・閉鎖告知用サーバにもきちんと管理者を置く。

・もしくは多少費用がかかっても閉鎖告知用サーバはホスティング業者に管理を委託するのもあり(かなりお勧め)。

・サービスを閉鎖した場合データやプログラムのバックアップをサーバや社内に残しているところも多いが、放置された情報が一番流出の危険性が高いので、それらをCDRなどに焼いて銀行の貸し金庫に保管すると安全。

・閉鎖告知をやめる際のドメイン名処理に注意。ドメイン名を持ち続けるかもしくは信頼できる他社に売るというのがお勧め。何もしないとドメイン名転売業者が手に入れる可能性大。

などがあります。

| | Comments (3) | TrackBack (0)

December 26, 2006

続:複数WEBサーバへの最新ソースコード配信方法

前回複数WEBサーバへの最新ソースコード配信方法という記事を書きました。前回はやり方だけを記しましたが、実際に試してみるといろいろ注意すべき点がみつかります。そこで今回は続編としてそれらの注意点を記します。

【配信に失敗する場合があるので気をつける】
rsyncやrobocopyが常にうまく動いてくれればいいですが、たまに配信に失敗することがあります。例えば100台に配信しようとして99台だけうまくいって1台だけコケた場合を考えて見ましょう。この場合何も対策を行わないと発見が難しいです。最悪なのはユーザからの指摘で気づくことでしょう。

この対策にはいろいろあります。

 ・方法1:全サーバのコンテンツフォルダ配下のチェックサムを取って比較し同一なことをチェックする。(一番確実)

 ・方法2:rsyncやrobocopyのログを自動もしくは手動でチェックする。(うまくやらないと漏れが生じる可能性がある)

 ・方法3:version.htmlのようなファイルを作り配信日を入れてそれも配信する。配信後全サーバのversion.htmlの内容をチェックする。(実装は結構簡単)

 ・方法4:rsyncやrobocopyを3~5回繰り返す。(確実ではないけど大抵の場合うまく配信される。が、本質的な解決にはならない)


【HDD空き容量に気をつける】
配信に失敗する原因で一番多いのはHDD空き容量不足です。特定サーバだけ何故か巨大なログファイルが残っていてHDD容量不足で配信に失敗することが意外とよくあります。サーバリソース監視システムが導入されているのであれば発見が容易ですが、そうでないのであれば注意する必要があります。


【それ以外】
それ以外だと「ネットワーク障害」と「認証失敗」がまれに起こります。ネットワーク障害は、例えばLANケーブルが抜けかかっていただとかL2スイッチの特定ポートだけが故障したなどがあります。認証失敗は、例えばサーバの全パスワードを変更したつもりが1台だけ漏れていたなどがあります。


単純な作業の中にもいろいろノウハウがあります。なかなか奥が深いですね。

| | Comments (2) | TrackBack (0)

December 22, 2006

複数WEBサーバへの最新ソースコード配信方法

WEBサーバを数台用意して負荷分散している会社が多いと思います。このような場合必ず悩むのが、どうやって複数WEBサーバへ最新ソースコードを配信するかだと思います。そこで今回はソースコードを複数サーバにコピーする方法について述べてみたいと思います。

【その前にネットワーク確認】
まずはネットワークを確認したいと思います。ほとんどの会社は図1のような感じだと思いますが、安全性を考えればできれば図2のレベルまで持って行きたいところです。

Staging1
図1

Staging2
図2

【ステージングサーバを用意しよう】
次に押さえたいのがステージングサーバです。小さな会社ではWEB1にまずは最新ソースを置いて、そこから他のサーバにコピーする方法を取っているかもしれません。しかしいろいろな意味で配信専用のステージングサーバを別途用意することをお勧めします。ステージングサーバを用意することのメリットは

 1.ステージングサーバもWEBサーバと同じ設定をしておけば上で配信前の最後の最後にテストができる。
   →PCのhostsファイルに、サービス用FQDNをステージングサーバのIPで書くなどの方法でテスト可能。

 2.本番サーバとステージング用サーバで別々の権限設定ができる。
   →本番サーバにはシステム管理者しかアクセスできないが、ステージングは開発責任者以上とか。

 3.その他企業秘密で書けないけどやってみないとわからないメリットたくさん。

※ただしあまりに便利なステージングサーバ。死亡すると結構業務に支障が出るのでハードウェアはいいもの使ったほうがよいと思います。

【ソースコードを配信するためのコマンド】
興味があっていろいろな人に聞いてみましたが、UNIX/Linux系だとrsync、Windows系だとrobocopy.exeがとてもよく使われるようです(私も基本的にはそうです)。

rsyncはSSHを使った配信もできる反面、暗号化しながら送るので配信にとても時間がかかるというデメリットもあります。rsyncを使ったサンプルは以下のような感じです。


rsync -aurz -e ssh /var/www 192.168.0.101:/var/www

robocopy.exeはWindows2000のリソースキットに付いています。Windows2003のリソースキットに付いているかは知りませんが、Windows2000のrobocopy.exeがWindows2003で動くことは確認しています。robocopy.exeを使ったサンプルは以下のような感じです。まあシンプルですよね。


@echo off
REM robocopy /E /XO G:\ F:\

SET SRC_PATH=D:\www\src

CD D:\www\src

ECHO WEB1
D:\bin\robocopy.exe /E /XO /W:3 %SRC_PATH% \\192.168.0.101\src >> d:\Logs\logfile_WEB1.txt

ECHO WEB2
D:\bin\robocopy.exe /E /XO /W:3 %SRC_PATH% \\192.168.0.102\src >> d:\Logs\logfile_WEB2.txt

ECHO WEB3
D:\bin\robocopy.exe /E /XO /W:3 %SRC_PATH% \\192.168.0.103\src >> d:\Logs\logfile_WEB3.txt



双方のコマンドを利用するときの注意としては、「送信元にはあって送信先にないファイルを全て削除する」というオプションを付けると、配信時にコマンド入力を間違えると送信先のファイルが全部消えてしまうことがあります。この事故はとてもよく起こるので注意しましょう。



| | Comments (2) | TrackBack (0)

November 16, 2006

Cookie情報をWEBブラウザーで表示する方法

現在参照しているページに書き込まれているCookie情報を見たいときってありますよね。
そんな場合はWEBブラウザーのURL欄に

javascript:document.cookie;

と書き込むと見ることができます。

開発しているときはもちろんのこと、Cookie情報を元にしてロードバランスしているロードバランサーの挙動を追うときなんかにも有効に使えます。お気に入りにいれておくといいんじゃないでしょうか。

| | Comments (0) | TrackBack (0)

March 23, 2006

P3P(プライバシーポリシー)の設定方法


P3P(プライバシーポリシー)の設定方法

2年前にもP3Pの記事を書いているんですが、久しぶりにまた書いてみます。というわけで今回はP3P(プライバシーポリシー)の設定方法のご紹介です。

■作業手順
1.各WEBサーバのルートに「w3c」フォルダを作成する。
2.その中に定義ファイルとして「P3P.xml」というファイルを置く。
  (定義ファイル作成ツールがネット上にたくさんころがっているのでそれを利用す
  るとよいでしょう)
3.P3Pコンパクト・ポリシーをHTTPヘッダとしてブラウザに返すように指定する。
  (IISでは、サーバのプロパティ・ダイアログの[HTTPヘッダー]タブでブラウザに
  返すHTTPヘッダを指定できる。)

[設定例]
カスタムヘッダー名:P3P
カスタムヘッダー値:CP="内緒 内緒 内緒 内緒 内緒 内緒 内緒 内緒 内緒"


■参考資料
・P3Pの詳細説明 http://www.w3.org/P3P/
・P3P化設定が有効であるかどうかのチェック http://www.w3.org/P3P/validator.html

| | Comments (0) | TrackBack (0)

September 12, 2005

アクセスログを解析するツール

Webサーバなどのアクセスログを解析するツールとして特に有名な4つをご紹介。

■Analog
http://www.analog.cx/http://www.analog.cx/

■AWStats
http://awstats.sourceforge.net/

■HitBox
http://www.hitbox.com/

■Webalizer
http://www.mrunix.net/webalizer/

| | Comments (2) | TrackBack (0)