28:Apacheアクセスログ解析(AWStats)のインストール

http://www.starplatinum.jp/awstats/awstats70/を参考にしました。このページの “AWStats Ver.7.0完全日本語版のダウンロード” からダウンロードし、解凍をしておきます。(/Download/Awstats/AWStats70_Jpn に解凍)
私はvirtualhostで数個のWEBを動かすつもりなのでプログラム(.pl)は共通に出来るが、設定ファイルは独立していなければならない。と言う事で
データーとプログラムは /webdata/awstatsに置く。設定ファイルは /etc/awstats/awstats.www,kinryokai.net.conf とする
プログラムをコピーしrenameする。
# cp -pr /Download/Awstats/AWStats70_Jpn/wwwroot/cgi-bin/ /webdata/awstats
icon関連をコピーしますが、私はデフォルト(/var/www/icons)では無く /webdata/icons にしていますので
# cp -pr /Download/awstats/AWStats70_Jpn/wwwroot/icon/ /webdata/icons/
後で、必要になるファイルを/usr/share/perl5にコピー
# cp /Download/awstats/AWStats70_Jpn/tools/awstats_updateall.pl /usr/share/perl5/
# cp /Download/awstats/AWStats70_Jpn/tools/awstats_buildstaticpages.pl /usr/share/perl5/
awstatsを動かすにはCustomlog をcombined にしなくてはならないが、前の /etc/httpd/conf.d/virtualhost.confの設定で
CustomLog logs/kinryokai_access_log combined env=!no_log にしているので問題ない。
/etc/awstats/awstats.www,kinryokai.net.conf の設定をしますがサンプルがありますのでそれを変更します。
# mkdir /etc/awstats
# mv /webdata/awstats/awstats.model_jp.conf /etc/awstats/awstats.www.kinryokai.net.conf
同じ場所にある awstats.model.confは使いませんので削除しておきます。
# gedit /etc/awstats/awstats.www.kinryokai.net.conf

LogFile="/var/log/httpd/kinryokai_access_log"
SiteDomain="www.kinryokai.net"
HostAliases="localhost 127.0.0.1 REGEX[kinryokai\.net$]"
DirData="/webdata/awstats"
DirCgi="/awstats"
DirIcons="/icon"

上記は変更した部分のみ書き出してあります。
次に jcode.pm をインストールしますが、yumから出来ます。
# yum -y install perl-Jcode
で、/usr/share/perl5/Jcode.pm にインストールされた。
と、ここで困ったことになった。と言うのは私はプログラムはvirtualhost全部で同じプログラム(perl)を使おうとしているが、utf8_decode.plの中にホスト名前を設定する所がある。そうするとプログラムが共通にならない。
utf8_decode.pl をハックして、ホスト分のチェックをするようにしてもいいが(実は私はperlをあまり理解していないので大変そう)、この数年のWEBのログを見てみる と(完全に見た訳ではないが)全角で記録されている部分が見あたらなった。このutf8_decode.plと言うものは(多分)ログに全角がある時に使 うと思うので、私はこの変換をしないことにした。
と言う事はawstatsだけならJcode.pmはインストールしなくてもよかったが、わざわざ消すこともないのでそのままにする。/etc/awstats/にあるconfファイルはvirtualhost分用意をするので、プログラムは共通化出来る。
なので、http://www.starplatinum.jp/awstats/awstats70/の3、4、5はやらない。
今はテストでapacheを動かしているので、ログは無いに等しいので、現在アクティブなWEBからログをコピーする。前回はNFSでコピーしたが、今回はrsyncでコピーする。
まず、/etc/rsyncd.conf の修正

[ht-log]
	  path         = /var/log/httpd
          auth users   = root
          secrets file = /etc/rsyncd.secrets
          read only    = no

を最後に追加し、CentOSはxinetd経由で動かしているので、
# service xinetd restart
*****************
ここからはコピー元のホストで
# rsync -av –delete –password-file=/etc/rsync.passwd /var/log/httpd/ rsync;//コピー先のIP/ht-log
(; は 本当は : )でデーターをコピーします。
*****************
ここで設定中のホストに戻ります。
私の場合はサーバーのマイグレーションなので、既にawstatsのデーターは元のサーバーで出来ており、これはすでにrsyncで/webdataをコピーした時に終わっている。
初期データーの作成はhttp://centossrv.com/awstats.shtmlの(1)AWStatsデータベース初期作成を参考にしてください。
/etc/httpd/conf.d/awstats.confに

Alias /icon/ /webdata/icons/
ScriptAlias /awstats/ /webdata/awstats/
<Directory /webdata/awstats/>
	DirectoryIndex awstats.pl
	Options ExecCGI
	order deny,allow
	deny from all
	allow from all
	#allow from 192.168
</Directory>

と記入し、httpd を再起動して設定ファイルを読み込ませる。この設定はすべてのホストから見れてしまう設定になっています。
テ ストをしたいが、www.kinryokai.net としてもアクティブなWEBを参照し、このテストのWEBには来ないので、/etc/hosts の “192.168.xxx.xxx www.kinryokai.net www” のIPをこのテスト用のサブホストのIPに変更し、ブラウザで www.kinryokai.net/awstats/awstats.pl にアクセスすると表示される筈.
ここからはまだ確認が終わっておりませんので、間違えがあるかも
httdのログの内容をawstatsに反映させてからロテイトするように、/etc/logrotate.d/httpd を

/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    prerotate ←ここから
        `/usr/share/perl5/awstats_updateall\.pl` now -confdir="/etc/awstats" \
        -awstatsprog="/webdata/awstats/awstats\.pl >/dev/null
    endscript ←ここまで追記
    #delaycompress ←圧縮はしないのでコメントアウト
     postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}

1時間毎にawstatsを更新する為に /etc/cron.hourly/awstats を作成

/usr/share/perl5/awstats_updateall.pl now -confdir="/etc" \
awstatsprog="/webdata/awstats/awstats.pl" >/dev/null

perlプログラムへのパスは各自の環境に合わせて下さい。
静的なHTMLのデータの作成
まずは/etc/httpd/conf.d/awstats.conf の最後に

Alias /awreport /webdata/awreport/kinryo

1日1回データーを作ります。そのスクリプトは

#!/bin/sh

site=$1
DirReport=$2

reportbuild() {
    # AWStatsデータベース更新中断時ロックファイル残存対処(ここから)
    if [ -f /tmp/awstats.$site.lock ]; then
        ps -p `cat /tmp/awstats.$site.lock |awk '{print $6}'`
        if [ $? -ne 0 ]; then
            echo /tmp/awstats.$site.lock removed >&2
            rm -f /tmp/awstats.$site.lock 
        fi
    fi
    # AWStatsデータベース更新中断時ロックファイル残存対処(ここまで)
    /usr/share/perl5/awstats_buildstaticpages.pl \
    -awstatsprog=/webdata/awstats/awstats.pl\
    -config=$site -update -lang=jp -dir=$DirReport \
    -year=$YEAR -month=$MONTH -builddate=$YEAR$MONTH
    # 個別ページリンク切れ対処(ここから)
    sed -i "s/href=\"${site}/href=\"awstats.${site}/g" \
    $DirReport/$YEAR$MONTH.html
    # 個別ページリンク切れ対処(ここまで)
    if [ "$YEAR$MONTH" = $(date +%Y%m) ]; then
        mv $DirReport/awstats.$site.$YEAR$MONTH.html $DirReport/index.html
    else
         mv $DirReport/awstats.$site.$YEAR$MONTH.html $DirReport/$YEAR$MONTH.html
    fi
}

ls $DirReport/* > /dev/null 2>&1
if [ $? -eq 0 ]; then
    YEAR=`date --date '1 days ago' +%Y`
    MONTH=`date --date '1 days ago' +%m`
    for site in `ls -l /etc/awstats |grep -v ~$|cut -d' ' -f 11|sed -e '/^$/d'|cut -d . -f 2-4`
					# ↑ 全virtual host名を抽出する
    do
         DirReport=/webdata/awreport/`echo $site|cut -d . -f 2`
         reportbuild
    done
else
    DirAwstats=`grep ^DirData /etc/awstats/awstats.$site.conf|awk -F= '{print $2}'|tr -d \"`
    				# ↑ awstatsのデーターがあるdirectoryを抽出
    for log in `ls $DirAwstats/awstats*.$site.txt`
    do
        YEAR=`echo $log|cut -d / -f 6|cut -d . -f 1|sed -e 's/awstats..\([^ ]*\)/\1/p' -e d`
        MONTH=`echo $log|cut -d / -f 6|cut -d . -f 1|sed -e 's/awstats\([^ ]*\)..../\1/p' -e d`
        reportbuild
    done
fi

私の環境はvrtualhostが5個も走っているので、色々参考に考えましたが、まだ検証していないので、このスクリプトはまったく自信がありません。多分数ヶ所間違えていると思います。検証をしたら、この一文を取ります。
これをawstatsreport.shとして/rootにしまい、パーミッションを変更し、毎日零時にHTML作成スクリプトを走らせます。
# chmod 700 awstatsreport.sh
# echo “00 00 * * * root /root/awstatsreport.sh > /dev/null” > /etc/cron.d/awstatsreport
最後にhttp://centossrv.com/referer_spam.shtmlを参考にリ ファラースパムの設定をしておくが、virtual webが5つも動いており、図部手のwebに設定すると時間がかかりそうなので、apacheとawstatsのログからリファラースパムを除去するスク リプトは作っておきません。スパムを発見したら、/etc/httpd/conf.d/referer_spam.confに追記し、apacheを reloadすれば以降は記録されません。また追加したスパムは

SetEnvIfNoCase Referer (\.|/)sportliga\.net no_log
SetEnvIfNoCase Referer (\.|/)sugarkun\.com no_log
SetEnvIfNoCase Referer (\.|/)lorazepam\.pw no_log
SetEnvIfNoCase Referer (\.|/)alprazolam\.pw no_log
SetEnvIfNoCase Referer (\.|/)blesktatu\.ru no_log
SetEnvIfNoCase Referer (\.|/)tyudon\.com no_log
SetEnvIfNoCase Referer (\.|/)bag77\.ru no_log
SetEnvIfNoCase Referer (\.|/)mxhack\.ru no_log
SetEnvIfNoCase Referer (\.|/)error404\.000webhost\.com no_log
SetEnvIfNoCase Referer (\.|/)berrymall\.ru no_log
SetEnvIfNoCase Referer (\.|/)trazodone\.pw no_log
SetEnvIfNoCase Referer (\.|/)buyviagraonlineprof\.com no_log
SetEnvIfNoCase Referer (\.|/)fluoxetine\.pw no_log
SetEnvIfNoCase Referer (\.|/)randecan\.com no_log
SetEnvIfNoCase Referer (\.|/)telesvoboda\.ru no_log
SetEnvIfNoCase Referer (\.|/)kochanelli\.com no_log
SetEnvIfNoCase Referer (\.|/)alkorpkf\.ru no_log
SetEnvIfNoCase Referer (\.|/)pornotubexxx\.name no_log
SetEnvIfNoCase Referer (\.|/)chimiver\.info no_log
SetEnvIfNoCase Referer (\.|/)zolotoy-lis\.ru no_log
SetEnvIfNoCase Referer (\.|/)lovecs\.ru no_log

です。

カテゴリー: 省エネサーバー製作(CentOS 6) | コメントする

27:Webサーバー間通信内容圧縮(mod_deflate)

ダイジェスト認証に関して、http://blogs.yahoo.co.jp/mazbeer/309776.htmlにおもしろい記事を見つけた。一度見てみるといい。
本題に入ろう。mod_deflateはデフォルトで導入されているので、その設定ファイルと作る
# gedit /etc/httpd/conf.d/deflate.conf

<Location />
 # DEFLATEの有効化
AddOutputFilterByType DEFLATE text/html text/plain text/xml

# 送信先ブラウザがNetscape 4.xの場合はtext/htmlのみ圧縮
BrowserMatch ^Mozilla/4 gzip-only-text/html

# 送信先ブラウザがNetscape 4.06-4.08の場合は圧縮しない
BrowserMatch ^Mozilla/4\.0[678] no-gzip

# 送信先ブラウザがMSIEの場合は全て圧縮する
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# プロキシサーバーが圧縮未対応ブラウザへ圧縮ファイルを送信しないようにする
Header append Vary User-Agent env=!dont-vary
</Location>

設定の反映
# service httpd reload

カテゴリー: 省エネサーバー製作(CentOS 6) | コメントする

26:Webサーバー間通信内容暗号化

ここも私のバイブルであるhttp://centossrv.com/apache-ssl.shtmlを参考
mod_sslのインストール
# yum -y install mod_ssl
ディレクトリーを移動する
# cd /etc/pki/tls/certs/
サーバー用証明書有効期限を1年から10年に変更
# sed -i ‘s/365/3650/g’ Makefile
サーバー用秘密鍵・証明書作成
# make server.crt

前略
Enter pass phrase: ← 任意のパスワードを入力、後で消去するので何でもいい※表示はされない
Verifying - Enter pass phrase: ← 入力したのパスワードを応答(確認)※表示はされない
中略
Enter pass phrase for server.key: ← 上記で応答したパスワードを応答※表示はされない
中略
Country Name (2 letter code) [GB]:JP ← 国名応答
State or Province Name (full name) [Berkshire]:Tokyo ← 都道府県名応答
Locality Name (eg, city) [Newbury]:Ota-ku ← 市区町村名応答
Organization Name (eg, company) [Default Company Ltd]:kinryokai.net ← サイト名応答(なんでもいい
Organizational Unit Name (eg, section) []: ← 空ENTER
Common Name (eg, your name or your server's hostname) []:kinryokai.net ← Webサーバー名応答
Email Address []:webmaster@kinryokai.net ← 管理者メールアドレス応答

サーバー用秘密鍵からパスワード削除
# openssl rsa -in server.key -out server.key
ちなみに最近世間を騒がしたSSLの問題は(ここに詳しく説明がある)
openssl-1.0.1e-16.el6_5.7以上がインストールされればOKです。
確認は
# yum list installed | grep openssl

カテゴリー: 省エネサーバー製作(CentOS 6) | コメントする

25:phpMyAdminをインストール

以前使っていた、phpmyadmin4.2.2をインストールしようと思いましたが、ここによると4.2.7.1未満のバージョンにはクロスサイトスクリプティングの脆弱性が存在するそうですので、最新の4.6.1にしようとか、でもこのバージョンはMySQL 5.5、php 5.5以上を要求します。CentOS 6.7 のphpは5.3.3でバージョンを上げてもいいのですが、phpの5.3と5.5では色々は細かな変更がある様で、XOOPSを使った(文字コード:EUCーJP)WEBに影響が出そうなので(http://xoops.ryus.co.jp/modules/d3blog/details.php?bid=382に解説がある)、もう少し勉強してからphpのバージョンを上げることにした。phpmyadminのバージョンを下げ4.0.10.15にする。https://www.phpmyadmin.net/downloads/から
phpMyAdmin-4.0.10.15-all-languages.tar.gzをダウンロードし、適当な場所に保存したら、ファイルを右クリックし、解凍をしておく。(phpMyAdmin-4.0.10.15-all-languagesというディレクトリーが出来るので、それを自分のWEBにコピー後、名前をphpMyAdminに変更しておく。そしてブラウザから自分のURL/phpMyAdmin(localhost/phpMyAdminでも可)にアクセス後、mysqlに登録しているユーザー名、パスワードでログインをする。
ログイン後、右ペインの下の方に4つの知らせが書いてあった。Screenshot

1つ目は”phpMyAdmin の新しいバージョンが提供されています。アップグレードの検討をお奨めします。最新バージョンは 4.4.15.5 で、2016-02-29 にリリースされています。”とバージョンが上がっていますとの事。これは先般承知なので、無視

2つ目は” phpMyAdmin 環境保管領域が完全に設定されていないため、いくつかの拡張機能が無効になっています。理由についてはこちらをご覧ください。”とある。

3つ目は”設定ファイルに、暗号化 (blowfish_secret) 用の非公開パスフレーズの設定を必要とするようになりました。”とありこれは地色がピンクでいかにもやばそう。

4つ目は”お使いになっている PHP の MySQL ライブラリのバージョン 5.1.72 が MySQL サーバのバージョン 5.6.29 と異なります。これは予期しない不具合を起こす可能性があります。”とある。これはmysqlを5.6にバージョンアップしてあるので、出ているワーニング。

早速、2つ目から対処する。(参考:http://www.dbonline.jp/phpmyadmin/setting/index1.html)phpMyAdmin 上で、右ペインのインポートタブをクリックし、参照をクリックし、インストールしたexamplesの中にあるcreate_tables.sqlを指定 し、実行(スクロースダウンしないと見えない)をクリックし、phpmyadminデーターベースをインポートします。ブラウザの再読み込みを行うと、左 ペインにphpmyadminが出来ています。phpmyadmin用のユーザーの作成及びconfigファイルの設定をしていきます。
まず右ペインのSQLタブをクリックし、
GRANT ALL ON phpmyadmin.* TO pma@localhost IDENTIFIED BY ‘xxxxxxx’;
(xxxxxxx は設定したいパスワード)を入力し、実行をクリックするとユーザーが作成されます。その確認は左ペインのmysqlをクリックするとテーブルが表示されま すので、userをクリックすると、右ペインにユーザとしてpmaが出来ています。

URL/phpMyAdmin/に config.sample.inc.php がありますので、これをconfig.inc.phpに変更し、下記の設定をしますが(変更部分のみ抜粋)

/* User used to manipulate with storage */ 
$cfg['Servers'][$i]['controlhost'] = '';
$cfg['Servers'][$i]['controlport'] = '';
$cfg['Servers'][$i]['controluser'] = 'pma';
$cfg['Servers'][$i]['controlpass'] = 'xxxxxxx';
/* Storage database and tables */ 
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin'; 
$cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark'; 
$cfg['Servers'][$i]['relation'] = 'pma_relation'; 
$cfg['Servers'][$i]['table_info'] = 'pma_table_info'; 
$cfg['Servers'][$i]['table_coords'] = 'pma_table_coords'; 
$cfg['Servers'][$i]['pdf_pages'] = 'pma_pdf_pages'; 
$cfg['Servers'][$i]['column_info'] = 'pma_column_info'; 
$cfg['Servers'][$i]['history'] = 'pma_history'; 
$cfg['Servers'][$i]['table_uiprefs'] = 'pma_table_uiprefs'; 
$cfg['Servers'][$i]['tracking'] = 'pma_tracking'; 
$cfg['Servers'][$i]['designer_coords'] = 'pma_designer_coords'; 
$cfg['Servers'][$i]['userconfig'] = 'pma_userconfig'; 
$cfg['Servers'][$i]['recent'] = 'pma_recent';
$cfg['Servers'][$i]['favorite'] = 'pma__favorite';
$cfg['Servers'][$i]['users'] = 'pma__users';
$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
$cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
/* Contrib / Swekey authentication */
$cfg['Servers'][$i]['auth_swekey_config'] = '/etc/swekey-pma.conf';

$cfgで始まる行のコメントを外す。xxxxxxxは今、設定したパスワード。
phpMyAdminからログアウト後、ログインすればOK

3つ目はhttp://www.la-nouveau.mydns.jp/wordpress/?p=99を参考にexpectをインストールし、mkpasswdを行う
# yum -y install expect
# mkpasswd -l 46
でもって、ここで表示されたランダムのパスワードをphpMyAdminの下にあるconfig.inc.phpの$cfg[‘blowfish_secret’]の所に書き込めばOK。

4つ目は現時点では問題はなさそう。解決方法を研究中

カテゴリー: 省エネサーバー製作(CentOS 6) | コメントする

24:apacheの設定

基本的にはhttp://centossrv.com/apache.shtmlを参考にした。

やっとWEBサーバーの設定になりますが、まず必要なプログラムのインストール(apacheはデフォルトでインストール済み)
# yum -y install php php-mbstring mysql mysql-server php-mysql
作ろうとしているWEBはXOOPSを使用しておりますので、mysql関係が必要です。
/etc/httpd/conf/httpd.confの設定。基本的にはhttp://centossrv.com と同じだが、変更した部分だけを記す。

KeepAlive ON ←多分少しはコネクションをキープした方が良さそうだから。
ServerAdmin xxxxxx@kinryokai.net
#ServerName www.example.com:80 ←virtualhost.conf で設定
#DocumentRoot "/var/www/html" ←virtualhost.conf で設定

<Directory />
    Options Includes ExecCGI FollowSymLinks  ←Includes ExecCGI を記入
    AllowOverride None ←.htaccessは使わないので、noneのまま
</Directory>

<Directory "/var/www/html"> から </Directory> までを消去。
これはdocument rootの設定だが、virtualhost.conf で設定

DirectoryIndex index.html index.php index.html.var ←index.phpを追加

SetEnvIf Request_URI "\.(gif|jpg|png|JPG|GIF|PNG|bmp|css|ico|ICO)$" no_log ←追加
SetEnvIf Request_URI "default\.ida" no_log ←追加
SetEnvIf Request_URI "cmd\.exe" no_log ←追加
SetEnvIf Request_URI "root\.exe" no_log ←追加
SetEnvIf Request_URI "Admin\.dll" no_log ←追加
SetEnvIf Request_URI "NULL\.IDA" no_log ←追加
SetEnvIf Remote_Addr 192.168 no_log ←追加
SetEnvIf Remote_Addr 127.0.0.1 no_log ←追加
#CustomLog logs/access_log combined env=!no_log ←コメントアウト、virtualhost.confで設定

Alias /icons/ "/xxxxx/icons/" ←場所を変更
<Directory "/xxxxx/icons">

#<IfModule mod_dav_fs.c> ←webdav.conf で設定
    # Location of the WebDAV lock database.
#    DAVLockDB /var/lib/dav/lockdb
#</IfModule>

#ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"  ←virualhost.confで設定
#<Directory "/var/www/cgi-bin">
#    AllowOverride None
#    Options None
#    Order allow,deny
#    Allow from all
#</Directory> 

をしていく。最後の方のパーティションを作るあたりは今回は既に出来ているので、無視していい。
AllowOverride None は説明が要るかな。

https://httpd.apache.org/docs/current/ja/howto/htaccess.html
の ”いつ .htaccess ファイルを使う(使わない)か。”を参照してください。

virtualhost の設定をする。
/etc/httpd/conf.d/virtualhost.conf に

NameVirtualHost *:80
# kinryokai
<VirtualHost *:80>
    DocumentRoot /xxxxxxx/public/kinryokai
    ServerName www.kinryokai.net
    ServerAlias kinryokai.net
    ErrorLog logs/kinryokai_error_log
    CustomLog logs/kinryokai_access_log combined env=!no_log
    <Directory "/xxxxx/public/kinryokai/upfiles">
        SetEnvIf Referer "^http://www\.kinryokai\.net" ref_ok
        order deny,allow
        deny from all
        allow from env=ref_ok
    </Directory>
    <Directory "/xxxxx/public/kinryokai/uploads">
        SetEnvIf Referer "^http://www\.kinryokai\.net" ref_ok
        order deny,allow
        deny from all
        allow from env=ref_ok
    </Directory>
    ScriptAlias /cgi-kinryo/ "/xxxxx/cgi-kinryo/"
    <Directory "/xxxxx/cgi-kinryo">
        AllowOverride None
        Options None
        SetEnvIf Referer "^http://www\.kinryokai\.net" cgi-kinryo_ok
        order deny,allow
        deny from all
        allow from env=cgi-kinryo_ok
    </Directory>
</VirtualHost>

この設定の意味はcentocsrv.comを参考にしてください。
又、 “/xxxxx/public/kinryokai/upfiles”と “/xxxxx/public/kinryokai/uploads” の設定はここに画像などを置いておくので、他のWEBからリンクを張られ、遅くなるのを防ぐ設定です。
もう一度 conf のチェック
# apachectl configtest
ここを参考にmysqlの設定、起動をしてください。
デフォルトではアップ出来るサイズが小さいので、/etc/php.iniを変更します。

post_max_size = 50M
upload_max_filesize = 50M
date.timezone = Asia/Tokyo ← 先頭の;を取るのを忘れずに

上記のように3ヶ所変更をします。
webサーバーの起動
# service httpd start
# chkconfig httpd on
今はテストなので/etc/hostsにこのサーバーのIPとURLを設定し、
ブラウザでwww.kinryokai.net にアクセスし、表示されればOK。
マイグレーション時にルーターの設定を変更し、このサーバーにフォワードする。

カテゴリー: 省エネサーバー製作(CentOS 6) | コメントする

12:バックアップサーバーにwebサーバーを追加する

まだapacheなどの設定が終わっていませんが、作ったWEBサーバーがバックアップされるように設定をしていきます。
まずはwebサーバーでbaculaに必要なプログラムをインストール
# yum -y install bacula-client bacula-console
次に/etc/bacula/bacula-fd.confの設定
# gedit /etc/bacula/bacula-fd.conf

Director {
  Name = bacula-dir
  Password = "XXXX"
}
Director {
  Name = bacula-mon
  Password = "xxxx"
  Monitor = yes
}
FileDaemon {
  Name = web-fd       ← bacula-dir.confの名前に合わせる
  FDport = 9102        # where we listen for the director
  WorkingDirectory = /var/spool/bacula
  Pid Directory = /var/run
  Maximum Concurrent Jobs = 20
}
# Send all messages except skipped files back to Director
Messages {
  Name = Standard
  director = bacula-dir = all, !skipped, !restored
}

次に/etc/bacula/bconsoleの設定
# gedit /etc/bacula/bconsole.conf

Director {
  Name = bacula-dir
  DIRport = 9101
  address = 192.168.xxx.xxx ← directorの動いているホストの指定をする
  Password = "xxxxx"
}

bacula-fdをスタートしておく
# service bacula-fd start
# chkconfig bacula-fd on
*************
ここからバックアップサーバーの設定
/etc/bacula/bacula-dir にWEBサーバーを追加するが、追加する項目は
Job { Name = “Backup-web”
Job { Name = “Restore-web”
FileSet { Name = “Full web”
Client { Name = web-fd
の 四つであるが、それぞれ他のサーバーの設定から容易に設定内容が見当がつくと思われるので、ここでは表示しない。ただ FileSet の設定には注意の事。私の場合は/abcd1や/abcd2は別のパーティションをマウントしているので includeに設定が必要になる。
設定が終わったら、bcula-dir を再起動
# service bacula-dir restart
webサーバーの最初のバックアップをする
# bconsole

Connecting to Director localhost:9101
1000 OK: bacula-dir Version: 5.0.0 (26 January 2010)
Enter a period to cancel a command.
*run ← 緑は入力する文字
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
A job name must be specified.
The defined Job resources are:
     1: Backup-samba
     2: Backup-kvm
     3: Backup-web
     4: BackupCatalog
     5: Restore-samba
     6: Restore-kvm
     7: Restore-web
Select Job resource (1-7): 3
Run Backup job
JobName:  Backup-web
Level:    Incremental
Client:   web-fd
FileSet:  Full web
Pool:     File (From Job resource)
Storage:  File (From Job resource)
When:     2014-05-20 21:46:47
Priority: 10
OK to run? (yes/mod/no): yes

これでバックアップが始まり、最初なのでかなり時間がかかる。

カテゴリー: Baclua(バックアップ)に挑戦 | コメントする

22:webサーバーを作る準備

ここを参照しクローンを作る。
次にこのサーバーにマウントする領域を設定していくが、このWEBサーバーの構成は
vda: ここにさらに領域が作られ、ルートが出来ている。
vdb: SWAP領域
vdc: /Downloadにマウントされる、他のサーバーと共有している。ここまではクローンで出来ている
vdd: /abcd1にマウント、ここにWEBコンテンツ、mysqlのデーターなどが保存される。
vde: /abcd2にマウント、ruby on rails のデーター保存場所
vdf: /abcd3にマウント、メールデーターの保存場所

マウント場所はダミーです。

元のサーバーとIPなどがダブっているが、参照先にその変更方法もあるので済まして置く。
次にサーバーを起動し、/etc/fstab を設定、下記を最後に追記

/dev/vdd		/abcd1	ext4	defaults		0 0
/dev/vde		/abcd2	ext4	defaults		0 0
/dev/vdf		/abcd3	ext4	defaults		0 0

新しいdirectoryの作成とアトリビュートの設定
# mkdir /abcd1
他のパーティションも設定する
そして設定の反映
# mount -a
次は本来ならapacheの設定だが、私はサーバーのマイグレーションをやろうとしているので、データーのコピーが必要。
色々考えたがrsyncを使うことにした。今はテストの段階だが、いずれデーターが必要なのでrsyncで同期をして置くことにした。
完全にテストが終わり、マイグレーションを実施する直前に再度 rsysnc で同期を取る。
rsyncの使い方はここに詳しく解説がある
rsyncデーモンをコピー元で動かすか、コピー先で動かすか迷ったが、コピー先つまりこのサーバーで動かすことにした。
CentOSではrsyncのデーモン動作はxinetd経由で動かすのだが、インストール済みである。また/etc/xinetd.d/rsync もxinetdのインストール時に出来ている。

service rsync
{
	disable	= no ← noに変更
# 	flags		= IPv6
 	socket_type     = stream
 	wait            = no
 	user            = root
 	server          = /usr/bin/rsync
 	server_args     = --daemon
 	log_on_failure  += USERID
}

flags=IPv6の設定の意味がよく分からない。これを行うとIPv4とIPv6の両方アクセプトするのか(多分この意味と思うが)、IPv6だけで通信を行うのか不明なのでコメントアウトしておいた。
次にrsyncの設定ファイルを作る
# gedit /etc/rsyncd.conf

# Global options
uid           = root
gid           = wheel
use chroot    = yes
log file      = /var/log/rsyncd.log
pid file      = /var/run/rsyncd.pid
hosts allow   = 192.168.xx.xx/24
hosts deny    = *
dont compress = *.gz *.tgz *.zip *.pdf *.sit *.sitx *.lzh *.bz2 *.jpg *.gif *.png

# Module options
[abcd1]
         comment      = rsync server
         path         = /abcd1
         auth users   = root
         secrets file = /etc/rsyncd.secrets
         read only    = no
[abcd2]
 	 comment      = rsync server
         path         = /abcd2
         auth users   = root
         secrets file = /etc/rsyncd.secrets
         read only    = no
[abcd3]
 	 comment      = rsync server
         path         = /abcd3
         auth users   = root
         secrets file = /etc/rsyncd.secrets
         read only    = no
 

hosts allow = で接続出来るホストをローカルネットワークに限定している。(xx.xx は環境に合わせる)
パスワードファイルの設定 /etc/rsyncd.secrets

root:xxxxxxxxx

ユーザー名:パスワードのように設定。
私はrsyncd.confに別のユーザーを指定したが出来なかった。rootにすると出来るようになった。又、このパスワードはOSのパスワードとは関係ない、勝手に決めてよい。
xinetdを再起動すればRQが来た時、動作する
# service xinetd restart
xinetdの再起動までやったが、ここはdaemonモードでやりたいので、rsyncをデーモンでスタートする
# rsync –daemon
ちなみに停止はPIDを調べてkillする
# ps auxww | grep ‘rsync –daemon’

root      2183  0.0  0.0 107624   536 ?        Ss   12:52   0:00 rsync --daemon
root      2328  0.0  0.0 107464   892 pts/0    S+   13:03   0:00 grep rsync --daemon

# kill 2183
***************
ここからはコピー元のサーバーの設定。
パスワードファイルを作る。これはなくてもパスワードを聞いてくるのですが、スクリプトを組、cronで定期的に実行するにはパスワードを聞いて来ては困るので、それに備え作っておく。
# gedit /etc/rsync.passwd

xxxxxxx

とパスワードだけを書いておくそうな。
rsyncのデーモン動作の解説WEBには複数のユーザー設定もあるが、ユーザー名の指定が無いがどう動作するのかなー?
早速コピーをするが、万が一コピー元とコピー先を間違えると全部消えるので、まずはドライラン(実際にコピーはせずテストのみする)
rsyncの書式は rsync オプション コピー元 コピー先なので
# rsync -avn –password-file=/etc/rsync.passwd /webdata/ rsync://192.168.xx.xx/abcd1
もし、ユーザー認証で跳ねられる時は、rsync.passwd とrsyncがデーモンで動いているホストの rsyncd.secrets のパーミッションが600になっているか確認。
大丈夫そうなので
# rsync -av –password-file=/etc/rsync.passwd /webdata/ rsync;//192.168.xx.xx/abcd1
もちろんIPは今制作中のホスト。
最初はrsyncd.confの auth users = root と secrets file = /etc/rsyncd.secrets をコメントアウトし、テストした方が問題が切り分けやすい。
もちろん –password-file=/etc/rsync.passwd は付けない
同様に他のパーティションもコピーするがその前に元のWEBサーバーに登録してあるユーザーをこのサーバーにも登録しておく。ただしUIDを同じにしないといけない。
書式:useradd オプション 登録するユーザー名
私はこのWEBサーバーにFTPで接続を許すユーザーがおり、homeディレクトリーが違う。そのようなユーザーには
# useradd -u 元のWEBと同じUID -d 指定するディレクトリー ユーザー名
新規ユーザー作成ではGIDも指定したUIDと同じだが、usermodでUIDを変更したら、group IDも変更しておく
# groupmod -g 元のWEBと同じGID グループ名
次に作ったユーザーのパスワードを設定
書式:passwd ユーザー名
で2回同じパスワードを入れ設定する。
必要であれば所有者の変更(UIDが違う場合)
書式:chown -R ユーザー名:グループ名 設定するdirectoryのフルパス
その後rsyncで/homeをコピーする
****************
その後、制作中のホストに戻っておく。

カテゴリー: 省エネサーバー製作(CentOS 6) | コメントする

11:リストア速度(Building directory treeの速度)が劇的に早くなった

今までBuilding directory treeに時間が掛かっていたのはMYSQLの設定だった。
時間が掛かりすぎるのでbacluaのメーリングリストで聞いたら、やっぱりおかしいようだ。
一番の問題点はMYSQLのデーターベースエンジンに MyISAMを使っている事みたい。
これをInnoDBに変更する。ALTER TABLE テーブル名 ENGINE=InnoDB; を行なえと書いてあるが、データーベースごとそっくり変更出来ないかと調べたが、テーブル単位でしか出来ないようだ。
それではとデーターベースをエクスポートして、データーベース名を変更し、新規にbaculaをInnoDBで作り、インポートしたらおかしくなっていた。インポートしたファイルを見るとDBの指定がMyISAMになっていた。
面倒くさいので、既存のDBのテーブルを一つずつInnoDBにしてから
http://bacula.us/tuning/ にあるように /etc/my.cnf に

    sort_buffer_size = 2MB
    innodb_buffer_pool_size = 128MB
    innodb_flush_log_at_trx_commit = 0
    innodb_flush_method = O_DIRECT

を追記し、mysqlを再起動、テストで

+-------+-------+----------+---------------+---------------------+------------+
| JobId | Level | JobFiles | JobBytes      | StartTime           | VolumeName |
+-------+-------+----------+---------------+---------------------+------------+
|     4 | F     |  258,441 | 2,262,481,683 | 2015-07-02 14:32:50 | Vol-0004   |
|    14 | I     |      158 |    79,623,411 | 2015-07-03 04:32:49 | Vol-0014   |
+-------+-------+----------+---------------+---------------------+------------+
You have selected the following JobIds: 4,14
Building directory tree for JobId(s) 4,14 ...

のケースではBuilding directory treeに5時間20分(リストア全体の時間ではない、Building directory treeだけにかかった時間)掛かっていたのが、10秒位で終わった。
何だこれは!!こんなに違うの!!そういえば以前は”Building directory tree”の時CPUのユーティライゼションが100%になっていた。この時SWAPの状態をチェックしていなかったが、もしかしたらSWAPが大量に発生していたのかも?
結論】baculaでmysqlを使うときは絶対にDBのベースエンジンは InnoDB にし、上記の設定を追加する事。その後私はメモリーに少し余裕があるので 

innodb_buffer_pool_size = 256M

に変更した

カテゴリー: Baclua(バックアップ)に挑戦 | コメントする

10:リストアに時間がかかりすぎる

11:リストアの時間が劇的に早くなったを参照の事。
どうもリストア時のファイルの作成(Building directory tree)に時間がかかりすぎる

+-------+-------+----------+---------------+---------------------+------------+
| JobId | Level | JobFiles | JobBytes      | StartTime           | VolumeName|
+-------+-------+----------+---------------+---------------------+------------+
|     4 | F     |  258,441 | 2,262,481,683 | 2015-07-02 14:32:50 | Vol-0004   |
|    14 | I     |      158 |    79,623,411 | 2015-07-03 04:32:49 | Vol-0014   |
+-------+-------+----------+---------------+---------------------+------------+
 You have selected the following JobIds: 4,14
 Building directory tree for JobId(s) 4,14 ...  +++++++++++++++++++++++++++++++++++++++++++
224,831 files inserted into the tree.

上記の分で5時間20分もかかっている。
誤解の無いように言っておくが、これはリストアにかかった時間ではない。Building directory treeだけにかかった時間である。
ここで不安になって来た。もし壊れて場合こんなに時間がかかっているとその間はサービスが無い状態になってしまう。
ここから mark * で少し時間がかかり(上にあるように224、831もファイルがあるのでそれに印を付けるため)それから、いよいよリストアになりこれにも時間がかかる。
上の場合はフルバックアップと一つのインクリメントファイルだけである。最悪の場合(土曜日の時)フル、差分、6個のインクリメントの計8個のファイルを使って、リストアするファイルを作るとすれば、一体どれだけ時間がかかるの?
それとも私のやり方が間違っているの?どれだけ時間がかかるか調べて見ようか。

ここを参照 劇的に早くなる

カテゴリー: Baclua(バックアップ)に挑戦 | コメントする

9:バックアップする設定を変更する

8:他のホストにリストアでも言っていますが、バックアップされるホストの全てのファイルを(マウントしている他の領域の分も含めて)FileSetで指 定してしまうと、リストア時にものすごく時間がかかってしまいます。ちなみに私はあるホストには/領域で6.7GB、マウントしている領域で2.4GBも う一つの領域で9.9GBをバックアップしたら、リストア時に8時間以上かかってしまいました。ここを参照 劇的に早くなる

(バックアップされたサイズは10.9GB)なので、方針 を変更し、それぞれのパーティション毎にJOBを作り、それに合わせてFILESETも作るようにしましたので、レストアー時はパーティション毎になります。

カテゴリー: Baclua(バックアップ)に挑戦 | コメントする