2009年10月28日水曜日

スタイルシートにおける空URL指定の扱い

スタイルシートでバックグラウンドイメージの指定などに使うURL指定は、空指定した場合に参照元を引き継ぐ。(See, RFC 1808 Section 4)

空指定とは、URL()やURL('')のような指定。
参照元とは、cssファイルに記載している場合はcssファイルそれ自身で、JavaScriptでobject.style.backgroundImage等を操作している場合はJavaScriptがロードされているURLとなる。

つまり、"/hoge.css"の中で"background-image:url()"と記載すると、"background-image:url('/hoge.css')"のように解釈されるし、"/fuga.cgi"中のJavaScriptで、"document.style.backgroundImage='url()';"とすると、"document.style.backgroundImage='url(/fuga.cgi)'"のように解釈される。

このため、cssをcgi等で動的に生成している場合や、JavaScriptで動的にスタイルを変更している場合に、意図しない空指定が行われることで「無駄なhttp GET」が実行されることがある。
例えば、CGIの処理結果ページにJavaScriptが設定されており、その中で空URLが指定されるバグがあったとすると、当該CGIが2回GETされることになる。
ブラウザにもよるが「デバグ系のプラグイン」を動作させると、こういったGETが走らない場合が多く、原因究明でつまずきやすいため、URLを生成するルーチンには注意を払うべき。

2009年10月7日水曜日

FreeBSDで最新のportsを取得する方法

初回の更新処理
以下のコマンドを実行する。

$ portsnap fetch extract

二回目以降の更新処理
"/usr/ports"以下で、以下のコマンドを実行する。

$ make update

以上の手順は、portsnapコマンドを用いる方法(PORTSNAP_UPDATE方式)で、最も推奨される更新手順である。

ただし、OSのソースを取得する方法と同様に、csupを用いる方法(SUP_UPDATE方式)もある。
この場合、make.confに以下の記述を行えばよい。(/usr/ports/Makefile:166-170)

SUP_UPDATE=yes
PORTSSUPFILE=/usr/share/examples/cvsup/ports-supfile


また、cvsを用いる方法(CVS_UPDATE方式)もある。
この場合、make.confに以下の記述を行えばよい。(/usr/ports/Makefile:171-175)

CVS_UPDATE=yes

ただしこの場合、CVSROOT環境変数に適切な値を入れておく必要がある。

設定の優先順位は、SUP_UPDATE,CVS_UPDATE,PORTSNAP_UPDATEとなっている。
デフォルトはPORTSNAP_UPDATE。(/usr/ports/Makefile:166-190)

※source ver : FreeBSD 7.2 Release-p4

2009年10月6日火曜日

FreeBSDでOSの最新ソースを取得する方法(supファイルを書かずに)

まず、"/etc/make.conf"に以下の記載を追記する。

SUP_UPDATE=yes
SUPHOST=cvsup.jp.FreeBSD.org


次に、"/usr/src"以下で、以下のコマンドを実行する。

$ make update

動作としては、所定のsupファイル(ただしhostは上書き)を使って、csupコマンドを実行しているだけ。
参照しているsupファイルは以下の通り。(/usr/share/examples/etc/make.conf:186)

/usr/share/examples/cvsup/standard-supfile

ちなみに、上記supファイルのtag指定は以下のようにマイナーバージョンまでを含めている。(/usr/share/examples/cvsup/standard-supfile:52)

*default release=cvs tag=RELENG_7_2

そのため、取得できる「最新ソース」は、あくまでパッチレベルである点に留意すること。

より細かな設定については、"man make.conf" もしくは、/usr/share/examples/etc/make.confを参照の程。

※source ver : FreeBSD 7.2 Release-p4

2009年10月1日木曜日

Apacheプロセス数のチェック方法

駆動中のhttpdプロセス数のチェック
$ ps -a | grep httpd | grep -v grep | wc

プロセスリストからhttpdプロセスの数を数える。
"grep -v grep"しないと、"grep httpd"まで数え上げてしまう。
また、httpdは親プロセス+子プロセスで出てくるので、MaxClients等で指定した子プロセス数より1つ多くなる点に注意。

httpでのTCPコネクションのチェック
$ netstat -a | grep .http | grep EST | wc

httpポートでESTABLISHEDしているTCPコネクション数を数える。



定期的にチェックする場合は、以下の様にするのが楽。
$ while [ 1 ]; do ps -a | grep httpd | grep -v grep | wc; sleep 1;
done

※1秒ごとにコマンドを延々実行(B-Shell系)

セッションを張りっぱなしのクライアントを実現(つまり、ずっと処理中の子プロセスを生成)するには、以下の様にtelnetで直接叩くのが楽。
$ telnet www.server.com 80
ただし、Accept Filterを有効にしている場合、TCPはESTABLISHEDするが、子プロセスまで要求が渡らないため、httpd子プロセスは増えない。
Accept Filterを一旦解除するか、sleepするCGIを作成し、これをGETするのがよい。

Apacheの駆動プロセス数について

Apacheのプロセス数の制御は以下のディレクティブで行う。
  • ServerLimit
  • MaxClients
  • MinSpareServer
  • MaxSpareServer
  • StartServers
ServerLimitは、起動する子プロセス数の最大値を決める。
デフォルトでは200000。(/httpd-2.2.13/server/mpm/prefork/prefork.c:84)

MaxClientsは、駆動する子プロセス数の最大値を決める。
(preforkの場合、ServerLimitと同意になる)
ServerLimitより小さい数値である必要があり、デフォルトでは256。(/httpd-2.2.13/server/mpm/prefork/prefork.c:77)

MinSpareServerMaxSpareServerは、アイドルプロセス数の最小値、最大値を決める。
アイドルプロセスとは、クライアントからの要求を受ける前にあらかじめforkしておく子プロセス。
あらかじめforkしておくことで、要求発生時に素早く処理ができる。
MinSpareServerのデフォルト値は5 (/httpd-2.2.13/server/mpm/prefork/mpm_default.h:46)
MaxSpareServerのデフォルト値は10 (/httpd-2.2.13/server/mpm/prefork/mpm_default.h:40)

StartServersはApache起動後すぐ起動する子プロセス数。
MinSpareServerと同値にするのが通常だが、異なる値も指定出来る。
ただし、どのような値を指定しても、MinSpareServerとMaxSpareServerの間に収まるように調整される。
StartServersのデフォルト値は5 (/httpd-2.2.13/server/mpm/prefork/mpm_default.h:32)


子プロセスの総数は、MaxClientsより多くはならないため、処理中のプロセス数が増大すると、アイドルプロセスがMinSpareServerより少なくなる場合がある。(httpd-2.2.13/server/mpm/prefork/prefork.c:796 perform_idle_server_maintenance)
アイドルプロセスが0、つまり処理中のプロセスがMaxClientsに達すると、以下のエラーが出力される。
"server reached MaxClients setting, consider raising the MaxClients setting" (/httpd-2.2.13/server/mpm/prefork/prefork.c:867)

各ディレクティブの詳細は、apacheのマニュアルを参照の程

※動作モードはmpm_preforkに限る
※source ver : Apache 2.2.13