6月 25
はじめに
memcachedは以前からあるようで、これを取り入れると
レスポンスが良くなるようだ。回線が細いので早速インストールした。
結果、取り合えず動く様になりましたが、URLが壊れる。
まだ壊れた状態ですが、アクセスはできるので、しばし放置し
何をしたかのメモにする。(2009年が、0000年になる)
ぼちぼち調べます。
- 2009.06.25 memcachedは使えるが被害がある状態。
- 2009.09.20 修正
続きを読む »
« 続きを隠す
前提
問題点
Q. phpがphp.ini又memcache.iniに記述したが
「extension=memcache.so」を読み込まない。
- 症状
- php -v を実行すると、memcache.so の読み込み失敗が確認できるる。
- メモ:php –ini で参照してるファイル一覧がわかる。
- メモ:php -m で、ロードしたモジュールの一覧がわかる。
- 対策(この環境のみ?)
Q.動いてる様ですがURLが壊れる(但し、参照可能)
- 症状:西暦の年が、0000年になってしまう。
- 状況:上述状態でも読み込み可能。
- 不明点:対策方法(調査中)
3月 16
*はじめに
awstatsを導入して、cronで自動アップデートは行ってます。
Mac OSX付属のsayコマンド使って更新通知を音声で通知するスクリプトを作った。
でも、アクセス頻度は少ないのに定期的に音声通知があると、逆に五月蠅い。
その対策とcronに仕掛けるスクリプトを一本化した。
(複数のアクセスログをアップデートするとcronの記述も複数必要なのが面倒
なのと、アクセス頻度を簡易的にコマンドで見れればとちょい機能を加えた)
Mac OSX (Leopard)のみ動作確認済みです。(動作保証しません)
ー2009.03.19 ${LOG}に保存する日付を変更、${SMZ_LogFile}の更新日付を保存する様にした。
/var/log/awstats_cron.log の設定値を古くするか、ファイル削除が必要。
ー2009.06.17 過去修正を反映:スクリプトやcron実行方法
続きを読む »
« 続きを隠す
対策
- リモート側(FreeBSD)から定期的にMac OSX側の対策スクリプトを起動する。
- MacOSX側の対策スクリプト内容は以下の通り。
- < ユーザ名A>はsudoでパスワード入力無しで以下のスクリプトが実行できる状態であること。
- アクセスログの更新日時を保存しておき、今回のアクセスログの更新日時と不一致するならば、awstatsでログ解析をする。
- アクセスログは /var/log/awstats_cron.log に記録。(アクセスログの更新日を記録)
- MacOSXのCronは使用しない。 エラーログが発生するので仕掛け変更する
準備
MacOSX側
- awstats.< 任意>.confへ追加変数(SMZ_LogFile)を追加する。
| 追加変数 |
値 |
備考 |
| SMZ_LogFile |
ログファイル名 |
mailのログ解析ではLogFilesの設定が異なるため |
- SMZ_LogFileの記述例 (awstat.smz.blogdns.com.conf)
SMZ_LogFile="/path/to/httpd.access_log"
- < ユーザ名A>のパスワード入力無しのsudo設定をする。
FreeBSD側
MacOSX/FreeBSD側両方
対策スクリプト
- 基本的にrootユーザで実行することを前提としている。
- 一般ユーザで更新状況を参照することのみとする。(以下、実行例)
$ /var/root/bin/awstat_update.sh -l
==============================================
Now: 2009年 6月17日 水曜日 15時34分37秒 JST
=====[last]======|==========[site]=============
20090617 15:23:36 smz.blogdns.com
20090617 14:55:11 mail
20090607 16:42:47 localhost
[last]:最近のアクセス日時
[site]:該当サイト名
ログ内容(/var/log/awstat_cron.log)
サイト別にawstatで更新した日付を保存する。
checked_localhost=20090607_16:42:47
checked_mail=20090617_14:55:11
checked_smz_blogdns_com=20090617_15:35:51
スクリプト(/var/root/bin/awstats_update.sh)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
| #!/bin/sh
# $Id: awstats_update.sh,v 1.6 2009/03/25 19:56:12 shimizu Exp $
#-----------------------------
#TMP=${TMP:-/tmp}
PATH="/opt/local/bin:$PATH:/sbin"
AWSTATSDIR=/opt/local/www/awstats/cgi-bin
LOG=/var/log/awstats_cron.log
# このスクリプトが更新日付を保存するログ。
LANG=ja_JP.UTF-8
SITELIST="smz.blogdns.com localhost mail"
# SITELIST の名前は、awstat.< ここ>.conf を示す。
export PATH
export LANG
_opt_update="-update"
_opt_debug=0
_opt_force=0
_opt_say=1
_opt_view=0
case $1 in
-c) # create
_opt_update="" ;;
-d) # debug
_opt_debug=1 ;;
-f) # It compulsorily executes it.
_opt_force=1 ;;
-l) # Refer to the final access situation.
_opt_view=1 ;;
-ns) # Don't useing say command.
_opt_say=0 ;;
*) # say Awstat.log being renewed now.
;;
esac
function decho # ...
{
if [[ ${_opt_debug} = 1 ]] ; then
echo $*
fi
}
unction getDate # <file> <ret>
{
typeset _file=$1
typeset _isDate="";
if [[ -f ${_file} ]] ; then
_isDate=$("ls" -lT ${_file} |
awk '{ printf("%04s%02s%02s_%s",$9 ,$6 ,$7,$8) }')
fi
eval $2=${_isDate}
}
function changeKeyValue # <file> <key> <val>
{
typeset _file=$1
typeset _key=$2;
typeset _val=$3;
typeset _tmp=${TMP}/${_file}.$$
sed "s/^${_key}=\([^.]*\)/${_key}=${_val}/g" ${_file} > ${_tmp}
mv ${_tmp} ${_file}
}
function checkStart # <site> <log>
{
typeset _site=$1
typeset _log=$2
typeset _key="checked_$(echo ${_site} | sed 's/\./_/g')"
typeset _log_date
typeset _before_log_date
typeset -i _bval
typeset -i _aval
typeset _ret=0;
if [[ ${_opt_force} = 1 ]] ; then
return 1
fi
eval _before_log_date=\$"${_key}"
_bval=$( echo ${_before_log_date} | sed 's/[_:]//g')
getDate ${_log} _log_date
_aval=$( echo ${_log_date} | sed 's/[_:]//g')
decho "START ##########################################"
decho "_log=${_log}"
decho "_log_date=${_log_date} , _aval=${_aval}"
decho "key=${_key}"
decho "_before_log_date=${_before_log_date}, _bval=${_bval}"
decho "${_bval}(before) =?= ${_aval}(after)"
if [[ ${_bval} = 0 ]] ; then
echo "${_key}=${_log_date}" >> ${LOG}
_ret=1
elif [[ ${_bval} -lt ${_aval} ]] ; then
changeKeyValue ${LOG} ${_key} ${_log_date}
_ret=1
fi
decho "END ##########################################"
return ${_ret}
}
function execSay # <site>
{
typeset _site=$1
if [[ _opt_say -eq 1 ]] ; then
say -v Vicki ${_site} was updated from Awstat Cron.
# say -v 'Bad News' ${_site} was updated from Awstat Cron.
fi
}
function viewSite
{
typeset _site;
typeset _date;
if [[ -r ${LOG} ]] ; then
echo "=============================================="
echo "Now: $(date) "
echo "=====[last]======|==========[site]============="
IFS='='
(cat ${LOG} | sort -r -t= -k2) |
while read _site _date ; do
_date=$(echo ${_date} | sed -l 's/_/ /g')
_site=$(echo ${_site} | sed 's/^checked_//g' | sed 's/_/\./g')
echo "${_date} ${_site}"
done
else
echo "Don't Read ${LOG}"
fi
}
if [[ ${_opt_view} = 1 ]] ; then
if [[ -r ${LOG} ]] ; then
viewSite
fi
exit 0;
fi
if [[ $(id -u) != 0 ]] ; then
echo "Don't excecution. Only root user"
exit 0;
fi
if [[ ! -f ${LOG} ]] ; then
touch ${LOG}
chmod 644 ${LOG}
else
. ${LOG}
fi
"cd" ${AWSTATSDIR}
for _site in ${SITELIST} ; do
eval "$(grep ^SMZ_LogFile awstats.${_site}.conf| sed 's/\"//g')"
checkStart ${_site} ${SMZ_LogFile}
if [[ $? = 1 ]] ; then
if [[ ${_opt_debug} = 1 ]] ; then
(./awstats.pl -config=${_site} ${_opt_update})
else
(./awstats.pl -config=${_site} ${_opt_update}) > /dev/null 2>&1
# ./awstats.pl -config=${_site} ${_opt_update}
fi
execSay ${_site}
fi
done
exit 0; |
3月 13
はじめに
自宅で○○サーバなりを立ち上げると、そのアクセスログなど
稼働状況が気になる。
と言うことで、awstatsをインストールしてみましたが
実行エラーになるので、その修正メモです。
続きを読む »
« 続きを隠す
設定ファイル
実行結果
| エラー内容 |
| Use of uninitialized value $_[0] in pattern match (m//) at /usr/share/perl5/Geo/IPfree.pm line 81. |
- awstats/plugins/geoipfree.pm の修正が必要。1行だけ
- 修正方法
備考
6月 14
・はじめに
robots.txtを編集しても即反映するクローラー利用サイトは少ない
ですが、アクセスログから同じ内容を何度も読みにくる様な
クローラーが存在する、また、IPアドレスからして同一団体なのに
IPアドレスが違うので、robots.txtのアクセス間隔を守ってくれない。
(一斉にアクセスしにくることがあった)
嬉しいですが私情的に迷惑なんです。
個人サーバで回線も細いので集中されると負荷で困るんです。
と言うことで、対策方法を調べてまとめた。
-2009.06.18 何度も参照するのは整合性の確認みたいですね。
-2009.06.18 今後はGoogle,Yahoo等のみにしていきます。(お世話になってるので)
-2009.06.18 実験的追加中:クローラーと思われるのは、404で応答します。
-(かなり微細なエコ対策です。検索エンジンは時代によって、一般的なもので事が足りるので)
続きを読む »
« 続きを隠す
方針
- 特定クローラー、又、特定IPアドレスに対しアクセス禁止する。(.htaccessを修正する)
- アクセス禁止はHTTPの403ステータスコードですが、リソース無しと言う意味の404ステータスコードに置換し応答する。(置換用ファイルを準備する)
対処内容
- .htaccessを修正する。
| 定義内容 |
備考 |
| SetEnvIf User-Agent "<クローラの名前>" deny_ua |
|
| Order allow,deny |
|
| Allow from all |
|
| Deny from env=deny_ua |
|
| Deny from <ip アドレス> |
|
| ErrorDocument 403 < 置換用メッセージファイル> |
例:/404.php |
- 置換用ファイルを準備する。(例:/404.php)
1 2 3 4 5 6 7 8 9 10 11
| <?php header("HTTP/1.1 404 Not Found"); ?>
< !DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head><title>404 Not Found.</title></head>
<body>
<h1>Not Found</h1>
<p>
The requested URL <?php echo$_SERVER["REQUEST_URI"] ?>
was not found on this server.
</p>
</body>
</html> |
3月 17
すみませんが、今までより、このサイト、また遅くなったと思います。
ログ解析状況を見ると、同じグループのサーバかな?
ロボット?スパイダー?が、分散で集中アクセスする時がある様です、
IPアドレスの逆引きもできない、WHOISでは諸外国でした。
狙いは何か知りません。
私は低速なPCをサーバにしNetatalkでバックアップができればいいので、
身元不明なアクセスは遮断させて頂きます。
こっちの方が、逆にCPU使う見たいですが、
不満な場合は別な手段で対応します。
・・・検索サイトで検索し、そこをアクセスすると、また検索サイトだった。
そんな風な感じは嫌ですし、そのリストにも載りたくない。
っと言うことです。
もう、載ってるかもしれない?
これを対策する為に、サーバを立てたんじゃないのになー
3月 06
パーマリンクの使い方に習ってApache2の設定変更をするが、うまく行かない。
続きを読む »
« 続きを隠す
- html.conf に以下の行を追加して、動作確認するとログ出力せず、動作してない。
1 2
| RewriteLog /tmp/rewrite.log
RewriteLogLevel 9 |
- 原因は <Directory />内に、「AllowOverride none」としていたからだ。
httpd.conf
1 2 3 4
| <directory />
#
AllowOverride none
# |
- <VirtualHost >内の<Directory “パス/指定例です”>内で、AllowOverride Allと記述していても、上述1.の定義で2.の定義は無効になる様だ。
httpd-vhost.conf
1 2 3 4 5 6 7 8 9 10 11 12 13
| <virtualhost *:80>
ServerName smz.blogdns.com
ServerAdmin admin@smz.blogdns.com
DocumentRoot "/ドキュメント/ルート/パス"
ErrorLog "logs/smz.blogdns.com-error_log"
CustomLog "logs/smz.blogdns.com-access_log"
RewriteLog /tmp/rewrite.log
RewriteLogLevel 9
<directory "/ドキュメント/ルート/パス">
Options +FollowSymLinks
AllowOverride All
</directory>
</virtualhost> |
改善は出来ましたが、こんな設定をしても 「apachctl -t」で設定内容を確認しても、
「矛盾した設定してるよ!」とワーニングは出さない。
一応、解決しましたが、知ってれば即解決なのに、知らないと解決に時間が掛かりますね。
最近のコメント