2008年8月17日日曜日

Monitでサービス・プロセス監視、止まったら勝手にリスタート(1)

Linuxサーバの話。
シンプルにサーバ上のプロセス監視をしたければ「Monit」が最近のお気に入りです。
 
プロセスの自動再起動とかは、「qmail+FreeBSDでdaemontoolsを使う」といった組み合わせをしたことはありますが、どうにもプロセスの堅牢化まで手順が多くて大変でした。
 
この前CentOS5でちょっと止まりにくい(止まってもすぐわかる)サーバを作らないといかんとなったので、外部監視はNagios、内部リソース情報取得にNRPE、そしてプロセスの死活監視をMonitでやって見たところMonitの使い勝手が思いのほか良かったので使い方を記事にしておく。
 

Monit公式サイトとマニュアルドキュメント
http://www.tildeslash.com/monit/
http://www.tildeslash.com/monit/doc/


 

    Monitによるローカルプロセス監視の特徴のうち、お気に入り&気になるポイント一部抜粋
  • 監視対象プロセスの起動手順に変更の必要がない
    Monitは単体で完結して各監視、アラート通知をしてくれます。メールサーバは適当なものを指定する。

  •  
  • 起動および停止スクリプトの指定をしておき、対象プロセスの起動・停止が可能
    止まっていたらアラートと同時にプロセスの起動ができる、起動したら次の監視タイミングで復帰の通知
    また、指定回数連続して起動失敗したらあきらめてくれるので無限ループにはならない

  •  
  • PIDファイルを指定しておけばPIDとプロセスを紐づけし、変更を検知できる
    監視対象が「プロセス名+PID」の組み合わせになるのでより細かいプロセス監視ができる。
    手動でサービスリスタートが発生した場合などにアラートをあげることができる

  •  
  • 簡易サービスチェックが可能
    HTTPなど代表的なプロトコルはサーバレスポンスも見るほか、SSL可のTCPセッションで監視可能
    結果NGなら再起動などの条件指定

  •  
  • initが監視するプロセスとして、リスポーンオプションを指定した起動が可能
    これのおかげでとにかく固い印象、initがmonit自身を監視してリスポーンする。initの停止=サーバシステムの停止なのでそれの検知は外部監視でやっている。

  •  
  • 依存関係登録可能(試してない)
    公式のドキュメントより、具体的には「oracleリスタートしたらapacheもリスタートする必要があるよね…」という場合にどうぞという機能らしい

  •  
  • 関連するバイナリやコンフィグファイルやの改ざんチェックが可能(試したけど使わなかった)
    依存関係の機能関連として、プロセスが依存する対象にファイルチェックを指定できる。改ざんがあったらプロセスを止めるといった利用ができる
    これは単純に偉いと思うがメンテナンスしにくくなるので使わなかった。


 
 
さてそんなMonit、とりあえずの監視などは簡単に構築できるので公式のドキュメントでもいいが、日本語で見たい時は下記サイトがお勧めです。
内容は少し前のバージョンですがとても詳しい。使うだけでなく理解したい場合はこちらへ。

 
 

このブログではMonitをrpmまたはyumからインストールしてHTTPSのWEB管理画面、メール通知設定と監視設定を記事にします。
しかし長いので記事を3つくらいに分ける。
 

続きはこちら → Monitでサービス・プロセス監視、止まったら勝手にリスタート(2)
 
 



Monitでサービス・プロセス監視、止まったら勝手にリスタート(1)
Monitでサービス・プロセス監視、止まったら勝手にリスタート(2)
Monitでサービス・プロセス監視、止まったら勝手にリスタート(3)
Monitでサービス・プロセス監視、止まったら勝手にリスタート(4)

2008年8月14日木曜日

MicrosoftDNSサーバのイベントID4515を解消する

WindowsServer2003で構成されたActiveDirectoryのドメインコントローラで、DNSが起動する際にイベントID4515を記録するときがあります。
関連して色々と調査したので情報エントリ、関連リンク先を一通り理解すればイベントID4515が発生する原因は全部潰せるとおもいます。
 
ActiveDirectoryのスキーマに精通してLDAPの理解があれば苦労しなかったのでしょうがなかなかそうもいかない…
イベント ID : 4515
ソース : DNS
種類 : 警告
説明 : ゾーン example.local はディレクトリ パーティション MicrosoftDNS から既に読み込まれましたが、ディレクトリ パーティション DomainDnsZones.example.local でこのゾーンの別のコピーが見つかりました。DNS サーバーはこのゾーンの新しいコピーを無視します。この競合をできるだけ早く解決してください。
※サーバイベントログより引用

 

あるお客さんの環境で発生したので、これを下記マイクロソフトのKBをを参考に解消しようとするとどうも細部が違う。

Windows Server 2003 の DNS サーバー ログにイベント ID 4515 が記録される
http://support.microsoft.com/kb/867464/ja


 

ADSIEDITを使用して ForestDnsZones と DomainDnsZones を参照したが、重複する情報は特にない。イベントログの文言も今回のケースとは少し違った。
 














表:この環境で確認できた状況
確認先状況
ForestDnsZonesサブドメイン「_msdcs.example.local」のゾーン情報が入っている
DomainDnsZonesexample.localのゾーン情報が入っているが情報が古い

 
結局、MicrosoftKBの解説はあくまで2003仕様のActiveDirectoryの話で、今回のケースでは過去にWindows2000Serverで構築されていたドメインとWindowsServer2003の”新ドメイン”があり、それらを統合する為に色々と相互接続設定をを試した名残があったのだろうということに落ち着いた。
 
 

以下調べたことをつらつらと記述。
 

DNSのActiveDirectory統合ゾーンがカギ


ActiveDirectory(以下AD…)で使うDNSはゾーン情報をAD内に持っています。
DNS(Domain)用のアプリケーションディレクトリパーティションがあって、それが「ForestDnsZones」と「DomainDnsZones」、Domain~ のほうは2003用ADにドメイン構築した際の「名前そのままゾーン」の保管先として、 "example.local" のリソースレコードが並んでいる。
Forest~ のほうは"example.local"ドメイン作成時に自動的に作られる委任サブドメイン"_msdcs.”ゾーンが、これにはSRVレコードが含まれる。
"_msdcs.”はアイランド問題の解消のため設置、フォレスト内のドメインコントローラに一意な識別子を設定する。
 

しかしこれらはWindows2000のADスキーマにはいない、もともと2000のADが抱えていた問題解消+いろいろ拡張性を考慮して改良したから。
 

関連用語のMS公式解説 (※解釈おかしい箇所があるかも知れないので要確認)
アプリケーションディレクトリパーティション(リンク:TechNet)
Windows2000ADのアイランド問題(リンク先の中段くらい)
ゾーン レプリケーション スコープ(リンク:TechNet)

では2000のADでゾーンはどこにいたのか探す。
WindowsでDNSの管理コンソールを立ち上げて、ActiveDirectory統合ゾーンのプロパティを見たらゾーンレプリケーションスコープの選択がある、選択肢は下記のリンク。
 


 

これがADの保管先と対応しているので表にしてみた。

















表:ADスキーマとAD統合ゾーンDNSとの関係
ADエントリゾーン情報のあるDN
/対応するゾーン レプリケーション スコープ
ForestDnsZonesCN=MicrosoftDNS, DC=ForestDNSZones, DC=example, DC=local
/ Active Directory フォレスト内のすべての DNS サーバー
DomainDnsZonesCN=MicrosoftDNS, DC=DomainDNSZones, DC=example, DC=local
/ Active Directory ドメイン内のすべての DNS サーバー
SystemCN=MicrosoftDNS, CN=System, DC=example, DC=local
/ Active Directory ドメイン内のすべてのドメイン コントローラ

 

統合ゾーンDNSの3つ目の保管先、"CN=MicrosoftDNS, CN=System"


SystemのMicrosoftDNSを調べると、ちゃんと "example.local"ゾーンが最新の状態で保管されている。
ちなみに "CN=System" の中身は DNを"DC=example, DC=local" として開く=ADSIEDITのデフォルトで開いているDNから簡単にたどれる。
さらにちょっと寄り道すると、実際のADのレプリケーションでレプリカされるのはこの情報で、ADのDNSはゾーン転送とかするわけでなく、ADのアプリケーションディレクトリパーティションを読み込む・更新を適用する、という動作をしている。
 

ということで上記ディレクトリパーティションはWindowsのDNSサーバが起動する際にゾーン情報を「System」→(「ForestDNSZones」→「DomainDNSZones」※カッコ内は未確認)という順番で読み込んでいるんだろうなと。
 

ほか今回確認した時点ではSystemには「逆引きDNSゾーン」、と「RootDNSサーバ達」のゾーンが格納されていた。
 

DNS管理コンソールで確認すると、正引き、逆引きともに ゾーン レプリケーション スコープ は「Active Directory ドメイン内のすべてのドメイン コントローラ」となっていた、上記対応表どおりだ。
 

なおRootDNSサーバゾーンは各DNSサーバサービス固有のものなのでSystemでいい。
 
 


実際どれを消したらいいのか


ここまでわかれば後は簡単だった。
「DomainDNSZones」の"CN=MicrosoftDNS"から"example.local"ディレクトリを削除してDNSを再起動、DNSイベントログにID:4515の警告はもう出ない。
 

結局はイベントログの "説明:" セクションを読み返してみると、ログ様の仰せのとおりだったと事後になって理解。警告・エラーを調査すると結局はいつもこうなりますね。
 
 

すでに2000Serverを使ったドメインコントローラなくなっていたので、そのあと正引き、逆引きゾーンの ゾーン レプリケーション スコープ を「Active Directory ドメイン内のすべてのドメイン コントローラ」から「Active Directory ドメイン内のすべての DNS サーバー」 に変更した。
※2000Serverが残っている場合もADスキーマ更新で行けるようです。
 

作業後のディレクトリパーティションとゾーン情報は下記になった。

















表:作業後のゾーン格納パーティション
ADエントリ保持しているゾーン情報
ForestDnsZones"_msdcs.example.local"
DomainDnsZones"example.local"
その他逆引きゾーン
System. (ルートDNSサーバの一覧)

 
 

まるまる当てはまる事例は少ないかも知れませんが、ID:4515で「ForestDNSZones」、「DomainDNSZones」、「MicrosftDNS(※このイベントログで出てくる際にはSystemを指す)」のキーワードに迷った人にこのエントリを参考にしてもらえると。

2008年8月12日火曜日

VirtualServer・VirtualPCに仮想COMポート経由でwindbgをアタッチ

Microsoftが配布しているWindowsのデバッガ、windbgというものがある。
どうもよくわからない不具合の出るソフトがあったので、VirtualServer仮想PC上でwindbgを走らせてみようと思ってMicrosoftのKBでwindbgの情報を探してみる。
 
VirtualServer・VirtualPCのホストOSから、ゲストOSのカーネルにアタッチする方法があったので試してみた、多少本筋からずれた気もするがやむなし。
 

How to debug a virtual machine on a host computer(略) part 1 of 2
How to debug a virtual machine on a host computer(略) part 2 of 2


 

Part1では仮想PCのカーネルにアタッチする方法、Part2はVirtualServer自身のデバッグ方法?かな、2はあまり読んでない。
 

詳しくはPart1を見るとわかるので、設定する箇所を画像でメモ。
[caption id="attachment_539" align="alignnone" width="300" caption="画像:ゲストOSのCOM1を名前付きパイプに接続"]画像:ゲストOSのCOM1を名前付きパイプに接続[/caption]
 
ゲストOSの COM1 に「\\.\pipe\com2」という名前付きパイプ(※ややこしくて失礼、com2の部分は名前なので何でもよい)に接続します。
UNCなので途中のピリオドはlocalホストを表し、もちろんUNCパスなら他のPCでもよい(はず)。
 

ゲストOS上での準備としてboot.iniをデバッグオプション有効にしておく必要があります、msconfigコマンドなどを使用して設定。

 

[caption id="attachment_540" align="alignnone" width="399" caption="画像:デバッガも名前付きパイプに接続"]画像:デバッガも名前付きパイプに接続[/caption]
 
ゲストOSのカーネルにアタッチする準備。
画像はwindbgの[File]メニューからカーネルデバッグを選択した後の名前付きパイプへの接続設定。
 

 

[caption id="attachment_541" align="alignnone" width="300" caption="画像:仮想OSのカーネルデバッグ出力が得られている"]画像:仮想OSのカーネルデバッグ出力が得られている[/caption]
 
windbgを待ち状態にした後、ゲストOSを起動したところ。アタッチはいつでもできる模様。
さっそくいろいろ例外を吐いてくれている、とりあえずF5で先に進める。
 
 

[caption id="attachment_542" align="alignnone" width="300" caption="画像:Breakしてレジスタを表示してみる"]画像:Breakしてレジスタを表示してみる[/caption]
 
折角なので「Ctrl+Break」!!カーネルを止めてみる。
普段OSが勝手に止まると色々冷や汗ものだが、自分の意思で止めるというのはなかなかどうして面白い。
 
 


しかしプログラミングの知識があるわけでないので、個人では「!analyze -v」コマンドで自動解析をしてもらうくらいしか使い道がない。
困ったらプログラムがわかる人に聞いてみよう。

2008年8月8日金曜日

WindowsDNSサーバが大量のUDPポートを待ち受けるように実装変更

Windows付属のDNSサーバを使っているサーバに、2008年7月のMicrosoftセキュリティ更新プログラム、MS08-37:DNS の脆弱性により、なりすましが行われる(KB953230)を適用すると、UDPポートの待ち受け状況がすごいことになる。
 
[caption id="attachment_533" align="alignnone" width="450" caption="画像:「netstat -na」の実行結果、笑えるくらい待ち受けている"]画像:\"netstat -na\"の結果、笑えるくらい待ち受けている[/caption]
何気なく"netstat -na"を実行したらUDPの待ち受けがずらずら出てくる、すごく多いのでどうしたことかと思ったら、しっかり公式に解説があったので一安心。
なんとその数2500ポート、DNSの更新情報は重要なのでしっかり読んでおくべきでした。
 
[caption id="attachment_534" align="alignnone" width="450" caption="画像:ついでに「netstat -nba」で待ち受けているプロセスを表示、たしかにDNS"]画像:ついでに「netstat -nba」で待ち受けているプロセスを表示、たしかにDNS[/caption]
WindowsServer2003で確認したが、更新対象に2000と2008も入っているので同様でしょう。
 
※パッチ一覧ではDNS サーバー (KB951746) のほう、クライアントは(KB951748)
 
 
以下関連情報へのリンクとちょっと解説など

2008年8月7日木曜日

Windowsはリソースキット、サポートツールと管理ツールを追加しないと

社内で自分のメモ用に使っていた情報をWEBにあげておく。
このエントリは内容が古くなったらちょくちょく更新する予定、(すでにちょっと古い?あとで追加しないと。)
このほかMS製ツールは沢山あるが、きりがないのでベーシックな範囲で。
 

概要と見出し


Windowsサーバを構築する場合、
標準のコンポーネントに加えて追加するべきツールが配布されている。
 
説明については主にWindowsServer2003のものだが、新旧その他バージョンでも意識してよい内容のはず。(追:末尾にWindowsServer2008の特設場を設置)
 
現在下記カテゴリが登録されています。
  • サポートツール・リソースキット(Windowsサーバ共通)

  • ActiveDirectoryを使うDCサーバに追加
  • InternetInformationServices(IIS)を使うWEBサーバに追加

  • クライアントOSからサーバを管理するツール

 
 

サポートツール・リソースキット(Windowsサーバ共通)


[説明]
主に管理者向けのツール群、必須
詳細はインストールした後にヘルプを読む
 
[注意事項]
各OSバージョン、SPの状況に適合するものを導入すること。
SPのバージョンアップの際も再配布される。
日本語版は無い
 
[追記事項]
パスを通しておくと便利
 
[入手先など]
サポートツールはWindowsServerのCD内にもこっそり同梱されている
--CD の Support\Tools フォルダにある Suptools.msi プログラムを実行します
 
他WEBから、サポートツール// Windows Server 2003 Service Pack 1 32-bit Support Tools
http://www.microsoft.com/downloads/details.aspx?FamilyID=6ec50b78-8be1-4e81-b3be-4e7ac4f0912d&DisplayLang=en
 
// Windows Server 2003 Service Pack 2 32-bit Support Tools
http://www.microsoft.com/downloads/details.aspx?FamilyID=96a35011-fd83-419d-939b-9a772ea2df90&DisplayLang=en
リソースキット// Windows Server 2003 Resource Kit Tools
http://www.microsoft.com/downloads/details.aspx?familyid=9D467A69-57FF-4AE7-96EE-B18C4790CFFD&displaylang=en

 

ActiveDirectoryを使うDCサーバに追加


なしでAD管理はしんどい

★グループポリシー管理コンソール★


最近は最初から入ってるんだっけ…?
[説明]
グループポリシーの管理、適用先などを視覚的に管理できる。
 
WindowsServer2003 かWindowsXP用
グループ ポリシー管理コンソール (GPMC) Service Pack 1
http://www.microsoft.com/downloads/details.aspx?FamilyID=0a6d4c24-8cbd-4b35-9272-dd3cbfc81887&DisplayLang=ja

 

InternetInformationServices(IIS)を使うWEBサーバに追加


IIS6以降はよいですよね。

IISリソースキット


[説明]
テスト用自己証明書の発行やIISのメタベース参照ツールが入っている。
 
[注意事項]
Metabase Explorer は色々強力、使ったら消しといたほうがよいくらい。
 
[追記事項]
Log Parser は最新版を別途入れたほうがよい。
 
Internet Information Services (IIS) 6.0 Resource Kit Tool
http://www.microsoft.com/downloads/details.aspx?FamilyID=56fc92ee-a71a-4c73-b628-ade629c89499&DisplayLang=en

LogParser


[説明]
色々な形式のログを扱って出力できる、入力・出力とも対応形式が多い
 
[注意事項]
操作はSQLライク
 
Log Parser 2.2 日本語版
http://www.microsoft.com/downloads/details.aspx?FamilyID=890CD06B-ABF8-4C25-91B2-F8D975CF8C07&displaylang=ja

 

クライアントOSからサーバを管理するツール


Vista追加しないと。2008でServerCoreなんかをやろうとするなら必携のはず。
 
[説明]
クライアントOSからサーバ管理するツール、特にドメイン環境で威力。
いちいちリモートデスクトップでサーバにログインしなくともいろいろ出来る。
 
Windows Server 2003 Service Pack 2 管理ツール パック (x86 エディション用)
http://www.microsoft.com/downloads/details.aspx?familyid=86B71A4F-4122-44AF-BE79-3F101E533D95&displaylang=ja
 
Windows Server 2003 R2 管理ツール パック (x86)
http://www.microsoft.com/downloads/details.aspx?familyid=9BFB44F5-232A-4FB5-BC14-45BFD81B7AC1&displaylang=ja<

 
 

WindowsServer2008 特設


2008は色々かわってますね。
 

Windows NT バックアップ/復元ユーティリティ


[説明]
Windows XP および WindowsServer2003 上に作成されたバックアップ(NTBackup形式)を、Windows Vista および WindowsServer2008 が稼働しているコンピュータに復元するユーティリティ
復元専用。
Windows NT バックアップ/復元ユーティリティ
 
http://www.microsoft.com/downloads/details.aspx?FamilyID=7da725e2-8b69-4c65-afa3-2a53107d54a7&DisplayLang=ja

 
 

あと、サポートツールとリソースキット込みのコマンドライン活用に詳しい本。
MS-DOSバッチファイルを作るなら持っておくとよいです。

2008年8月6日水曜日

MySQLでデータベース作って専用ユーザ作成

メモエントリ
 
CMSなどを構築するときにMySQLで専用のDBを作成して、そのDBに対するすべての権限を持ったユーザを作成する。
いつもGRANTの所でなんだっけ?となるのでメモ。
 
まずいずれかでmysqlコンソールに接続
  • root@localhost空パス(デフォルト)
    # mysql

  • root@localhostのパスあり
    # mysql -p
    < <(rootのパスワード入力)

  • 別の管理用ユーザ
    # mysql -u {管理用ユーザ} -p
    < <(管理用ユーザのパスワード入力)


 
★mysqlコンソールへ
mysql> CREATE DATABASE hogehogeDB DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)
 
mysql> GRANT ALL PRIVILEGES ON hogehogeDB.* TO "hogehoge_user"@"localhost" IDENTIFIED BY "{password}";
Query OK, 0 rows affected (0.00 sec)
DB・ユーザ名とパスワードは任意
 
デフォルトで選択する文字コードがUTF-8の「hogehogeDB」を作成して、管理用ユーザの「hogehoge_user」、パスワードは"password" ができた。
 
 
 
ついでにパスワード変更とGRANTで権限を変更した時の権限テーブルの再読み込み
mysql> SET PASSWORD FOR root@localhost=PASSWORD('wordpass');
 
mysql> FLUSH PRIVILEGES;

2008年8月5日火曜日

IISのログファイルをUTF-8で記録する

IISのログを解析するのにLogParserはとても便利。
IISログのフィールドをカラムに見立ててSQL(っぽい)クエリで解析したり統計を取ることができます。
 
しかしIIS6ではログファイルのエンコードがデフォルトではANSIのため、リファラなどにUTF-8の日本語が突っ込まれて一部が文字化けしたログをLogParserに食わせると該当の行でカラムの区切りがうまくいかずに(※)行単位で無視されてしまいます。
 
(※「ログのロウが予期せず終了しています。」というエラー)
 
 
そういうことで困ったら、IIS6が出力するログのエンコードをUTF-8にしてしまうのがよいです。
 

英語以外の言語とセキュリティのために UTF-8 形式を有効にする
http://technet2.microsoft.com/WindowsServer/ja/library/b5060e4e-8573-4992-830b-98dd368714f11041.mspx?mfr=true


 
上記は文字だけなので変更箇所のスクリーンショットを。
[caption id="attachment_524" align="alignnone" width="469" caption="図:IIS6のログをUTF-8で保存するオプション"]図:IIS6のログをUTF-8で保存するオプション[/caption]
 
ちなみにこのオプションでログのファイル名が変わります。
今まで"exyymmdd.log"だったのが、"u_exyymmdd.log" になる、バッチでの自動化をしている場合は要注意。
 
 
ところでWindowsServer2008で使われるIIS7ではどうなんでしょう。
[caption id="attachment_525" align="alignnone" width="450" caption="図:IIS7ではデフォルトでUTF-8、ほかで選べるのはANSI"]図:IIS7ではデフォルトでUTF-8、ほかで選べるのはANSI[/caption]
 
こちらはデフォルトでUTF-8、ログファイルも"u_exyymmdd.log" ですね。
 
 
 
LogPaeserはその他、イベントログ・パフォーマンスログをはじめ各種ログ形式に対応しており、組み合わせと工夫でいきなりグラフ画像を出力する事もできるなど有用なツールです。
Windows運用管理では必須といってよいかも。(費用かければまた違うかも知れませんが。)