月別アーカイブ: 1月 2012

MySQL接続にSSLを使用する – PHP MySQL SSL WordPress MYSQL_CLIENT_SSL 暗号化

 MySQLの接続にSSLを使う話。

 このブログはWordpressとMySQLが別のサーバで動いている(WindowsServer2003R2化したさくらのVPS上にMySQLサーバを設置して、Apache+PHPを設置したLinux状態のさくらVPSからmysqlコネクタを経由して接続している)
mysql接続は通常は平文なので、ネットワーク上で色々な情報がだらだら流れてしまうのは嫌なので、このコネクションをSSLで暗号化する。

 まず、WindowsServer2003R2上に設置したMySQLサーバにSSL設定を行う。
 MySQL5.5サーバのWindowsバイナリにはSSL機能が含まれているから、特別なプログラムを追加する必要はないけど、Windows上のSSL管理は複雑だ。
 MySQLサーバでは秘密鍵は暗号化されていないファイルでなければならないのだけど、Windowsではそもそも証明書ストアの内部に格納されているので、これを取り出さなければならないんだけど、その操作が証明書の取得と前後する(普通は秘密鍵をベースとして証明書の管理をするんだけど、Windowsでは証明書を取得しないと秘密鍵か取り出せない)
 まず、WindowsのIISマネージャを起動して、ナビゲーションからサーバ>Webサイト>既定のWebサイトを選択して、プロパティを開いて、「ディレクトリセキュリティ」タブにある「セキュリティで保護された通信」の「サーバー証明書」を叩いて「IIS証明書ウィザード」から、「証明書の要求を作成して後で送信する」処理でCSRを作成する(WindowsServer2003R2では古い1024ビットがデフォルトになっているけど、現在は2048ビットが一般的なので、それを選択してCSRを作成する)
 CSRを生成したら、普通にSSL証明書を取得してきて(今回はSSLボックス
からRapidSSLを取得)、適当なcer(※α)としてファイルに保存して、再度「IIS証明書ウィザード」から証明書を登録する(証明書を取得したときに、認証局の証明書も来ると思うので、これも適当なcer(※β)としてファイルに保存しておく)
 証明書の登録処理が完了したら、「セキュリティで保護された通信」の「証明書の表示」を開いて、「詳細」タブの「ファイルにコピー」を実行して、「秘密キーのエクスポート」で「はい」を選んで進むと、PKCS#12形式に固定されているので、チェックボックスを全て解除して、適当なパスワードを設定してpfxファイルにエクスポートする。
 OpenSSLが導入された環境で・・・

openssl pkcs12 -in 出力したpfxファイル -out 中間.cer

で、PFXをデコードする。 この時、聞かれるパスワードは、エクスポート時に設定したパスワードで、パスフレーズはCERに設定するパスフレーズである。
 で、CERにすると、秘密鍵はRSA暗号化された状態なので、再度opensslで

openssl rsa -in 中間.cer -out 平文.pem

とすると、パスフレーズを聞かれるから、先ほど設定したパスフレーズを入れて平文の秘密鍵(※γ)を得る。

 この手順で、α:サーバ証明書、β:認証局証明書、γ:秘密鍵が揃うので、MySQLサーバのあるホストの適当な場所に配置する。
 後は、MySQL設定ファイル(Unixではmy.cnfだが、WindowsではMySQLインストールディレクトリのmy.ini)の[mysqld]セクションに設定を追記する。

ssl-cert=”αのフルパス”
ssl-ca=”βのフルパス”
ssl-key=”γのフルパス”

の、3設定を入れてMySQLサービスを起動する。
 MySQLクライアントで「SHOW VARIABLES LIKE ‘%ssl%’;」とか打つと、

have_openssl : YES
have_ssl : YES

になっていれば、サーバはSSL動作可能な状態になっている。

 PHPのMySQLクライアントでSSL接続する場合には、mysql_connectの第五引数にMYSQL_CLIENT_SSL定数を設定すればOK。
 Wordpressでは、/wp-include/wp-db.php で、@mysql_connect(…)としている部分で、第四引数までセットされているから、「, MYSQL_CLIENT_SSL」と第五引数を追記してやれば、WordpressのDB接続時にはSSL接続を使うようになる。
 正常にSSLに接続されているか確認するために、mysql_connectの下あたりに

$res = mysql_query(“SHOW STATUS LIKE ‘Ssl_cipher'”);
var_dump(mysql_fetch_assoc($res));

とか書いてWordpressサイトに接続してみると、DHE-RSA-AES256-SHAとかの値がべたっと入っていれば、接続はSSLで保護されている(空文字が戻っていたらSSL保護されていない)

 これで、ネット経由のmysql接続が保護されるので、安心して使うことが出来る。

(227)


カテゴリー: MySQL, PHP, Windows VPS, サーバ設定 | コメントをどうぞ

postfix初期設定 – postfix main.cf

 メールにpostfixを使う場合の/etc/postfix/main.cf設定値のメモ。 デフォルト

myhostname = host.hoge.piyo #自分のホスト名(フル)
mydomain = hoge.piyo #自分のドメイン名(ホスト名を取った部分)
myorigin = $mydomain #ユーザ名のみでポストしたメールのFromの@以降に付けるアドレス(この場合、user@$mydomain=user@hoge.piyoになる)
inet_interfaces = $myhostname, localhost #メールをリッスンするIP(デフォルトではlocalhostのみなので、127.0.0.1[localhostのhosts値]からの送信専用になっているので、外部からメールを受け取れない。 ホスト名で指定する場合、ルックアップでIPを取得できないといけないので、ServersMan@VPSみたいに複数IP割り振ってもらったサーバの場合に受け入れる仮想アダプタを設定できる。 NAT経由でプライベートIPなLAN上のサーバの場合とか、ホスト名をDNSでルックアップするとグローバルが帰ってくるけど、持ってるアダプタのIPはプライベートになるから、ホスト名じゃなくIP指定が良い) 
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain #自分が最終転送先であるアドレスのリスト($mydomainを追加して、user@hoge.piyoを受信出来るようにする)

とりあえずこの辺を設定すれば動く。
さくらのVPSServersMan@VPSデフォルト共通。

参考

(62)


カテゴリー: サーバ設定 | コメントをどうぞ

さくらのVPSで動画を楽しむ – ffmpeg トランスコード ストリーミング ts h.264 x264 変換

 レンタルサーバを使って動画を楽しむ話。
 さくらのVPSの処理能力の高さは各所で言われているとおりで、今回は、このパフォーマンスを動画処理に活用してみた。

 自宅の録画サーバはAMD E-350プロセッサ(2コア1.6GHz)で、PLEX PX-W3PEを挿して、地上2ch・衛星2chの同時録画が出来る静音マシンにしている。 RecTaskを使って録画しているのでファイル形式はTSだ。
 TSファイルは、基本的にMPEG2ビデオとAACオーディオ(場合によってはAC3)のタイムストリームで、地上波なら1時間7GB程度の大きなファイルだ。 スマホなどで見ようとすると32GBのmicroSDHCを使っても4時間少々しか入らず、入れ替えが面倒なので、これをコンパクトに圧縮(トランスコード)して保存活用するのがスタンダード。
 しかし、TSの直録画をしている分にはE-350でもこなせるが、トランスコードしようとなると非力すぎで、Core i7等のハイパフォーマンスPCが欲しくなってくる訳だが、この作業をさくらのVPSに任せてしまおうと画策したわけだ。

 基本的な流れ。

  • 1,録画サーバから1日1回、レンタルサーバにTSファイルをFTPで自動アップロードする(タスクスケジューラ設定でOK)
  • 2,レンタルサーバでアップロードディレクトリを監視して変換処理を行う(cronバッチシェルffmpeg
  • 3,トランスコードしたファイルをhttpディレクトリに移動する。 また、アップロードファイルを削除する。

1:
録画サーバはWindowsHomeServer2011なのでPowerShellで簡単作成。
事前に

Set-ExecutionPolicy RemoteSigned

して、シェル実行可能に設定(PowerShellの実行権限設定について参考:Paddle Log Point

PSバッチを作成(c:\shells\tsup.ps1)

echo “open ホスト名rnユーザ名rnパスワードrnbinrn" | Out-File d:\uploadcmd.txt -encoding Default
foreach($file in ls d:\ts\*.ts){
echo "put $file" | Out-File d:\uploadcmd.txt -encoding Default -append
}
echo "quit" | Out-File d:\uploadcmd.txt -encoding Default -append
ftp -s:d:\uploadcmd.txt
mv d:\ts\*.ts d:\ts_backup\

d:¥tsディレクトリ中の.tsファイルを全てアップロードするftpコマンドリストを作って、ftpコマンドに食べさせて、処理済みtsファイルをバックアップディレクトリに移動するというPSスクリプトだ。
-encoding Defaultにしないと、文字コードがUNICODEになるが、ftpコマンドのコマンドリストはローカルエンコーディングでないとエラーになるので指定している(リダイレクトもUNICODEになるからOut-File使用)
このPSを録画のない時間帯にタスクマネージャで回せばOK

2:
変換ツールを導入する

wget ftp://ftp.videolan.org/pub/x264/snapshots/last_x264.tar.bz2
bzip2 -d last_x264.tar.bz2
tar xf last_x264.tar
cd x264-snapshot-*
./configure
make
make install

wget http://sourceforge.net/projects/faac/files/faac-src/faac-1.28/faac-1.28.tar.gz/download
tar xzf faac-1.28.tar.gz
cd faac-1.28
./configure
make
make install

wget http://ffmpeg.org/releases/ffmpeg-0.9.1.tar.gz
tar xzf ffmpeg-0.9.1.tar.gz
cd ffmpeg-0.9.1
./configure --enable-libfaac --enable-pthreads --enable-libx264 --enable-gpl
make
make install

x264、faacをビルドしてから、ffmpegをビルドする(ffmpegで前2個のライブラリを使うのでffmpegは必ず最後。 他にも色々なライブラリを導入することも出来るが、今回は最低限のマルチスレッドモジュールとAACとX264エンコーダだけ追加している)

後は、必要なプリセットやパラメータを決めてcronでバッチシェルを回せばよい。
私の場合は、中間シェルを作成。

h264encode.sh

filename=$1
posi=$*
shift
expr $posi -1
ffmpeg -y -i $filename -vn -f wav -acodec pcm_s16le -shortest $filename.wav
ffmpeg -y -pre /root/high.preset -i $filename -i $filename.wav -map 0:0 -map 1:0 -f mp4 -vcodec libx264 -crf 20 -level 41 -r 30000/1001 -aspect 16:9 -s 1280x720 -acodec libfaac -ac 2 -ar 48000 -ab 128k -threads 4 -vsync 1 -async 1 -shortest -deinterlace -top -1 $* ../out/$filename.mp4
ffmpeg -y -i $filename -i $filename.wav -map 0:0 -map 1:0 -f mp4 -vcodec libx264 -vprofile baseline -level 30 -crf 22 -r 30000/1001 -aspect 16:9 -s 400x240 -acodec libfaac -ac 2 -ar 48000 -ab 128k -threads 4 -vsync 1 -async 1 -shortest -deinterlace -top -1 $* ../out/$filename-walkman.mp4
rm $filename.wav

high.preset

vprofile=high
coder=1
level=41
deblockalpha=0
deblockbeta=0

qmin=7
qmax=28
qdiff=4
qcomp=0.8
i_qfactor=0.71
keyint_min=25
sc_threshold=40

me_method=umh
refs=10
subq=6
trellis=2
bf=16
me_range=24
g=250
b_strategy=2

partitions=+parti4x4+parti8x8+partp4x4+partp8x8+partb8x8
cmp=+chroma

flags=+loop
flags2=+bpyramid+mixed_refs+wpred+dct8x8+fastpskip

directpred=3
wpredp=2
rc_lookahead=60
rc_eq='blurCplx^(1-qComp)'
bidir_refine=1

こんな感じの設定をしている。

で、メインシェル↓をcronで回している。

cd /home/transcode/up
files="/home/transcode/up/*.ts"
for filepath in ${files}
do
sh /root/h264encode.sh ${filepath}
mv ${filepath} /home/transcoder/finished_ts/
done
echo "open HTTPサーバアドレス" > /root/ftpcmd
echo "user ユーザ名 パスワード" >> /root/ftpcmd
echo "bin" >> /root/ftpcmd
files="/home/transcode/out/*.mp4"
for filepath in ${files}
do
filename=
echo ${filepath} | sed -e “s/\/.*\///g”
echo $filename
ext=
echo ${filename} | sed -e “s/^.*[\.\/]//g”
file=
echo ${filename} | sed -e “s/\.[^.]*$//g”
filename=
echo ${file} | nkf -w80MQ | sed -e “s/=$//” | tr -d ‘\n’ | tr = %`
filename=”${filename}.${ext}”
echo “put \”${filepath}\” \”${filename}\”” >> /root/ftpcmd
done
ftp -n -i < /root/ftpcmd cd /home/transcode/out for filepath in ${files} do mv ${filepath} /home/transcode/finished_mp4/ done

サーバの構成
/home/transcode/up #録画サーバからTSをアップするディレクトリ
/home/transcode/out #エンコードしたMP4が一時的に置かれるディレクトリ
/home/transcode/finished_ts #エンコード済みのTSが保管されるディレクトリ
/home/transcode/finished_mp4 #エンコード済みのMP4が保管されるディレクトリ
 これで、/home/transcode/finished_mp4以下にファイルネーム.mp4のHDファイルとファイルネーム-walkman.mp4のWalkmanA860用ファイルの2個が出来ている。
 また、別のHTTPサーバにもFTPでアップロードしている(アップロード時にファイル名をurlencodeしている)ので、レンタルサーバの動画データは定期的に消す(tmpwatchでも良い)

 最初にwavに分離してエンコードしているのは、これをしないと音ズレが発生するため(おそらく、TSファイルのストリームの時間データが狂っていて、直接TSからストリームを取り出すと時間を合わせようとして逆に狂うようで、一度wavにはき出しておくと割と音ズレを小さくできる)

 後は、Androidケータイのブラウザでファイルをタップするとプレイヤー選択が出てくるから、好きなプレイヤー(私はMeridian使用)を選べばダウンロードしないで再生できる(HTTPのRangeヘッダーを使うことでファイルの任意の場所を転送できるため、全部をダウンロードしないでも任意の位置から再生できる) PCのChromeとかでも少しバッファリングするだけで再生できる。
 ISW11Fでは、今回のHD設定ファイル(1280×720 High@4.1 3Mbps程度)でもハードウェアデコードでストリーミング再生可能。
 ただし、3Gだとすぐにパケット規制上限(3日300万パケットが規制ラインだけど、30分再生で400万パケットくらい流れる)がかかるので、実質的にはWiFi・WiMaxで繋いでいるとき限定の使い方。 また、3G回線時のスループット的には、Walkmanプロファイル(400×240 Baseline@3.0 400Kbps)の方がなめらかだろう。

 さくらのVPS 4GBはhome以下の容量が100GBだが、完成品が1時間1GB位、原料が1時間7GB位消費するのと、他の用途も兼ねていて容量を使いたくないので、完成品ファイルは配信用の別のサーバに転送している。
 配信用(と言っても認証をかけて自分専用にしている)サーバは、私の場合、WAPPYのミドルプランを利用している。
容量150GBで転送量無制限、月額700円程度で済む格安レンタルサーバ。
エンコード済みファイルなら150時間分入れておけるのでソコソコのライブラリとして使えてオススメ。
しかし、普通の共用サーバなので、プログラムなどを自由に動かしたい場合にはSaasesのOsukini ST VPSが、月額980円で100GBの容量があって良いかもしれない。

 HTTPで配信する場合、mimeタイプ設定(root権限付きサーバなら/etc/mime.typesにvideo/mp4 mp4追記、共用サーバなら.htaccessにAddType video/mp4 mp4を記述)を忘れてはいけない。

※flags2のオプションが新しいバージョンのffmpegで動かないらしい(参照:お気に入りの動画を携帯で見よう 対応パッチが置いてあるので利用させて頂く)

(936)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

VPSはオトクなのか

 さくらのVPS 4GBプランを新規契約した時にVPSはオトクなのか考えた話。

1,電気料金
 さくら 4GB のUnixBench Indexは2200程度、Core i5(2コア+HT)クラスのマシンに相当する。
 このクラスのPCを24時間稼働して従量電灯の1~2段階料金だと月額約2000円の電気代がかかる。
 と言うことは、月額3980円から2000円は電気代と思って良いだろう。

2,回線料金
 さくらのネットワーク転送実レートは上り下り6MB/s程度出る。 48Mbpsだから、ADSLは超えてFTTHレベル。 Bフレッツが月額5460円なので、これだけでオーバーしている。
 更に、固定IPが割り振られる訳だが、固定IPプロバイダは最安値で月額1500円程度。
 ここまでで、自宅にサーバを設置した場合に比べて毎月5000円ほどオトク。

3,機材価格
 更に、機材の代金がかかる。
 処理性能に相当するサーバだとNECとかHPの2万円程度で買える特売サーバが相当するだろう。
 安い無停電電源等の設備も入れたとして一式4~5万円程度なので、初期費用の1万円に対しても遙かにオトク。

 また、無停電電源のバッテリのような寿命がすぐ来る(安いもので2年程度)部品交換や、サーバの部品が故障して交換したりすること、夏場は冷却が必要なことなどを考えると、どうやっても個人で用意する場合に比べて遙かにお安く済むのは確実だ。 と言うか、シリアルな演算の性能(高クロック&クロックあたり処理能力)を求めなければ、サーバ契約を横に増やしていくのがオトクだろう。
 はっきり言って、さくらの8GBとか、商用サイトを普通に運営できるレベルだ。 マネージドとかの要求がなければ普通にいける。
 このブログもさくらでWebサーバとDBサーバを構築している(1台はASPを動かすためにWindows化して、もう1台はLinuxで動かしている)
 完全仮想化なので、LiveCD LinuxをGRUBからISOブートして、hdaをddしてどこかに置けば災害対応のイメージバックアップも普通に取れる。

 クラウドのように変動が無く、定額で予算化できるのも良い(逆にクラウドのようにリソースを適時投入は出来ないが、同じ程度の処理能力を確保しておくなら、クラウドより安い)

(19)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

ServersMan@VPSのフルバックアップを取る – rsync sshfs

 さくらのVPSでは完全仮想化のおかげでddやdumpで簡単にイメージバックアップによるフルバックアップが取れるのだが、ServersMan@VPSでは準仮想化のためイメージバックアップが出来ないのでrsyncを使ってバックアップを取ることにした。
 バックアップ先は自宅のファイルサーバを利用する。
 ファイルサーバのサービスを追加したくないので既存のファイル共有サービスを利用してバックアップしたいのだが、ServersMan@VPSではリモートのnfsやsmbのファイルシステムをサポートしていない。 だが、fuseがサポートされていた↓

#cat /proc/filesystems
ext2
ext3
nodev proc
nodev sysfs
nodev tmpfs
nodev devpts
nodev binfmt_misc
nodev fusectl
nodev fuse
nodev rpc_pipefs

 fuseがサポートされていると、sshfsが使える。
 sshfsは名前の通り、sshを経由してリモートの記憶域を利用できるファイルシステム。
 標準のyumリポジトリにはsshfsは入っていないので、rpmforgeから取ってくる。

#wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm #リポジトリ追加のためのRPMを取得
#rpm -iv rpmforge-release-0.5.2-2.el5.rf.i386.rpm #取得したRPMからリポジトリを追加
#vi /etc/yum.repos.d/rpmforge.repo #標準でrpmforgeが有効になっているので無効にする↓enabledを1から0へ変更
enabled = 1 > enabled = 0
#yum install –enablerepo=rpmforge fuse-sshfs #rpmforgeリポジトリを使ってfuse-sshfsパッケージを導入する(おそらく依存関係も表示される)
#mkdir /mnt/fileserver #マウントポイントを作る
#sshfs remoteuser@fileserver.hoge.piyo:/home/remoteuser /mnt/fileserver #fileserver.hoge.piyo=自宅サーバのユーザー名remoteuserで/home/remoteuserをServersManの/mnt/fileserverにマウントする

 これで/mnt/fileserverが自宅のファイルサーバに繋がったので、後はディレクトリ指定でrsyncすればOK

 rsyncバックアップで除外するリストを作る。

#cat > /root/rsync_exclude_list
– /dev
– /sys
– /proc
– /mnt
ctrl+d

※本当は他にも除外した方が良い物があるが、最低限の記述で済ませた。

 rsyncを実行する。

rsync -avzHAX –exclude-from=/root/rsync_exclude_list / /mnt/fileserver/backup

オプション:
a:各種属性やソフトリンク等を維持する
v:進行状況を詳細に表示する
z:圧縮する
H:ハードリンクも維持する
A:ACLを維持する
X:拡張属性を維持する

 これでフルバックアップが取れる。
 普通はrsync to rsyncでバックアップを取る方法もあるけど、経路暗号化とサービス追加不要というポイントでrsync on sshfsにした。

(237)


カテゴリー: サーバ設定 | コメントをどうぞ