Yamamoto's Laboratory
WEB server
 初代
ファイルサーバー
コンピューター 自宅サーバー 初代サーバー (Fedora Core 8)

初代サーバー (Fedora Core 8)設定

初代の自宅サーバー (Fedora Core 8) の設定メモです.初代サーバーの引退したので,このページの更新は完了しています.

目次


初代サーバー  (2008.07.21—2012.06.10)

ネットオークションで落札した下の写真のPCを使っていました.当時でも,この程度のPCは見つけるのが大変なくらい古いものですが,サーバーには十分です.Fedora Core 8を入れて運用してました.

自宅の初代WEBサーバー.IBM NetVista 6843-22J (Celeron-950MHz, 512 MB).

2011年3月11日の東北地方太平洋沖地震の時は本棚から落ちたのですが,壊れることもなく,その後 1年以上も稼働しました.しかし,少しずつ挙動がおかしくなってきたので,引退させることを決意しました.最終稼働日は,2012年6月10日です.約4年間,ほとんど止まることなくWEBサーバーとしての役割を果たしました.

全文検索システム Namazu

WEBページがある程度大きくなると,検索システムを導入したくなります.私は,フリーの日本語全文検索システム Namazu を使っています.ここでは,その設定と運営に関するテクニックを紹介します.とはいえ,このページの多くの情報は「改訂 Namazuシステムの構築と活用」から得ています.また,私が最初に Namazu を設定したときには,「Fedoraで自宅サーバー構築」の「サイト内検索システム構築(Namazu)」を全面的にまねました.

Namazuとは

Namazuは,日本語全文検索システムです.フリーで ,Linux や Windows に対応しています.Webの全文検索システムにもってこいです.私のWebページの検索も,Namazuを使わせてもらっています.

Namazuのみでは,WEB内全文検索システムができるわけではありません.下の表に示すプログラムも使います.kakashiは,漢字仮名交じり文章を平仮名やローマ字綴りの文に変換するプログラムですが,ここでは分かち書き機能を使います.分かち書きとは,文を単語毎に区切る文章です.

Namazu を使った全文検索の構成プログラム
namazu日本語全文検索システム
kakashi分かち書きエンジン
nkf漢字コード変換フィルター

インストールと設定

インストールと設定は,結構面倒です.私の場合,以下に示す作業を行いました.

  1. 私の場合,Fedoraを使っていますので,yumでインストールができます.
    # yum -y install namazu
    # yum install kakasi-dict
  2. 索引を作成するコマンド mknmz の設定ファイル /etc/namazu/mknmzrc を編集します.このファイルに書かれた変数の値を設定することで,索引を作成するときの細かい調整ができます.mknmzrc 中の各変数の意味は下表の通りです.この変数は,Perl で書かれた mknmz で読み込まれます.変数の設定も,Perl の記法になっています.
    mknmzrcの設定変数
    $ADDRESS管理者の電子メールアドレス
    $HTML_SUFFIXHTML文書の拡張子
    $ALLOW_FILE索引作成対象ファイル
    $DENY_FILE索引作成拒否ファイル
    $DENY_DDNWindowsのDDNのファイルを排除のため
    $EXCLUDE_PATH索引作成対象から外すファイル
    $DIRECTORY_INDEXURL が / で終っている時に表示するファイル名
    $REMAIN_HEADER検索対象にするメール/ニュースのヘッダー
    $SEARCH_FIELDメール/ニュース(?)のフィールド検索の指定
    $META_TAGSフィールド内のメタタグの検索設定
    %FIELD_ALIASESフィールドのエイリアス設定
    $NON_SEPARATION_ELEMENTSHTML文書で単語と見なさないで,空白に置き換え
    $HTML_ATTRIBUTES検索可能なHTMLタグの設定
    $ON_MEMORY_MAX一度にメモリーにロードする最大サイズ(バイト)
    $FILE_SIZE_MAX処理する最大のファイルサイズ(バイト)
    $TEXT_SIZE_MAX処理する最大のテキストファイルサイズ(バイト)
    $WORD_LENG_MAX処理する最大の単語の長さ
    %WeightHTML文書の重み付けの点数
    $INVALID_LENGHTML文書中で,重み付けを行う最大文字数(注意)
    $MAX_FIELD_LENGTH検索によって表示される最大文字数(注意)
    $NKFnkfの起動方法
    $KAKASIkakasiの起動方法
    $CHASENchasenの起動方法(注意)
    $CHASEN_NOUNchasenの設定.内容はよく分からない.
    $MECABMeCabの設定,内容はよく分からない.
    $WAKATI分かち書きの設定.kakasi または chasen
    $LIBDIRPerlライブラリのディレクトリ
    $FILTERDIRフィルターのディレクトリー
    $TEMPLATEDIRテンプレートのディレクトリー

私の mknmzrc は,次の通りです.元ものあったコメント (#以降)はすべて取り除いています.

001   $ADDRESS = 'ymm10m34@khaki.plala.or.jp';
002   $HTML_SUFFIX = "html?|[ps]html|html\\.[a-z]{2}|php";
003   $ALLOW_FILE =   ".*\\.(?:$HTML_SUFFIX)|.*\\.txt" . # HTML, plain text
004           "|.*\\.gz|.*\\.Z|.*\\.bz2" .       # Compressed files
005           "|.*\\.pdf|.*\\.ps" .          # PDF, PostScript
006           "|.*\\.tex|.*\\.dvi" .         # TeX, DVI
007           "|.*\\.rpm|.*\\.deb" .         # RPM, DEB
008           "|.*\\.doc|.*\\.xls|.*\\.pp[st]" . # Word, Excel, PowerPoint
009           "|.*\\.docx|.*\\.xlsx|.*\\.pp[st]x" . # MS-OfficeOpenXML Word, Excel, PowerPoint
010           "|.*\\.vs[dst]|.*\\.v[dst]x" .     # Visio
011           "|.*\\.j[sabf]w|.*\\.jtd" .        # Ichitaro 4, 5, 6, 7, 8
012           "|.*\\.sx[widc]" .                 # OpenOffice Writer,Calc,Impress,Draw
013           "|.*\\.od[tspg]" .                 # OpenOffice2.0
014           "|.*\\.rtf" .                      # Rich Text Format
015           "|.*\\.hdml|.*\\.mht" .        # HDML MHTML
016           "|.*\\.mp3" .              # MP3 
017           "|.*\\.gnumeric" .                 # Gnumeric
018           "|.*\\.kwd|.*\\.ksp" .             # KWord, KSpread
019           "|.*\\.kpr|.*\\.flw" .             # KPresenter, Kivio
020           "|.*\\.eml|\\d+|[-\\w]+\\.[1-9n]"; # Mail/News, man
021   $DENY_FILE = ".*\\.(gif|png|jpg|jpeg)|.*\\.tar\\.gz|core|.*\\.bak|.*~|\\..*|\x23.*";
022   ;$DENY_DDN = "con|aux|nul|prn|lpt[1-9]|com[1-9][0-9]?|clock\$|xmsxxxx0";
023   $EXCLUDE_PATH = undef;
024   $DIRECTORY_INDEX = "index.html|index.php";
025   $REMAIN_HEADER = "From|Date|Message-ID";
026   $SEARCH_FIELD = "message-id|subject|from|date|uri|newsgroups|to|summary|size";
027   $META_TAGS = "keywords|description";
028   %FIELD_ALIASES = ('title' => 'subject', 'author' => 'from');
029   #$NON_SEPARATION_ELEMENTS = 'A|TT|CODE|SAMP|KBD|VAR|B|STRONG|I|EM|CITE|FONT|U|'.
030                           'STRIKE|BIG|SMALL|DFN|ABBR|ACRONYM|Q|SUB|SUP|SPAN|BDO';
031   $HTML_ATTRIBUTES = 'ALT|SUMMARY|TITLE';
032   $ON_MEMORY_MAX   = 10000000;
033   $FILE_SIZE_MAX   = 20000000;
034   $TEXT_SIZE_MAX   =  6000000;
035   $WORD_LENG_MAX   = 128;
036   %Weight = 
037        (
038         'html' => {
039            'title '  => 16,
040             'h1'     => 8,
041             'h2'     => 7,
042             'h3'     => 6,
043             'h4'     => 5,
044             'h5'     => 4,
045             'h6'     => 3,
046             'a'      => 4,
047             'strong' => 2,
048             'em'     => 2,
049             'kbd'    => 2,
050             'samp'   => 2,
051             'var'    => 2,
052             'code'   => 2,
053             'cite'   => 2,
054             'abbr'   => 2,
055             'acronym'=> 2,
056             'dfn'    => 2,
057         },
058         'metakey' => 32, # for <meta name="keywords" content="foo bar">
059         'headers' => 8,  # for Mail/News' headers
060    );
061   $INVALID_LENG = 128; 
062   $MAX_FIELD_LENGTH = 200;
063   $NKF = "module_nkf"; 
064   $KAKASI = "module_kakasi -ieuc -oeuc -w";
065   $CHASEN = "no";
066   $CHASEN_NOUN = "no";
067   # $MECAB = "/usr/bin/mecab -Owakati -b 8192";
068   $WAKATI  = $KAKASI;
069   # $LIBDIR = "@PERLLIBDIR@";
070   # $FILTERDIR = "@FILTERDIR@";
071   # $TEMPLATEDIR = "@TEMPLATEDIR@";
072   
073   

バックアップ

バックアップ用スクリプト

サーバーの運用では,データを失わないようにすることが最も重要です.そのために,データのバックアップが効果的です.これは,手動ではとても面倒なので,自動的にコンピューターにやらせることにします.そこで,このページを参考にして,次のような Perl のスクリプトを書きました.これを coron を使い定期的に実行させると,「/home」と「データベース」が自動的にバックアップできます.

サーバーのハードディスクの自動バックアップスクリプト(backup.pl).

001   #!/usr/bin/perl
002   #============================================================================
003   # サーバーのデータバックアップ
004   #   元ネタは、次のWEBページ.
005   #     http://lucenhangul.com/wiki/lucenwiki?itemid=68
006   #   ここに書かれていたシェルスクリプトを Perl に直した.
007   #                    Masashi Yamamoto
008   #                          ymm10m34@khaki.plala.or.jp
009   #============================================================================
010   $today       = `date +%Y%m%d`;                      # 本日の日付
011   $oldday      = `date --d "1 months ago" +%Y%m%d`;   # これよりも古いものは削除
012   $mysql       = "/usr/bin/mysql";
013   $db_dump     = "/usr/bin/mysqldump";
014   $db_user     = "xxxxxxxxx";                         # データベースのユーザー名
015   $db_passwd   = "xxxxxxxxx";                         # データベースのパスワード
016   $home_dir    = "/home";                             # バックアップ対象ディレクトリー
017   $backup_dir  = "/mnt/LinkStation/web_backup";       # バックアップの場所
018   $backup_HOME = "HOME";
019   $backup_DB   = "DB";
020   $log_file    = "log.txt";
021   
022   chomp $today;
023   chomp $oldday;
024   
025   &open_log;
026   &mk_dir;
027   &home_backup;
028   &db_backup;
029   &rm_old_backup;
030   &close_log;
031   
032   #============================================================================
033   # ログファイルのオープン
034   #============================================================================
035   sub open_log{
036       my $time;
037       $time=localtime;
038       open(LOG, ">>$log_file");
039       printf LOG "$time\n";
040       printf LOG "$today\n";
041   }
042   
043   #============================================================================
044   # ログファイルのクローズ
045   #============================================================================
046   sub close_log{
047       my $time;
048       $time=localtime;
049       printf LOG "$time\n\n";
050       close LOG;
051   }
052   
053   #============================================================================
054   # バックアップ用のディレクトリーの作成
055   #============================================================================
056   sub mk_dir{
057       if(! -e "$backup_dir/$today"){
058   
059           `mkdir -p $backup_dir/$today/$backup_DB`;
060       if(-d "$backup_dir/$today/$backup_DB"){
061           printf LOG "make DB  \t$backup_dir/$today/$backup_DB \n";
062       }
063   
064       `mkdir -p $backup_dir/$today/$backup_HOME`;
065       if(-d "$backup_dir/$today/$backup_HOME"){
066           printf LOG "make HOME\t$backup_dir/$today/$backup_HOME\n";
067       }
068       }
069   }
070   
071   #============================================================================
072   # ホームディレクトリーのバックアップ
073   #============================================================================
074   sub home_backup{
075       my $user, @user_list;
076       my $ret;
077   
078       opendir(DIR, $home_dir);
079   
080       while (defined($user=readdir(DIR))){   # ディレクトリー名の取得
081       if((-d $home_dir.'/'.$user) && 
082          ($user ne ".") && ($user ne "..")){
083           push(@user_list, $user);
084       }
085       }
086       
087       foreach(@user_list){                   # tarを使ってバックアップ
088       $ret=system("tar cPfz $backup_dir/$today/$backup_HOME/$_.tar.gz \\
089                         $home_dir/$_");
090       printf LOG "backup home dir\t$_\t\t$ret\n";
091       }
092   
093       closedir(DIR);
094   }
095   
096   #============================================================================
097   # データベースのバックアップ
098   #============================================================================
099   sub db_backup(){
100       my $database, @list;
101       my $ret;
102   
103       $database = 
104       `$mysql -u $db_user --password=$db_passwd -e "show databases" | 
105                grep -v Database`;
106   
107       @list = split(/\n/,$database);
108   
109       foreach(@list){
110       $ret =  system("$db_dump -u $db_user --password=$db_passwd $_ > \\
111               $backup_dir/$today/$backup_DB/$_.DB.sql");
112       printf LOG "backup data base\t$_\t\t$ret\n";
113       }
114   }
115   
116   #============================================================================
117   # 期限の過ぎたバックアップの削除
118   #============================================================================
119   sub rm_old_backup(){
120       my $dir, @dir_list;
121       my $ret;
122   
123       opendir(DIR, $backup_dir);
124   
125       while (defined($dir=readdir(DIR))){   # ディレクトリー名の取得
126       if((-d $backup_dir.'/'.$dir) && 
127          ($dir ne ".") && ($dir ne "..")){
128           push(@dir_list, $dir);
129       }
130       }
131   
132       close DIR;
133   
134       @sort_dir_list = sort{$a<=>$b}@dir_list;
135   
136       for($i=0; $i<@sort_dir_list; $i++){
137       if(($i < @sort_dir_list-1) && ($sort_dir_list[$i]<$oldday)){
138           $ret = system("rm -rf $backup_dir/$sort_dir_list[$i]");
139           printf LOG "delete old backup\t$sort_dir_list[$i]\t$ret\n";
140       }
141       }
142   }
143   
144   

定期的に実行

いざというときに大事なデータを復旧させるためには,まめに,バックアップ作業を行っておく必要があります.サーバーのハードディスクが壊れたとき,バックアップは二年前のものしかないとなると泣けてきます.定期的にコマンドを実行させるには,cron を使うのが良いでしょう.私の場合は,1週間に1回バックアップをとれば十分なので,/var/spool/cron/root に次のように記述しました.

03 04 * * 2 /root/BackUp/backup.pl

これで,毎週火曜日の AM4:03 に定期的にバックアップスクリプトが実行されます.

バックアップメディア

サーバーマシーンのハードディスクにバックアップをとったのではあまり意味がありません.サーバーのハードディスクが故障したとき,バックアップのデータも失われる可能性が高いからです.サーバーマシーンの他のハードディスクという方法もありますが,サーバーマシーンが落下すると,同時にハードディスクが壊れるでしょう.DVD-RAMは良い方法かもしれません.残念ながら,私のサーバーには,DVD-RAMはありません.自宅を見渡したところ,Buffalo社のLinkStationというNASサーバーがありまた.WEBサーバーとは別の部屋にありますので,これに定期的にバックアップを保存することにします.家が燃えたり,地震でつぶれない限り,安心です.とはいえ,このバックアップもたまには,他のメディアにバックアップととる必要があるかもしれません.

backup NAS server
定期的にデータをバックアップしている NAS サーバー

ページ作成情報

参考資料

  1. 最初,Namazu を設定するときには,「Fedoraで自宅サーバー構築」の「サイト内検索システム構築(Namazu)」を参考にしました.
  2. Namazuの詳細は,「改訂 Namazu  システムの構築と活用」が大変参考になります.
    改訂 Namazuシステムの構築と活用
    改訂 Namazuシステムの構築と活用馬場 肇

    ソフトバンククリエイティブ 2003-07-01
    売り上げランキング : 189401

    おすすめ平均 star
    star第3版に相当

    Amazonで詳しく見る
    by G-Tools
  3. バックアップのスクリプトは,[Linux] サーバーバックアップ「backup.sh」を参考にしました.

更新履歴

2008年 ページの新規作成
2014年02月07日 更新終了宣言


no counter