Pages

2011/03/31

PPA版Nginxのコンフィグオプションをチェック

Ubuntu10.10(maverick)などでnginxを使う場合は、公式が用意しているLaunchPadのPPAからStableを使うのがよさそうだ。

インストールして、どんなモジュールが使えるかチェックした。

# nginx -V
nginx version: nginx/0.8.54
TLS SNI support enabled
configure arguments:\
--conf-path=/etc/nginx/nginx.conf\
--error-log-path=/var/log/nginx/error.log\
--http-client-body-temp-path=/var/lib/nginx/body\
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi\
--http-log-path=/var/log/nginx/access.log\
--http-proxy-temp-path=/var/lib/nginx/proxy\
--http-scgi-temp-path=/var/lib/nginx/scgi\
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi\
--lock-path=/var/lock/nginx.lock\
--pid-path=/var/run/nginx.pid\
--with-debug\
--with-http_addition_module\
--with-http_dav_module\
--with-http_geoip_module\
--with-http_gzip_static_module\
--with-http_image_filter_module\
--with-http_realip_module\
--with-http_stub_status_module\
--with-http_ssl_module\
--with-http_sub_module\
--with-http_xslt_module\
--with-ipv6\
--with-sha1=/usr/include/openssl\
--with-md5=/usr/include/openssl\
--with-mail\
--with-mail_ssl_module\
--add-module=/build/buildd/nginx-0.8.54/debian/modules/nginx-echo\
--add-module=/build/buildd/nginx-0.8.54/debian/modules/nginx-upstream-fair


主要なモジュールに加え、サードパーティのモジュールも入ってますね。
Fairが使えるのは嬉しいのかもしれない。

Nginx用の a2ensite, a2dissite がないのでツールを作る

最近ChefのCookbookを触っているが、Rubyをちゃんと読めるほうが都合がよいので練習がてら。

ubuntuなどのdeb系はapache httpdのサイト管理がよく作られており、サイト単位の有効無効を a2ensite, a2dissiteというツールで切り替えるように工夫がされています。

Nginxでもコマンドでサイト管理やりたいなあと思い作成。
 



使い方


3つのメソッド(サブコマンド)を持ちます、オプションなしでたたくと一応使い方を出すようにしました。


  • list:sites-available にあるコンフィグファイルをリストアップ。
    現在有効なものは+(プラス)を、無効なサイトは-(マイナス)を付与して表示。

  • enable {configfile}:sites-enabled にリンクを作成してnginxをリロード。

  • disable {configfile}:sites-enabled からリンクを削除してnginxをリロード。


 


コマンド例


ngsitectl.rb disable default

とか

ngctlにエイリアスして
ngctl enable example.com

このようにします。


リストはこんな感じで出します。
# ngctl list
- example.com
+ 8082
+ rprox.conf
+ 8081
- default
+ 8083
+ ssl_rprox.conf




リロードがいやな人はコメントアウトしたりgracefulに相当する手続きがあるのでそれを変わりに仕込みましょう。
この辺は改良の余地が大きいですね。
 

コード


自分でつかうのでGithubにも置いてます。
https://github.com/sawanoboly/optools/blob/master/ngsitectl.rb
うちはハイライトしてないからGithubのほうが見やすいですね。

そうそう、1.9.2 p180 で作っているので他のVerについては動くか見てないです。

ngsitectl.rb
#!/usr/bin/env ruby
# encording: utf-8

## Const
AvailDir = "/etc/nginx/sites-available/"
EnableDir = "/etc/nginx/sites-enabled/"


# list up all site and add "+" for enable sites.
def list(sitename)
sitesall = Dir.entries(AvailDir)

# exclude dots
sites = sitesall.select{|elem| elem != "." and elem !=".."}

# enabled sites check.
sites.each do |site|
if File.exist?(EnableDir + site) then
puts "+ " + site
else
puts "- " + site
# File.symlink(AvailDir + site, EnableDir + site)
end
end
end

def enable(sitename)
if File.exist?(EnableDir + sitename) then
puts "Site:" + sitename + " is already enabled.\nDo nothing."
elsif File.exist?(AvailDir + sitename) then
puts "enable: " + sitename
File.symlink(AvailDir + sitename, EnableDir + sitename)
puts `/etc/init.d/nginx reload`
else
puts "Site:" + sitename + " Config not found."
end
list(sitename)
end

def disable(sitename)
if File.exist?(AvailDir + sitename) then
if File.exist?(EnableDir + sitename) then
puts "disable: " + sitename
File.unlink(EnableDir + sitename)
puts `/etc/init.d/nginx reload`
else
puts "Site:" + sitename + " is already disabled.\nDo nothing."
end
else
puts "Site:" + sitename + " Config not found."
end
list(sitename)
end


begin
method(ARGV[0]).call(ARGV[1])
rescue TypeError => ex then
puts <<"HEREDOCS"
Nginx site control script.
Usage:
list: list all available sites
enable {sitename}: enable site and reload nginx
disable {sitename}: disable site and reload nginx
HEREDOCS
rescue => ex
puts "Exception " + "#{ex.class}"
puts "#{ex.message}"
puts
puts <<"HEREDOCS"
Nginx site control script.
Usage:
list: list all available sites
enable {sitename}: enable site and reload nginx
disable {sitename}: disable site and reload nginx
HEREDOCS
end

2011/03/26

Ubuntu10.10、Open vSwitch(1.1)でBonding

Linux、特に仮想ホストでブリッジをOpen vSwitchにしておくことは色々と良い気がするのでKVMのホストに導入してみた。
 

さて、Helpを見るとBondingができるようです。

# ovs-vsctl --help
--snip--
Bridge commands:
add-br BRIDGE create a new bridge named BRIDGE
--snip--
Port commands:
add-port BRIDGE PORT add network device PORT to BRIDGE
add-bond BRIDGE PORT IFACE... add bonded port PORT in BRIDGE from IFACES

add-bondなどというサブコマンド。

既存のbondingモジュールを外して設定してみます。
 

2011/03/22

さくらVPSのUbuntu10.10にRuby1.9.2

サーバにOSをインストール(過去記事参照)したら、次に入れるのはRubyだろう。
Chef-clientにするためだ。

最近やっている手順をメモっておく。
※rubyのパッチバージョンは適当に読み替えで。
 

2011/03/21

ネットワーク経由でmembaseとmemcachedを比較

memcachedは便利だがスケールさせるとなるといろいろ考え方がある。

プロダクトもいろいろあるが、memcachedの本家が作っており導入が簡単なmembaseを試してみた。
ネットワーク越しだと割り切ればそれなりだ。

さくらのVPS(1G)にUbuntu10.10をインストール

さくらのVPS(1G)を使おう。入れる予定はChefとSwiftとgit。

シリアルコンソールがつながっているため、手動Netbootなりの方法が使える。
ubuntu10.10を入れてみよう。
 


参考:第154回 さくらVPSへのネットブートインストールをPreseedingで自動化する

手法自体は参考記事の出だし部分があれば大体OKなんだけども、
GRUBの設定を少し修正する必要があった。※元記事はGRUB1, ここでは10.04を一度入れていたのでGRUB2なのです。

menuentry "Ubuntu Netboot Install" {
set root=(hd0,1)
linux /ubuntu/linux ro root=LABEL=/ console=tty0 console=ttyS0,115200n8r
initrd /ubuntu/initrd.gz
}

 


これでOK。
またはGRUBのコンソールで頑張ってもいいけど。
 

2011/03/18

mongoDBを1.6.xから 1.8.0にアップグレードする

monogoDB1.8の正式版がリリースされた。
開発環境にはubuntu10.10Serverにパッケージで入れている1.6.5が動いている。


公式ドキュメントUpgrading to 1.8.0を見ると、バイナリ上書きでOK! みたいなことがあるのでUpgradeしてみた。

気になるレプリカセット構成も順繰りでUpgrade可能だった。
 

2011/03/16

MongoDBのレプリカセットで、Slave(Secondary)からもget (Readの負荷分散)

MongoDBの負荷分散ではReadのためのReplicaSet、WriteのためのShardと2つの方式を取ることができます。

ReplicaSetは冗長化・ミラーリング、Shardingはストライピング風の役割で、スケールアップするためにはRaid10を構成するように拡張していくことになります。
 

libvirt下のVMでSheepdogのdiskを使おう

SheepdogからのVM作成ができたらば、次はvirshやvirt-managerから操作するためにlibvirtで管理できると助かると思う。
 

前提としてこのくらい必要だが、できるようになっている。

  • Sheepdogが動いており、利用可能なボリュームがある

  • libvirtのバージョンは0.8.7 以降(diskのtypeにnetworkが追加)

  • virshがどこかで使える


 

2011/03/15

[再掲]Pythonの一行WEBサーバ

旧ブログから再掲。
 

Linuxサーバで作業中、カレントディレクトリをルートにしていきなりWEBサーバを上げる。
 

python -m SimpleHTTPServer

 

TCPの8000番で上がってくるので、ブラウザからファイルを参照することができる。
index.htmlがあればそれが表示される。

画像:libvirtのDocs
 

読もうとしたDocumentがHTML形式だったときは、読む際にWEBサーバで上げてしまう。
Rubyでもできるけども、OS入れたら大抵入ってるPythonなのがいい。
 

物理サーバ1台でSheepdogの分散を試す 経過 2/n

物理サーバ1台でSheepdogの分散を試す 計画編の続き。
 

仮想ブロックデバイスのクラスタリングエンジンSheepdogについて。


画像:Sheepdogを使ったVM
 

こんな環境でSheepdogは動作するのか?というテスト。
 

2011/03/12

knifeのInteractiveモードがとてもインタラクティブ(chef)

またChef - knifeの話だ。
 
knife sshにはインタラクティブモードというのがある。
やってみよう。
 


# knife ssh "lsb_id:Ubuntu" interactive  -x root -P passwd


クエリは前回同様だが、コマンド部にて"interactive"を指定しよう。
複数ノードが引っかかるようにクエリしたほうがよくわかる。
 

では動作についてちょっと紹介。

Knife sshで任意のサーバにコマンド実行(Chef)

前回のChefServer紹介で、クライアントがインベントリされるのが分かりました。

recipe通りに仕上がったサーバに手を加えるときにこのインベントリが役に立ちます。
 


これを活用するにはknifeのサブコマンド、knife sshを使うのが分かりやすいでしょう。
単純な話なので例だけ。
 

2011/03/11

Chef-Server/Client で楽をしたい

自動デプロイツールのChefってどうやねんという人向けにこうなるというのを手順無視でお届け。
 

ちなみに導入するなら初めはServerをマニュアルで入れるのが使っている部品が分かってよい。

2011/03/08

物理サーバ1台でSheepdogの分散を試す 計画編

最近分散ストレージのSheepdogが気になるのです。
http://www.osrg.net/sheepdog/


試してみようと思っているが、今丁度よさげなサーバは数台。
仕方がないので物理サーバ1台で分散する構成を考えました。

※まだ試してないので計画段階です、何かで頓挫するかもね。
 

ubuntu10.10Serverでbonding

UbuntuBonding
https://help.ubuntu.com/community/UbuntuBonding

を参考に設定したがそれだけでは設定がうまくいかなかったのでメモ。
 

2011/03/03

mongodbでRESTをON(confファイル)

mongodbを立ち上げるとついてくるWebUI、初期値ではRESTがOFF。
オプション "--rest" を付けて立ち上げるように促される。


なぜかアンドキュメンテッドなんだが、

設定ファイル(/etc/mongodb.confなど)に
rest = true


としても有効になるのだ。

MySQL Clusterの管理ノード(ndb_mgmd)冗長化

MySQL Clusterの情報をいくつか見てましたが、ndb_mgmdが冗長化された状態のサンプルが見当たらなかったので自分のところで載せておこう。
 


設定例


SQLノード(mysqld)、データノード(ndbd)の設定


ndb-connectstring をカンマ区切りで並べたらよいみたいです。

参考:クラスタの 接続文字列
http://dev.mysql.com/doc/refman/5.1/ja/mysql-cluster-connectstring.html

 


ndb-connectstring=192.168.30.227,192.168.30.235

 

管理ノード(ndb_mgmd)のconfig.ini



IDを分けて2つ定義します。
# node A
[NDB_MGMD]
hostname=192.168.30.227
datadir=/var/lib/mysql-cluster
id=1

# node B
[NDB_MGMD]
hostname=192.168.30.235
datadir=/var/lib/mysql-cluster
id=2



管理ノードの初回起動時にコマンドラインで自分のIDを指定しました。
NodeA # ndb_mgmd --ndb-nodeid=1
NodeB # ndb_mgmd --ndb-nodeid=2


一度起動しておけば、バイナリ化されたコンフィグに持つのか、移行は自分のIDを覚えててくれるようです。
 


起動してみる


お互いをの管理ノードを起動して、しばらく待てば2つの管理ノードが並ぶ。

 -- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.30.227:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 4 node(s)
id=11 @192.168.30.227 (mysql-5.1.51 ndb-7.1.10, Nodegroup: 0, Master)
id=12 @192.168.30.235 (mysql-5.1.51 ndb-7.1.10, Nodegroup: 0)
id=13 @192.168.30.228 (mysql-5.1.51 ndb-7.1.10, Nodegroup: 1)
id=14 @192.168.30.236 (mysql-5.1.51 ndb-7.1.10, Nodegroup: 1)

[ndb_mgmd(MGM)] 2 node(s)
id=1 @192.168.30.227 (mysql-5.1.51 ndb-7.1.10)
id=2 @192.168.30.235 (mysql-5.1.51 ndb-7.1.10)

[mysqld(API)] 2 node(s)
id=51 @192.168.30.227 (mysql-5.1.51 ndb-7.1.10)
id=52 @192.168.30.235 (mysql-5.1.51 ndb-7.1.10)


どちらからでもndb_mgmシェルで操作可能、片方をkillしても一応稼働しいてた。

管理ノードを冗長化したら、動作はActive+Standbyだと見た気がするんだがどっちかがマスターなのかしら?

Amazon AWSで リージョンTokyoをデフォルトで使う

Twitterで何やら騒がしいのでAWSをのぞいてみた。
Tokyo(ec2.ap-northeast-1) が来ていたのか。

EC2_URL の環境変数を設定しておけば、デフォルトのリージョンが指定できるのでTokyoにした。

[sawanobori@dev ~]$ export EC2_URL=https://ec2.ap-northeast-1.amazonaws.com
[sawanobori@dev ~]$ ec2-describe-regions
REGION eu-west-1 ec2.eu-west-1.amazonaws.com
REGION us-east-1 ec2.us-east-1.amazonaws.com
REGION ap-northeast-1 ec2.ap-northeast-1.amazonaws.com
REGION us-west-1 ec2.us-west-1.amazonaws.com
REGION ap-southeast-1 ec2.ap-southeast-1.amazonaws.com


うーん、来てしまったね。。

mysqlslapをrpmから取り出してつかう

mysqlslapの記事を見て使って見ようと思ったら、5.1のクライアントパッケージから同梱されていると。

CentOSから使おうとしたら入ってなかったので公式配布のクライアントrpmをばらして叩いてみた。


拾ってきたのはGenericのパッケージ、"MySQL-5.5.9-1.linux2.6.i386.tar"

展開して叩いてみる。
tar xvf MySQL-5.5.9-1.linux2.6.i386.tar
rpm2cpio MySQL-client-5.5.9-1.linux2.6.i386.rpm | cpio -id | cpio -id


usr/bin/mysqlslap -V
usr/bin/mysqlslap Ver 1.0 Distrib 5.5.9, for Linux (i686)


使えるかな?


# usr/bin/mysqlslap -h 192.168.1.10 -P 4040 -u root -p -a --number-of-queries=100
Enter password:
Benchmark
Average number of seconds to run all queries: 0.446 seconds
Minimum number of seconds to run all queries: 0.446 seconds
Maximum number of seconds to run all queries: 0.446 seconds
Number of clients running queries: 1
Average number of queries per client: 100


ちゃんと動くようだね。

※mysqlslap.t1 というテーブルを事前につくっています。

ubujntu10.10のmysql-proxyパッケージ

mysql-proxyを入れたが起動スクリプトが何もしないで
exitするので開いてみた。

しょっぱなからパスが違う。

×DAEMON="/usr/sbin/mysql-proxy"
○DAEMON="/usr/bin/mysql-proxy"

これでOKさ。

2011/03/01

phpのMySQLモジュールを差し替える

ただしSharedに限る。
 

LAMPな環境でMySQLだけ差し替えたりすると、しばしばこういう目に合う。
 


phpMyAdmin さんからの警告。
PHP MySQL ライブラリのバージョン 5.0.90 が MySQL サーバのバージョン 5.1.53 と異なります。

 

このままでも動くけど気持ち悪いのでMySQL関連のライブラリだけ差し替えます。