Linux日記

インストール: 久しぶりにRED5ストリーミングサーバ 構築

以前のサイトでは、RED5で作るストリーミングサーバの記事が大変人気だったため、このサイトに変えて無くなってしまったため、困っている人が多いようだ。

ということで少し記事を復活させよう。

# 適当なフォルダーつくってRED5ダウンロード
# wget http://red5.org/downloads/red5/1_0/red5-1.0.0-RC2.tar.gz

# tar xvfz red5-1.0.0-RC2.tar.gz

# ls
red5-1.0.0 red5-1.0.0-RC2.tar.gz

# cd red5-1.0.0

ファイルは以下のようになっている
# ls -l
合計 2036
-rw-r–r– 1 root games 409 5月 17 01:36 2012 Makefile
-rw-r–r– 1 root root 36864 7月 25 01:16 2013 admin.h2.db
-rw-r–r– 1 root games 16493 5月 17 01:36 2012 boot.jar
-rw-r–r– 1 root games 1850 5月 17 01:36 2012 build.properties
-rw-r–r– 1 root games 45769 5月 17 01:36 2012 build.xml
drwxr-xr-x 3 root games 4096 7月 14 09:16 2013 conf
drwxr-xr-x 8 root games 4096 5月 17 01:36 2012 doc
drwxr-xr-x 2 root games 4096 5月 17 01:36 2012 lib
-rw-r–r– 1 root games 1284 5月 17 01:36 2012 license.txt
drwxr-xr-x 2 root games 4096 7月 25 01:06 2013 log
drwxr-xr-x 2 root games 4096 5月 17 01:36 2012 plugins
-rw-r–r– 1 root games 168 5月 17 01:37 2012 red5-debug.bat
-rwxr-xr-x 1 root games 220 5月 17 01:37 2012 red5-debug.sh
-rw-r–r– 1 root games 1181 5月 17 01:37 2012 red5-highperf.bat
-rwxr-xr-x 1 root games 417 5月 17 01:37 2012 red5-highperf.sh
-rw-r–r– 1 root games 308 5月 17 01:37 2012 red5-shutdown.bat
-rwxr-xr-x 1 root games 344 5月 17 01:37 2012 red5-shutdown.sh
-rw-r–r– 1 root games 1110 5月 17 01:37 2012 red5.bat
-rw-r–r– 1 root games 963323 5月 17 01:37 2012 red5.jar
-rwxr-xr-x 1 root games 1297 5月 17 01:37 2012 red5.sh
-rw-r–r– 1 root games 930294 5月 17 01:37 2012 src.zip
drwxr-xr-x 8 root games 4096 7月 14 09:20 2013 webapps
drwxr-xr-x 3 root root 4096 7月 14 09:09 2013 work

起動はすごい簡単次のファイルを起動するだけ。
# ./red5.sh &

もし、Javaを導入していなければダウウロードしていれましょう。
http://docs.oracle.com/javase/7/docs/webnotes/install/linux/linux-jdk.html
JDK 7導入方法は省略。

今回は擬似ストリーミングではなくて本物のRTMPプロトコルのストリーミングです。

ストリーミング実現には大きく3種類あり、以下のような感じです。

  • ダウンロード型 (世間一般のWEBサーバに配置するタイプ)
  • 擬似ストリーミング型 (Youtube, GYAO)
  • ストリーミング型 (USTREAM)

違いがわからないと思いますが、ダウンロード型は設備もソフトも特にいらないコンテンツ記述だけでいける方式ですが
閲覧者のブラウザにファイルすべてダウンロードしてから再生するので時間がかかります。またスライダーを動かしても
タイムゲージ(早送り)うごきません。最初から再生して行かないとダメなんです。あと同時にVIDEOダウンロードする人が多いと
サーバがダウンします。精々同時アクセス10人くらいかな。再生はオンデマンドになります。

擬似ストリーミングは、従来のダウンロード型を改善したもので、ダウンロードをちょろちょろ行いながら再生します。スライダー
も動画に予めポジショニングのタグを埋め込むと早送りが可能です。サーバはApache,Lighthttpdなどで行います。これも再生は
オンデマンドになります。同時アクセス20人から50人くらいまでならOK。後はサーバ構築の腕次第でもっといきます。

ストリーミングはリアルタイム録画&再生、オンデマンドをこなす方式です。パケットを逐次ちょろちょろ転送するので沢山の
同時閲覧者をさばく事ができます。100人から500人は余裕かな。

では、次に設定ファイルをいじります。

# vi conf/red5.properties
# RTMP
rtmp.host=192.168.1.150 rtmp.port=1935 <—運用ポートなんでも結構
rtmp.io_threads=16
rtmp.send_buffer_size=271360
rtmp.receive_buffer_size=65536
rtmp.ping_interval=1000
rtmp.max_inactivity=60000
rtmp.max_handshake_time=5000
rtmp.tcp_nodelay=true
rtmp.default_server_bandwidth=10000000
rtmp.default_client_bandwidth=10000000
rtmp.client_bandwidth_limit_type=2
rtmp.bandwidth_detection=true
rtmp.encoder_base_tolerance=5000
rtmp.encoder_drop_live_future=false

VIDEOコンテンツを配置します. flv形式、mp4形式が使えます。
HandBrakeというオープンソースで変換や調整を行ってください。
変換がおわったら、FTP等でアップロードを下記パスへ行います。
# pwd
/opt/red5/red5-1.0.0/webapps/vod/streams
[root@site-wild streams]# ls -la
astro.mp4 street_of_fire.flv street_of_fire.flv.meta

これで準備は整いました。
red5のTOPへ戻り起動します。
# ./red5.sh &

すごい簡単でしょう!

ただね。コンテンツはデリバリー状態に成っているけども、コンテンツの書き方がわからないと提供していないも同然です。
適当なWEBサーバのドキュメントフォルダに再生用のコンテンツを配置して、VIDEOデリバリーできるようにします。

RTMPの再生パスは
このじょうたいでは “rtmp://xxxxxxx.com/vod”と成っています。

JW Playerという有名な無料の埋め込み式Flash Video Playerがあります。これを使います。
このPlayerは擬似ストリーミングとストリーミングの両方に対応しています。
http://www.longtailvideo.com/

以下埋め込みのサンプルコードです。

JW PLAYER (JW Player OLD Player)

<div id="preview" style="float:left;">
Street Of Fire Movie Trailer 1984
</div>

<script type='text/javascript'>
var s1 = new SWFObject('../player-viral.swf','ply','470','320','9','#ffffff');
s1.addParam('allowfullscreen','true');
s1.addParam('allowscriptaccess','always');
s1.addParam('wmode','opaque');
s1.addVariable('id','ply');
s1.addVariable('backcolor','3333FF');
s1.addVariable('lightcolor','00CC00');
s1.addVariable('screencolor','99FFFF');
s1.addVariable('icons','false');
s1.addVariable('dock','true');
s1.addVariable('displayclick','fullscreen');
s1.addVariable('file', 'street_of_fire.flv');
s1.addVariable('streamer', 'rtmp://xxxxxxxx.com/vod');
s1.addVariable('type', 'rtmp');
s1.write('preview');
</script>

JW PLAYER HTML5 fallback flash(JW Player New Player)

<div id='my-video'></div>
<script type='text/javascript'>
    jwplayer('my-video').setup({
        file: 'rtmp://yourserver/vod/spygame.mp4',
        width: '470',
        height: '320'
    });
</script>

fladance player

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="470" height="320" id="ASTRO BOY">
	<param name="flashvars" value="fms_app=rtmp://xxxxxxxx.com/vod/&video_file=michael_say.flv&image_file=&link_url=&autoplay=false&mute=false&vol=&controllbar=true&buffertime=10" />
	<param name="allowfullscreen" value="true" />
	<param name="movie" value="./fladance.swf" />
	<embed src="./fladance.swf" width="470" height="320" name="ASTRO BOY" allowfullscreen="true" flashvars="fms_app=rtmp://html5.spazo.jp/vod/&video_file=michael_say.flv&image_file=&link_url=&autoplay=false&mute=false&vol=&controllbar=true&buffertime=10" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>

Gitでバージョン管理スタート。

いまや、バージョン管理といえばgitやhg(Mercurial)が主流ですが、意外とITの世界で私のように化石になりつつある輩は使ったことがない人が多い。ってゆうか、やってちゃだめよ。その歳でなんですが。会社経営していると、やる人がいなけりゃなんでもやらないといけなくなることもあるため、とりあえずGitやっちゃいます。

はい、色々とサイトを調べて読んでみるのだがいまいち手順がピンと来ない。自分的に的を得た説明のサイトが少なくイマイチ使い方がわからないい。結局理解するのに3時間もかかってしまった。

Gitはもともとcloneするのが専門だったので、バージョン管理はちっとも状態。

でローカルで管理するのはいいのだが、結局色々な環境で流用したりするからやっぱりリモートレポジトリは必要だ。

まず最初にリモートレポジトリのサイトをサインアップ。有名な所で無料といえばBitbuketでしょう。日本ではGitBreakあたりが無料。
ここであえてメジャーはさけて、Cloud Forgeを使ってみる。ここは無料で2GBまで使える。プロジェクト数は無制限。
利用の前提は非公開です。間違って公開しないので安心ですね。
普通にサインアップしてgitのレポジトリをとります。後は認証しながらPushするのでsshのパブリックキーを作りCloudForgeへ
登録しておきます。

以上の用意ができたら。今度は実際のサイトをリビジョン管理するためにGitを使います。

手順1)
リビジョン管理するフォルダに移動。
# git init

手順2)
リビジョン管理がないか確認。なければOK
$ git status

手順3)
リビジョン対象ファイルを全て登録(Stageの状態)
$ git add ./*

手順4)
一番最初のコミット(要するにローカルレポジトリへの登録。StageからHeadに移る)
$ git commit -m ‘initial commit my application’

手順5)
さっき取得したリモートレポジトリサーバのレポジトリ名をconfigに登録します。この時点ではまだリモートにアクションしません。
この作業自体は初回だけでよいので次回のコミットから不要です。
$ git remote add origin ssh://リモートレポジトリパス/project名.git

手順6)
この作業を行うとリモートレポジトリへPush(要するに差分を登録)します。
$ git push origin master

手順7)
最新バージョンを取り出して適当なディレクトリで使う場合はPullします。すなわちcloneすることがそれにあたります。
$ git clone ssh://localgit/home/git/test.git test

以上、こんなところです。

Google Page Speedでサイトの表示高速化

以前から知っていたけど、やっていなかったGoogle mod_pagespeedによるサイトの高速化。
噂通リの凄いやつ、ロード時間が1/3位に短縮されました。

CentOS5.8 とCentOS6.4で実験。結論はインストール手順には違いがなかった。

最初にyum-prioritiesをインストールします

[root@namhv src]# yum install yum-priorities

mod_pagespeed のYUM repositoryを追加

[root@namhv src]# vi /etc/yum.repos.d/mod-pagespeed.repo

CentOS 5.8 32 Bit or 6.4 32Bit  の場合

[root@namhv src]# vi /etc/yum.repos.d/mod-pagespeed.repo
[mod-pagespeed]
name=mod-pagespeed
baseurl=http://dl.google.com/linux/mod-pagespeed/rpm/stable/i386
enabled=1
gpgcheck=0

[root@namhv src]# chmod +x /etc/yum.repos.d/mod-pagespeed.repo
CentOS 5.5 64 Bit or 6.4 64Bit の場合

[root@namhv src]# vi /etc/yum.repos.d/mod-pagespeed.repo
[mod-pagespeed]
name=mod-pagespeed
baseurl=http://dl.google.com/linux/mod-pagespeed/rpm/stable/x86_64
enabled=1
gpgcheck=0

mod_pagespeedのパッケージ名を確認しましょう。
[root@namhv src]# yum list | grep mod-pagespeed

mod-pagespeed-beta.x86_64              1.6.29.4-3289                    mod-pagespeed
mod-pagespeed-stable.x86_64            1.4.26.3-3101                    mod-pagespeed

mod_pagespeedをインストールします。導入後にサーバを再起動すると有効になっています。

[root@namhv src]# yum install mod-pagespeed-stable

[root@namhv src]#service httpd restart

Turning the Module On and Off/On   <—-  これでGoogle pageSpeedのOn/Offします。

Google pageSpeedは/etc/httpd/conf/pegespeed.confの中に上記SWITCHがあるのでそこでOn/Offします。

sendmailAnalyzerでメールの送受信ログを解析。

なかなか、良いオープンソースを久しぶりに見つけた。
以前からメールの着信状況を調べたかったので、スパムメール対策のついでに解析できたらいいなーと思ってました。sendmailAnalyzerというオープンソースがあるんですね。知りませんでした。

さっそく導入してみましたがいい感じ。


あらかじめcpanで以下をインストールしましょう。
> install MIME::Base64;
> install MIME::QuotedPrint;
> install GD
> install GD::Graph
> install GD::Text
> install GD::Graph3d

あとは以下をコピぺですんなり入ります。
wget http://downloads.sourceforge.net/project/sa-report/sa-report/8.7/sendmailanalyzer8.7.tar.gz
tar xvfz sendmailanalyzer-8.7.tar.gz
cd sendmailanalyzer-8.7/
perl Makefile.PL
make && make install
/usr/local/sendmailanalyzer/sendmailanalyzer -f
/usr/local/sendmailanalyzer/sa_cache
cat << EOF >> /etc/httpd/conf/httpd.conf
Alias /sareport /usr/local/sendmailanalyzer/www

Options ExecCGI
AddHandler cgi-script .cgi
DirectoryIndex sa_report.cgi
Order deny,allow
Deny from all
Allow from all

EOF
service httpd restart
cd /tmp/sendmailanalyzer-8.7/start_scripts
chown root:root *
chmod 755 *
cp -p sendmailanalyzer /etc/init.d/sendmailanalyzer
chkconfig –add sendmailanalyzer
service sendmailanalyzer restart
echo << EOF >> /var/spool/cron/root
#
# SendmailAnalyzer log reporting daily cache
0 */1 * * * /usr/local/sendmailanalyzer/sa_cache > /dev/null 2>&1
#
EOF

LinuxでGoogle Driveを使う

LinuxでGoogleDriveは正式にんはサポートされていません。しかしInsyncというソフトがGoogleDriveに対応しています。
これを使って導入するとDropBoxのような感じでツールバーにアイコンが表示され利用ができます。

ダウンロードのURLはここ
https://www.insynchq.com/

Linuxは3種類用意されていますので、お使いのディストリが何系かわかったらそれに合わせたダウンロード
を行ってください。
https://www.insynchq.com/downloads/linux

CentOSならFedoraアイコンのInsync for GNOME Shellをご利用ください。
Ubuntu系ならUbuntuアイコンのInsync for Unityを利用ください。

ダウンロードしてインストーラ実行すると、WEB画面が開きGoogleDriveへの接続許可をとる画面がでてきますので
GoogleDriveへのアカウント登録を行うと接続が可能になります。

後は、自動で起動しないので自動起動するように起動スクリプトに入れましょう。

メールサーバ構築 | sendmail + Dovecot

10日でおぼえるLinuxサーバーでは、メールサーバの構築をわざと外して執筆をしました。これは理由があってなのですがメールサーバを構築する難しさが一昔前より困難になっているからです。要するに初心者には敷居がかなり高いためです。

現在のメールサーバはスパム対策を意識して作る必要がデフォルトで必須となります。これが難しさの一因となっています。
しかし、メールサーバ構築の方法について切望する方も多いため、今回はsendmail + dovecotで構成する構築方法を案内します。

通常CentOSでメールサーバを導入するというとPostfixがデフォルトで入っています。しかし、昔ながらのsendmailもなかなか負けていません。カスタマイズの柔軟差では歴史的な蓄積がありますので、ここで紹介するのはsendmailにしようと思います。

1.最初の準備(パッケージのインストール)

既にインストールされているPostfixを削除しsendmailをインストールします。
もちろんroot権限でインストールします。

# yum  remove   postfix
# yum  install  sendmail (sendmailメールパッケージ)
# yum install sendmail-cf (sendmialのCF作成ツール関連)

SPF(センダーポリシーフレームワーク)の導入。
# wget http://www.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-1-10.rhel6.noarch.rpm
# vi /etc/yu.repos.d/city-fan.org.repo

[city-fan.org]
name=city-fan.org repository for Red Hat Enterprise Linux (and clones) $releasever ($basearch)
#baseurl=http://mirror.city-fan.org/ftp/contrib/yum-repo/rhel$releasever/$basearch
mirrorlist=http://mirror.city-fan.org/ftp/contrib/yum-repo/mirrorlist-rhel$releasever
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-city-fan.org

smf-spfのパッケージをインストールします。
# yum –enablerepo=city-fan.org install smf-spf

メールドメインのDNSサーバへSPFの登録

正引きDNSレコードへ追加してください。
# vi xxxxxx.zone
@ IN TXT “v=spf1 mx ~all”

※ ‘-all’と’~all’の指定に注意。チルダの場合は除外メールの場合SPF:failを件名の先頭に追加され、実際には削除されない。
ある一定期間観測してからホワイトリスとを作って登録し、全除外を実行’-all’とするとよいだろう。
ホワイトリスとは/etc/mail/smfs/smf-spf.conf の編集により実現が可能です。

編集が終わったらDNSを再起動。
# service named restart

2.sendmail.mcの編集(sendmailサーバの設定中間ファイル)

sendmailの動作を決めるのはsendmail.cfファイルです。しかしこのファイルは設定が難しいため中間の設定ファイルとしてsendmail.mcを編集します。

# cd /etc/mail
# vi sendmail.mc

(修正する内容だけピックアップします。)
dnl # SMTP_AUTHの設定
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN’)dnl
define(`confAUTH_MECHANISMS’, `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN’)dnl
dnl # procmailの設定
define(`PROCMAIL_MAILER_PATH’, `/usr/bin/procmail’)dnl
dnl # spamass-milterを動作させるためのマクロ
define(`confMILTER_MACROS_HELO’, confMILTER_MACROS_HELO`, {verify}’)dnl
dnl # smf-spfでSPFフィルターを実装
INPUT_MAIL_FILTER(`smf-spf’, `S=unix:/var/run/smfs/smf-spf.sock, T=S:30s;R:1m’)dnlFEATURE(`no_default_msa’, `dnl’)dnl
dnl # sendmailのセキュアシェル
FEATURE(`smrsh’, `/usr/sbin/smrsh’)dnl
dnl # 特定ホスト向けのメールを中継するサーバを指定する
FEATURE(`mailertable’, `hash -o /etc/mail/mailertable.db’)dnl
dnl # 仮想ホストの定義
FEATURE(`virtusertable’, `hash -o /etc/mail/virtusertable.db’)dnl
dnl # すでに削除されてしまったアカウント宛のメールに対して、 エラーメールの中に転送先アドレスの案内を含めます。
FEATURE(redirect)dnl
dnl # すべてのヘッダの送信者アドレスに、ホスト名が追加される
FEATURE(always_add_domain)dnl
dnl # 受信すべきドメインの定義を有効
FEATURE(use_cw_file)dnl
dnl # trusted-usersに記述する信頼ユーザ -fを指定してもワーニングを出されない
FEATURE(use_ct_file)dnl
dnl # procmailで配送
FEATURE(local_procmail, `’, `procmail -t -Y -a $h -d $u’)dnl
dnl # smtp接続(リレー)許可設定
FEATURE(`access_db’, `hash -T -o /etc/mail/access.db’)dnl
dnl # access_dbに受取らない設定をすることが出来ます。
FEATURE(`blacklist_recipients’)dnl
dnl # Submission Port(587)の設定
DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea’)dnl
dnl # 25番ポートでの受信設定
DAEMON_OPTIONS(`Port=smtp, Name=MTA’)dnl
dnl # ローカルドメインでの受信有効
LOCAL_DOMAIN(`localhost.localdomain’)dnl
dnl # RBLで受信拒否
FEATURE(dnsbl,`all.rbl.jp’,`”554 Rejected ” $&{client_addr} ” found in all.rbl.jp”‘)dnl
dnl # 最大受信メッセージ容量(バイト)
define(`confMAX_MESSAGE_SIZE’,`10485760′)dnl
dnl # 1メール受信で最大50の受信者指定が可能
define(`confMAX_RCPTS_PER_MESSAGE’, `50′)dnl
dnl # バージョン情報をunknownに変更する
define(`confSMTP_LOGIN_MSG’,`unknown’)dnl
dnl # メールヘッダーに展開する際にバージョン情報をunknownに変更する
define(`confRECEIVED_HEADER’,`$?sfrom $s $.$?_($?s$|from $.$_)
$.$?{auth_type}(authenticated)
$.by $j (unknown)$?r with $r$. id $i$?u
for $u; $|;
$.$b’)dnl

sendmail.mcからsendmail.cfを作成

# make sendmail.cf
# make install-cf
以上でsendmail.cfとsubmit.cfがインストールされます。

submit.cf
sendmail 8.12では、25/TCPでメールを待ち受けるMTAと、MSA(Message submission agent)の機能が分離されました。
MSAとはローカルからのメールを587/TCPで待ち受ける特殊なMTAで、メール送信(投稿)のための構成要素です。
submit.cf はMSA のための設定ファイルで、メッセージの情報が不足していたり、形式が不完全であった場合にメッセージ形式を整形してからMSAは配送処理を行います。
標準では、/usr/bin/mailのようなMSP(ローカルホストからメールを送るプログラム)はsendmailのバイナリを実行しますが、 その際にMSAと通信してメールを送ります。
MSAはMSPから送信されたメールを受け取り、MTAに渡す機能を果たします。

受信ドメインの設定
複数のドメインを受信する場合もここ書きます。後はアカウント単位で設定をvirtusertableに書けば簡単にマルチドメイン
対応が可能です。

# vi local-host-names
xxxxxxx.com

強制受信つまりWhitelist
自分のサーバがチェックが厳しくて弾き返すなら、強制受信を以下のように行います。
# vi access
Connect:sakura.ne.jp OK
Connect:nifty.com OK
Connect:biglobe.ne.jp OK

sendmailの起動

# service sendmail start

アカウント作成はお好みで/etc/passwd,shadowでアカウントを作り、認証はsaslauthdデーモンで行います
巷のネットにあるサーバ構築情報には間違いが多くsaslauthdとauxpropをごちゃ混ぜにして説明しているサイトが多いですが
/etc/passwd使うならsaslauthdデーモンを利用します。

# /etc/sasl2/Sendmail.conf
pwcheck_method:saslauthd
mech_list: plain login cram-md5 digest-md5

# yum install cyrus-sasl # service saslauthd start
dovecotが入っている場合はdovecotも再起動してください。
# service dovecot restart

Imap – Dovecotの設定

まず最初にdovecotをインストール
# yum install dovecot
# service dovecot start

今回はシンプルな/etc/passwdで認証する方法をご紹介する。大勢のアカウントが無い、精々20人程度ならそんなもんでいいでしょう。

#cd /etc/dovecot

dovecot.confを編集します。
特にpopは必要ないでしょう。下記のようにします。
protocols = imap imaps

次に詳細を設定します。
# cd /etc/dovecot/conf.d

修正するファイルは以下の通り。
10-auth.conf
10-mail.conf
10-master.conf
10-ssl.conf
auth-system.conf.ext

1.
# vi 10-auth.conf
2カ所修正。

auth_mechanisms = plain login
include auth-system.conf.ext

2.
# vi 10-mail.confmbox_write_locks = fcntl

mail_location = maildir:~/Maildir
mbox_write_locks = fcntl

3.
# vi 10-master.conf

service imap-login {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}

}

4.
あらかじめ証明書は作っておいてくださいね。

# vi 10-ssl.conf
ssl = yes

ssl_cert =”xxxxxxxxx.crt”

ssl_key =”xxxxxxxxx.key”

ssl_key_password = “xxxxxxxxxx”

# vi auth-system.conf.ext

passdb {
driver = pam
# [session=yes] [setcred=yes] [failure_show_msg=yes] [max_requests=]
# [cache_key=] []
#args = dovecot
}

userdb {
# <doc/wiki/AuthDatabase.Passwd.txt>
driver = passwd
# [blocking=no]
#args =
}

# service dovecot restart

アカウント作成とパスワード設定
# useradd username
# passwd username

ネットワークチューニング

OSのネットワークカーネルチューニングについて色々なサイトを参考にまとめてみました。
自分自身でもよく使うものなので備忘録として残そうと思います。

多くのネットワークチューニングで最も通信速度に影響するのは、ネットワークのバッファサイズです。別名ウィンドウサイズとも呼ばれています。

このバッファサイズには受信と送信の2種類があります。一般的には、送信、受信ともに同じサイズで設定しまいがちなのですが回線は上下で帯域が違うものです。やはりシンメトリーな回線ではないケースが多いためそれを考慮して設定する事が大切です。

サーバがWEBサーバだけならリクエストは受信ですから、一般的に大きなパケットが来ることがありません。しかしWEBコンテンツに動画のような大きなファイルをアップロードする仕組みなら大きなパケットが来ることでしょう。このように回線だけではなく、コンテンツがどのようなものか理解してその性格を理解してチューニングすることが大切です。

おそい回線なら、バッファが大きいほうが処理速度が早く感じます。しかし、高速CPU、高速回線の場合はむしろほどほどにしておくほうが効率が良いです。バッファ・サイズを大きくすることで転送失敗のリカバリーに即時性がなくなるからです。
下記に指針としての式を用意しましたが、あくまでも一つの基準としてこれをベースに設定をいくつかためしにパフォーマンスを見てみましょう。

Buffer size = Bandwidth (bits/s) * RTT (seconds)

受信パケットサイズ)
net.core.rmem_default :デフォルトバッファ値
net.core.rmem_max :最大バッファ値

送信パケットサイズ)
net.core.wmem_default :デフォルトバッファ値
net.core.wmem_max :最大バッファ値

OSのデフォルトと最大値のバッファの使い分けの具体的なアルゴリズムはわからないが、TCP の送受信バッファのデフォルトサイズと最大サイズは
あるタイミングでデータの送受信の状況により相互にオーバーライドされるようです。

その他)
net.ipv4.tcp_window_scaling :ウィンドウバッファが64KBを超える場合、この設定値が1になっている必要があります。
net.ipv4.tcp_sack :ばらばらに届くパケットを整列して、足りないものだけを受信するように促すため受信効率があがる設定です。
net.ipv4.tcp_timestamps :再転送のタイムアウトの算出方法よりも正確な方法で RTT を算出するオプションです

net.ipv4.tcp_mem :最初の値は、メモリー使用量の最小しきい値を表します。次の値は、メモリー圧縮モードを開始してバッファー使用量を圧縮する際のしきい値を表します。最後の値は、メモリー使用量の最大しきい値を表します。最大しきい値に達すると、メモリー使用量を減らすためにパケットが破棄されます。BDP 値が大きい場合はこの値も大きくします (ただし、この値はメモリー・ページのサイズであって、メモリーの容量ではないことに注意してください)。

net.ipv4.tcp_wmem :
自動調整に必要な 1 ソケットあたりのメモリー使用量を定義するオプションです。最初の値は、ソケットの送信用バッファーに割り当てられている最小バイト数を表します。次の値は、システムに過大な負荷がかかっていない状態で、バッファーのサイズをどこまで大きくできるかのデフォルト値を表します (wmem_default によって上書きされます)。最後の値は、送信用バッファー・スペースの最大値を表します (wmem_max によって上書きされます)。

net.ipv4.icmp_destunreach_rate :ICMP 不達パケット (Destination Unreachable packet) を送る最大レート。 これは特定のルートまたは行き先にパケットを送信するレートを制限する。
net.ipv4.icmp_echo_ignore_all:この値が非ゼロの場合は、 Linux はすべての ICMP_ECHO 要求を無視する。
net.ipv4.tcp_max_tw_buckets :システムが同時に保持する time-wait ソケットの最大数。この数を越えると、time-wait ソケットは直ちに破棄され、警告が表示されます。この制限は単純な DoS 攻撃を防ぐためにあります。わざと制限を小さくしてはいけません。ネットワークの状況によって必要な場合は、 (できればメモリを追加してから) デフォルトより増やすのはかまいません。

cmp_echo_ignore_broadcasts :この値が非ゼロの場合は、 Linux はブロードキャストアドレスに送られたすべての ICMP_ECHO 要求を無視する。

net.ipv4.icmp_ignore_bogus_error_responses:これを設定すると、 ネットワーク上のホストが、 ブロードキャストアドレス向けとみなしたフレームに対して不正に反応したために発した ICMP error を無視します。
net.ipv4.icmp_echoreply_rate:ICMP_ECHOREQUEST パケットに応答する ICMP_ECHOREPLY パケットの最大送信レート。
net.ipv4.icmp_timeexceed_rate:ICMP_TIME_EXCEEDED パケットの最大送信レート。 これらのパケットはパケットがあまりに多くの hop を通過した場合に、 ループを防ぐために送られる。

net.ipv4.tcp_fin_timeout :ソケットを強制的にクローズする前に、最後のFINパケットを待つ時間(n秒)を指定する。DoS攻撃対策のために必要。defaultは60秒。

クライアント側)

net.ipv4.tcp_timestamps: 再転送のタイムアウトの算出方法よりも正確な方法で RTT を算出するオプションです (RFC 1323 を参照)。このオプションはシステムの性能向上のために有効にします。デフォルトは1です
実際には無効(0)が良いみたい。
nmapなどでuptime(システムの連続稼働時間)を探られるのを防ぐ。uptimeが分かると、いつからカーネルを更新してないかがバレる
NAT環境下に複数ホストがいてそいつらがクライアントのときに、WAN側のサーバに接続が切られるときnet.ipv4.tcp_timestamps = 0 にすると解消されるらしい。

サーバ側)
net.ipv4.tcp_keepalive_time:コネクションのタイムアウト時間の設定。例えば、サーバへの接続数が多いときに、タイムアウト時間を短くすると、より多くの接続をさばけるようになる。

net.ipv4.tcp_tw_recycle:短時間に数多くのクライアントが接続する場合、TCP/IPのソケット不足になりWebブラウザに「Internal Server Error」が表示される場合があります。上記情報を追加することで、ソケットを高速にリサイクルできるようになります。

ただし、サーバ側で net.ipv4.tcp_tw_recycle が有効で、クライアント側でTCPのタイムスタンプオプションが有効(Linuxの場合net.ipv4.tcp_timestamps = 1)だと、NAT/LBを超えたときにSYNを落としてしまい、接続障害になる。
ユーザー向けに使っているとSB携帯などで障害が発生してしまうようなので、使わないほうがいいかも。

net.ipv4.conf.all.rp_filter:送信元IPの偽装防止
net.ipv4.conf.default.rp_filter:送信元IPの偽装防止

OSのチューニング

LinuxのOSチューニングは、サーバを運営する人によって欠かせないものです。

サーバプログラムは様々なものがありますが、これらのプログラムはOSの核であるkernelからリソースを供給してもらい動作するからなのです。
よくある失敗はサーバの設定だけメモリ割り当てを増やしてしまい、OSのカーネル共有メモリの割り当てを行なっていない事です。

メモリはOSから供給されるわけですから、当然kernelがメモリをサーバプログラムへ渡す際に許容範囲というものが生じています。
故にkernel側でサーバプログラムに十分なメモリを提供するためのチューニングが必要となります。

このサーバプログラムに提供するメモリを共有メモリと言っています。
実際にはカーネルパラメータshmmax、shmallというのが共有メモリを調整するパラメータになります。

  • SHMALL システム全体の共有メモリ・ページの最大数
  • SHMMAX 共有メモリ・セグメントのバイト単位の大きさの上限
  • SHMMIN 共有メモリ・セグメントのバイト単位の大きさの下限

気を付けないといけないのは、SHMALLの値です。よくあるのはSHMALLとSHMAXの値を同じにしてしまう事ですが、実際は上記に書かれてある通り
SHMALLはページサイズを指定するのであり、バイト数ではありません。

カーネルのインクルードファイルlinux.hからすると以下の算定式で設定することがわかっています。
(kernel 2.6.32(CentOS6.3)から抜粋)
#define SHMALL (SHMMAX/PAGE_SIZE*(SHMMNI/16)) /* max shm system wide (pages) */
#define SHMMNI 4096 /* max num of segs system wide */

SHMALLの算定式は以下の通リです。
SHMALL= SHMMAX/4096 * (4096/16)
*SHMMAXはカーネルがアプリケーションなどに割り当てる共有メモリサイズの最大値を設定するのでユーザ毎に代入し計算してください。

Linux TIPS&実験室

ひさびさにリナックスサポートサイトをリニューアルしました。会社経営をしていることもあり中々時間をさけなくなっていましたが、また復活させて頑張ってサポート記事を書いていきたいと思います。

今回はサイト自体を、今はやりのレスポンシブ表示に対応させてみました。各種デバイスに合わせて最適な画面表示を行うようになっていますのでスマートフォンやタブレットでも見やすく表示させる事が可能です。

どうぞ今後ともよろしく御願いします。