2008年9月15日月曜日

Apache2.2 帯域制限をかける mod_cband最強?mod_bandwidth mod_bwshare... どれがいい?

しばらくサイトを運営していると、サーバーに接続するクローラーやダウンローダーなどが、帯域を占有し、ブラウザの表示が遅くなったり、レスポンスが遅くなりすぎてエラーが出るようになってきた。そこで、そのような一般ユーザーよりも強烈なダウンロードをおこなうユーザーやソフトの帯域を制限するためにApacheに帯域制限モジュールを導入しようと考えた。
ところが、この帯域制限モジュールはたくさんあり、どれが最適なのかよくわからない。
Apache1.3、Apache2初期のころの評価記事は見つけることができるが、Apache2.2の情報をまとめたものがなかなかみつからない。








モジュール名対応ApachePortsコメント
mod_cbandApache2.0-YesVirtualHostごとに帯域制限をかけ月間転送量、同時接続数、転送速度を指定できる。
クライアントごとも可能。http://www.howtoforge.com/mod_cband_apache2_bandwidth_quota_throttling http://cband.linux.pl/documentation
mod_bw Apache1.3 Apache2.0-2.2Yesセッションごとの転送帯域の制限
mod_bandwidthApache1.2-1.3Yes2.0対応になりmod_bwに名前が変わった?
mod_bwshare pache1.2-1.3 Apache2.0-2.0.55Yesファイル数バイト数の設定値を超えると503エラーを返す
mod_tsunamiApache1.3Yes


http://cowscorpion.com/Network/mod_cband.html より
-----
mod_cband は転送量やダウンロード速度の制限や同時接続数の制限などができる Apache 2 サーバーのモジュールです。
 mod_cband は従来の帯域制限モジュール (mod_bandwidth, mod_limitipconn, mod_curb) を合わせ、Apache 2で使えるように作られたもので、サーバー全体やバーチャルホストごと、またはIPごとに帯域/転送量の制限、最大のダウンロード速度の制限、一秒間のリクエスト数(Requests per Second)、最大の同時接続数(maximum number of simultaneous IP connections) の制限をすることができるます。
 サーバーのユーザーに「10GB/月 」などのデータ転送量の制限をしたり、クライアント毎にダウンロード速度や同時接続数の制限を行いたい場合などに使うことができます。
-----
だそうな。mod_cband最強?
http://www.sfr-fresh.com/unix/privat/mod-cband-0.9.7.5.tgz:a/mod-cband-0.9.7.5/doc/documentation.txt

でも、mod_cbandが最強みたいです。
あぁ。。。たしかに最強かも。


ほかにもこんなアパッチモジュールがあるみたいです。
一応覚書。以下調べるのやめました(爆)
mod_access_limit
mod_bandwidth
mod_bwshare 接続数、帯域、容量での制限を行う
mod_choke
mod_conn
mod_curb
mod_dosevasive
mod_limitipconn 接続数での制限を行う
mod_throttle
mod_traf_thief
mod_tsunami
mod_vhost_limit

.

2008年9月14日日曜日

sendmail_enable="NONE"ではsendmailが自動起動している

FreeBSD6.3にて

ふと、
$ps -ax
としてみたらsendmailが起動していた。
/etc/rc.confには
sendmail_enable="NONE"
とちゃんと間違いなく記入されているのに。
なんで?
とネットで調べてみましたら、この記述方法はもう古い方法だったみたいで
sendmail_enable="NONE"は使われなくなったそうです。

すべてのプロセスを止めるには

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

とするようです。


マニュアルはこちら
rc.sendmail

お。起動しなくなった。
.

2008年9月3日水曜日

Rubyでコンストラクタの多重定義(オーバーロード,オーバーローディング) ってできないの?

Rubyでコンストラクタの多重定義(オーバーロード,オーバーローディング) ってできないの?

出来ないらしい。
そもそも、メソッド(関数)の多重定義が出来ないから出来ないのもあたりまえ。

コンストラクタを多重定義するには、スタティック(静的)関数を定義すると出来る。




class Vector


def initialize(x,y)
 @x = x
 @y = y
end

def self.NewUnit()
 obj = Vector.new(1,1)
 return obj
end


end


v1 = Vector.new(3,4)
p v1

v2 = Vector.NewUnit()
p v2




def self.NewUnit()

で静的なメソッドを定義し、その中でオブジェクトを作成し戻り値にし返します。

v2 = Vector.NewUnit()

のような形でオブジェクトの生成が出来るようになるわけです。
もし、メソッド名initialize()で多重定義関数のような振る舞いをさせるには、
Rubyでは引数にいろいろな型を渡すことができるので、initialize()内で
渡された引数の型を調べ内部で分岐するようにすれば出来ます。しかし、それではあまりにも美しくないし、バグの温床にもなりおすすめできません。
メソッドを分けて作ったほうがいいでしょう。

2008年8月24日日曜日

find の正規表現を使い検索したファイルにコマンド実行するには

FreeBSD
bash

な環境でfindを使い正規表現で検索するには

"apple"を含むファイル名を検索し表示する

  find . -regex ".*apple.*" -print

"apple"を含むファイル名の最後に"red"を付ける

  find . -regex ".*apple.*" -exec mv {}red ¥;

"apple"を含むファイル名のファイルを削除する

  find . -regex ".*apple.*" -exec rm {} ¥;


shellによっては"¥"が不要だったりするみたいです。

FreeBSD man find

2008年8月19日火曜日

SELECT WHERE の話

MySQLで、いままで気にしていなかったのですが相関問い合わせを使って初めて気がついたこと。

たとえば、

SELECT * FROM 記事 WHERE 記事.id=2122

のようなSQLを実行したとき、データベースサーバー側では、
2122をハッシュなどで記事.idから高速検索するという考え方よりも、
実際の動作で考えると、
記事.idを順に最初から調べていき、

記事.id=2122が成り立つものを返す。

というのも
副問い合わせでツリー構造になっている掲示板で考えたとき、
親記事でコメントのついていない記事を検索するには
つぎのような副問い合わせで検索できます。

SELECT * FROM 記事 as A
WHERE 0=(
SELECT COUNT(*) FROM 記事 AS B
WHERE 記事.id = B.parentid
)

つまりWHERE 0=... は条件文としてしか評価していないのです。


ps.
実際にはオプティマイザがあるので、

WHERE 記事.id=2122

はハッシュなんでしょうけどね。

2008年8月17日日曜日

No such file or directory: Failed to enable the 'httpready' Accept Filter

再びApache2.2をインストールしてみたらこんな警告が出た。

#apachectl start

[Sun Aug 17 18:14:46 2008] [warn] (2)No such file or directory: Failed to enable the 'httpready' Accept Filter

と警告が表示される。

グーグル先生に聞いてみたら。ネットにこんな記述が見つかりました。

FreeBSDの場合、accf_http.koというFreeBSDのカーネルモジュールが必要ということでした。

起動時にこれを組み込むには

[/boot/loader.conf]
accf_http_load="YES"

を加えればいいそうです。


というか、ビルド時にコンパイルオプションで、
Accept Filterを無効にしておけばよかったような。。。気もする。。

2008年8月4日月曜日

FreeBSDで ImageMagick... RMagick2 のインストール

FreeBSDにRMagickのインストール

環境
FreeBSD 6.3-RELEASE
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-freebsd6]
ImageMagick-nox11 6.4.1.8
RMagick 2.5.2

RMagickはImageMagicのRubyインターフェースです。
JPEG,JPEG2000,PNG,GIF,TIFFファイルの入出力に対応し、
画像サイズ変更や図形描画、文字の表示を行うことが出来ます。
Web画像のサムネイルの自動生成などが出来るようになります。


まずImageMagickをインストールします。

#cd /usr/ports/graphics/ImageMagick/
#make install

l
l Options for ImageMagick-nox11 6.4.1.8
l +------------------------------------------------------------------
l l[ ] X11 X11 support
l l[X] IMAGEMAGICK_TESTS Run bundled self-tests after build
l l[ ] IMAGEMAGICK_OPENMP Enable OpenMP for SMP
l l[X] IMAGEMAGICK_PERL Perl support
l l[ ] IMAGEMAGICK_MODULES Modules support (broken)
l l[X] IMAGEMAGICK_BZLIB Bzlib support
l l[X] IMAGEMAGICK_16BIT_PIXEL 16bit pixel support
l l[ ] IMAGEMAGICK_DJVU DJVU format support (needs threads)
l l[X] IMAGEMAGICK_LCMS LCMS support
l l[ ] IMAGEMAGICK_HDRI High Dynamic Range Images (HDRI)
l l[X] IMAGEMAGICK_TTF Freetype support
l l[X] IMAGEMAGICK_FONTCONFIG Fontconfig support
l l[X] IMAGEMAGICK_JPEG JPG format support
l l[ ] IMAGEMAGICK_OPENEXR OpenEXR support (needs threads)
l l[X] IMAGEMAGICK_PNG PNG format support
l +------------------------------------------------------------------
l [ OK ] Cancel
+------------------------------------------------------------------

サーバーで利用を考えているのでX11とAcrobat PDFとあまり使われなくなったTIFFサポートをはずしました。

[ ]X11
[ ]IMAGEMAGICK_TIFF
[ ]IMAGEMAGICK_PDF

でOKを選択
続いてRMagicをインストールします。
Ruby gem からインストールするので、先にgemをインストールしておいてください。
gemからRMagicをインストールします。


# gem install rmagick

ただこれで
Bulk updating Gem source index for: http://gems.rubyforge.org
Building native extensions. This could take a while...
Successfully installed rmagick-X.Y.Z

とメッセージが出てもインストールできていないことがあるらしい。
gemではインストールが成功したかは確認できないのが原因。
そこで、irbでインストールの状況を確認します。

# irb -rubygems -r RMagick
irb(main):001:0> puts Magick::Long_version

This is RMagick 2.5.2 ($Date: 2008/07/13 21:18:28 $) Copyright (C) 2008 by Timothy P. Hunter
Built with ImageMagick 6.4.1 08/03/08 Q16 http://www.imagemagick.org
Built for ruby 1.8.6
Web page: http://rmagick.rubyforge.org
Email: rmagick@rubyforge.org
=> nil

のように表示が出れば成功しています。
irbを終了します。

irb(main):002:0> exit

/usr/local/lib/ruby/gems/1.8/gems/rmagick-2.5.2
にインストールされ、そこにREADME.htmlが生成されます。
この説明書をよみながら次の手順を進めていきます。
バージョン番号は自分でインストールしたバージョンに読み替えてください。

#cd /usr/local/lib/ruby/gems/1.8/gems/rmagick-2.5.2

RMagicのテスト
#ruby setup.rb
---> lib
---> lib/rvg
<--- lib/rvg
<--- lib
---> ext
---> ext/RMagick
/usr/local/bin/ruby18 /usr/local/lib/ruby/gems/1.8/gems/rmagick-2.5.2/ext/RMagick/extconf.rb
checking for Ruby version >= 1.8.2... yes
checking for cc... yes
checking for Magick-config... yes
checking for ImageMagick version >= 6.3.0... yes
checking for HDRI disabled version of ImageMagick... yes
checking for stdint.h... yes
checking for sys/types.h... yes
checking for magick/MagickCore.h... yes
checking for InitializeMagick() in -lMagick... no
checking for InitializeMagick() in -lMagickCore... yes
checking for snprintf() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.h,magick/MagickCore.h... yes
checking for AcquireQuantumMemory() in assert.h,ctype.h,stdio.h,stdlib.h,math.h,time.h,stdint.h,sys/types.h,magick/MagickCore.h... yes
:
:
/usr/local/bin/ruby18 -I /usr/local/lib/ruby/gems/1.8/gems/rmagick-2.5.2/./lib -I /usr/local/lib/ruby/gems/1.8/gems/rmagick-2.5.2/./ext/RMagick writing_mode02.rb (example 185 of 185)
#

のように表示が出て、サンプルプログラムの実行が行われます。
エラーが5個以内なら正常終了します。

つづいて
#ruby setup.rb install
rm -f InstalledFiles
---> lib
mkdir -p /usr/local/lib/ruby/site_ruby/1.8
install RMagick.rb /usr/local/lib/ruby/site_ruby/1.8/
install RMagick2.so /usr/local/lib/ruby/site_ruby/1.8/
---> lib/rvg
mkdir -p /usr/local/lib/ruby/site_ruby/1.8/rvg
install stretchable.rb /usr/local/lib/ruby/site_ruby/1.8/rvg
install rvg.rb /usr/local/lib/ruby/site_ruby/1.8/rvg
install deep_equal.rb /usr/local/lib/ruby/site_ruby/1.8/rvg
install transformable.rb /usr/local/lib/ruby/site_ruby/1.8/rvg
install embellishable.rb /usr/local/lib/ruby/site_ruby/1.8/rvg
install describable.rb /usr/local/lib/ruby/site_ruby/1.8/rvg
install units.rb /usr/local/lib/ruby/site_ruby/1.8/rvg
install paint.rb /usr/local/lib/ruby/site_ruby/1.8/rvg
install container.rb /usr/local/lib/ruby/site_ruby/1.8/rvg
install clippath.rb /usr/local/lib/ruby/site_ruby/1.8/rvg
install pathdata.rb /usr/local/lib/ruby/site_ruby/1.8/rvg
install text.rb /usr/local/lib/ruby/site_ruby/1.8/rvg
install stylable.rb /usr/local/lib/ruby/site_ruby/1.8/rvg
install misc.rb /usr/local/lib/ruby/site_ruby/1.8/rvg
<--- lib/rvg
<--- lib
---> ext
---> ext/RMagick
mkdir -p /usr/local/lib/ruby/site_ruby/1.8/i386-freebsd6
install RMagick2.so /usr/local/lib/ruby/site_ruby/1.8/i386-freebsd6/.
<--- ext/RMagick
<--- ext

post-install.rb: installing documentation...
mkdir -p /usr/local/share/RMagick
mkdir -p /usr/local/share/RMagick/scripts
mkdir -p /usr/local/share/RMagick/ex
mkdir -p /usr/local/share/RMagick/ex/images
mkdir -p /usr/local/share/RMagick/css

これで完了。

動作確認
100x100ピクセルの赤色単色のgifファイルの生成を行ってみます。

[red.rb]
require 'RMagick'
include Magick
# Create a 100x100 red image.
f = Image.new(100,100) { self.background_color = "red" }
f.write("red.gif")
exit

#ruby red.rb

でred.gifが生成され表示してみて確認し完了!


ドキュメントのインストール先
/usr/local/lib/ruby/gems/1.8/gems/rmagick-2.5.2/doc/index.html

RMagickのインストール先
/usr/local/lib/ruby/gems/1.8/gems/rmagick-2.5.2/lib/

ご参考:
RMagic
http://studio.imagemagick.org/RMagick/doc/

ImageMagic
http://www.imagemagick.org/script/index.php