FreeBSD・UNIXメモ

ここは技術的な物から、個人的必要と思う情報を、出先からでも見られるようWeb上に
かなりテキトーにメモするページです。
私以外の第三者に役立つかは不明ですし、内容は無保証です。


そのいち

Apacheで自宅サーバ作ったんだけど、特定のブラウザで文字化けするページが偶にある。
もちろん、「Content-Type」で文字コードを指定しているのにマッタクだめ。
という現象を直す



Apacheの設定で標準の文字コードを設定する項目が有るのですが、
どうも、IE以外の一部のブラウザではキチンとそちらの情報を優先するように成っていまして、
いくら
「<META http-equiv="Content-Type" content="text/html; charset=Shift_Jis">」
とページ内に打っても、無視してくれます。

ですので、Apacheの設定を見直してね(はぁと)
で、httpd.confの「AddDefaultCharset」を
#AddDefaultCharset ISO-2022-JP
AddDefaultCharset none

と変更する。

そんで

#LanguagePriority en da nl et fr de el it ja ko no pl pt pt-br ltz ca es sv tw
LanguagePriority ja en da nl et fr de el it ko no pl pt pt-br ltz ca es sv tw

と変更しておく。
以上。

※当方、Operaユーザーだから、これはかなり参った。
自分のページ(自宅サーバ)が見られないんだもん。


そのに
Apacheのログを切り替えたい

awstatsを導入するに、ふと、Apacheのログを眺めてると・・・。んー。ログが異様にデケェ!34メガバイト!Σ(゚◇゚)
と、言うわけでサッサとログのローティングを導入しようと、サクっとシェルスクリプトを。

#! /bin/sh
#
#Apacheログ切り分け
#午前0時過ぎにcronで実行すると、前のLOGをkakoディレクトリに移す。
cd /usr/local/apache/logs
mv /usr/local/apache/logs/access_log /usr/local/apache/logs/kako/access_log_`date '+%y%m%d-%H%M'`

の様に書いて、crontabで0時に動かしてみたんだけど・・・・、なーぜかApacheちゃん、移した先のログファイルにログを記述しやがる。
よーくネットで調べると、mvで移した後に再起動しないと駄目らしいことが判明。
そんなに大量のアクセスがあるサーバではないので、上のシェルスクリプトにapachectl gracefulを足すだけで済ませます。

#! /bin/sh
#
#Apacheログ切り分け
#午前0時過ぎにcronで実行すると、前のLOGをkakoディレクトリに移す。
cd /usr/local/apache/logs
mv /usr/local/apache/logs/access_log /usr/local/apache/logs/kako/access_log_`date '+%y%m%d-%H%M'`
/usr/local/apache/bin/apachectl graceful

大量なアクセスがある場合、更新時にアクセスがあった場合に正常に次ログに引き継がれるか疑問だなぁ。
素直に付属のrotatoelogsを使えば良いのですが、どーも秒単位での指定との事で、起動時間がアレだと、awstatsとの不整合が・・・。うーむ。
newsyslogを使う手もありますね。そのうち、そっちを試してみます。結局cronologでやりました。

改めてApacheのログを切り替える
(AWSTATSでキチンと処理する編)

えー前回より引き続き四苦八苦して辿り着いたのがcronologを使う方法。
コレとawstatsを処理するシェルスクリプトを工夫して、キチンとログ処理を行う事に恐らく成功しました。

cronologはportsを使いサクっとインストール。(ぉ  「portinstall -L /var/log/ports -V sysutils/cronolog」で完了っと。
あとは、apacheの設定ファイルを下記の様に変更する。ちなみに、ワームは別ログを取ってある。2行目はcronolog導入前の設定。
ワームではないログは、kakoディレクトリに日付をファイル名にしたログファイルを作り、記録する。

#通常のLOG
#CustomLog logs/access_log combined env=!wormlog
CustomLog "|/usr/local/sbin/cronolog /usr/local/apache/logs/kako/access_log_%y%
m%d" combined env=!wormlog
#ワームのLOG
CustomLog logs/worm_log combined env=wormlog

awstatsはどうするよ?
と言うことですが、当方はawstatsは毎時間起動はせず、6時間毎に実行している都合もあるので、下記のようなシェルスクリプトを作り、日付越えの処理をキチンとするように工夫したつもり
もっと簡単に日付の処理が出来ないかなぁ?

#!/bin/csh
#
cd /usr/local/etc/awstats/
#
#apacheログの文字コードをutf8に変換する
if ( `date '+%H%M'` <= 0005 ) then
#零時(0時5分未満)の場合、前日のを変換する
#前日の日付作り
set tmpy=`date '+%y'`
set tmpm=`date '+%m'`
set tmpd=`date '+%d'`
#1日引く
@ tmpd--
#10以下は頭にゼロを付加
if ( $tmpd < 10) then
   set tmpd = "0$tmpd"
endif
if ( $tmpd <= 0 ) then
#引いた日数が1以下は月越えの処理
#月を引く
@ tmpm--
#10以下は頭にゼロを付加
if ( $tmpm < 10) then
   set tmpm = "0$tmpm"
endif
if ( $tmpm <=0 ) then
#引いた月が1以下場合は年越え
@ tmpm = 12
#年越えのばあい、年も引く
@ tmpy--
#10以下は頭にゼロを付加
if ( $tmpy < 10) then
   set tmpy = "0$tmpy"
endif
endif
#前月の最終日を取得
switch ( $tmpm )
  case 1:
  case 3:
  case 5:
  case 7:
  case 8:
  case 10:
  case 12:
    $tmpd = 31
  breaksw
  case 2:
    if (($tmpy % 4 == 0) && (($tmpy % 100 != 0) || ($tmpy % 400 == 0))) then
       #閏年
       $tmpd = 29
    else
       $tmpd = 28
    endif
  breaksw
  default:
    $tmpd = 30
  breaksw
endif
#
echo "access_log_$tmpy$tmpm$tmpd" >> /usr/local/apache/logs/filelist.txt
#

/usr/local/etc/awstats/decode.pl < /usr/local/apache/logs/kako/access_log_$tmpy$tmpm$tmpd > /usr/local/apache/logs/access_log.utf8

else
#通常

/usr/local/etc/awstats/decode.pl < /usr/local/apache/logs/kako/access_log_`date'+%y%m%d'` > /usr/local/apache/logs/access_log.utf8

endif
#
#
#apacheログを集計する
/usr/local/etc/awstats/awstats.pl -config=example.jp -update > /dev/null
#
#集計したデータを出力する

/usr/local/etc/awstats/awstats_buildstaticpages.pl -config=example.jp -output -staticlinks > /dev/null
#
#index.htmlにリネームする

mv /usr/home/webmaster/public_html/awstats/awstats.example.jp.html /usr/home/webmaster/public_html/awstats/index.html
#
#analog

/usr/local/bin/analog -g/usr/local/etc/analog.cfg#
#end

filelist.txtはキチンと日越のログを処理したか確認するために付けたもので、通常は要りません。
ちなみに、analogもついでに動かしたりしてます。深い意味は無いのですが。
パーミッションとか所有者とかに気をつけるように〜。(^^;)rootでテストするとハマるぞ。(暴


そのさん
UPSを使って手堅いサーバーに!?

某通販でAPC社のUPSを9千円でゲット。無意味に1400Wです。電気ストーブのバックアップが出来ちゃう。(ぉ
おまけに、かなり重い。腰抜けそうだ。つーか、根性の佐川のにーちゃんが根負けして台車で運んできたよ。

早速、サーバのバックアップをさせるも、非常時に連動してシャットダウン出来ないのかな?と調べて見ると、有るじゃないですか!apcupsdちゃん様が!
portsにもしっかり入っているので、sysutils/apcupsdでmake installでインストール完了。

しっかーし!買ったUPSにはPCと繋ぐケーブルが付属して無い!!
ああ、無常。と嘆くことも無く、ネットを捜索。接続に必要なピンアサインをゲット。ハンダ仕事はマリーベルにおまかせよ!
使用コネクタはD-sub9ピンで、PC側はメス、UPS側はオスコネクタだ。シェルの留めねじはインチネジだ。個人的にDDK(第一電子)社のD-subが良い。
ケーブルは手持ちの0.18sqのシールドケーブルが(長岡電線製)あったので、ソイツを使った。
安物のケーブルでも良いが、後で述べるMRTGで温度や電圧を記録したりするときは、無用なエラーが出ないように最大限の努力をするべきだよ。5分毎にエラーメール地獄が!
俗に言うSmart Custom Cableっちゅーやつ。940-0024Gって型番の品相当。
DCD-DTR、RTS-CTSは繋がなくても良いかも知れませんが、他の装置で大いにハマった事があるので、接続しておく。

portsでインストールしたので、/usr/local/etc/apcupsdに設定ファイルと設定例のファイルが出来ているので、ソイツを使用するUPSに合わせて変更する。
Smart-UPS 1400なので、UPSTYPEはapcsmartを設定、UPSCABLEは上記のsmart cableなのでsmartを、PCのシリアルポートCOM1に繋いだので、DEVICEは/dev/ttyd1に設定。

UPSCABLE smart
UPSTYPE apcsmart
DEVICE /dev/ttyd1

最初、/dev/ttyid1 とか書いて、ズッポシはまったのはナイショ。

他は特殊な事はしないので、デフォルトのまま。他所のPCとUPSをLANで共有する場合は、他の設定もするといい。(´ー`)
バッテリがヘタって来ているUPSをお持ちの場合は、TIMEOUTの値を小さくして、早めにシャットダウンさせると良いかも。

apcupsdの自動起動は、portsが勝手に/usr/local/etc/rc.dにapcupsd.shと言う起動シェルスクリプトを作って置いてくれるはずなので、そのままでOKです。
(念のため、存在やパーミッション等を確認してね。)


戻る