SSH切断時にtmuxが自動で閉じないようにした

SSHとかで接続失敗した時とか画面表示確認する前に閉じられてしまい原因調べるのが面倒だったので、ssh/mosh コマンド実行時にはセッションが閉じてもtmuxのWindowsが閉じないようにしてみました。

SSH用

1
2
3
4
5
6
7
function ssh_tmux() {
  eval server=\${$#}
  tmux set set-remain-on-exit on\; \
      new-window -n s:$server "ssh $*"\; \
      set set-remain-on-exit off > /dev/null
}
alias ssh=ssh_tmux

Mosh用

1
2
3
4
5
6
7
function mosh_tmux() {
  eval server=\${$#}
  tmux set set-remain-on-exit on\; \
      new-window -n s:$server "mosh $*"\; \
      set set-remain-on-exit off > /dev/null
}
alias mosh=mosh_tmux

screenの時は良く分からなくて zombie ^[ と書いて全て残るようにしてたんだけど、tmuxはコマンド使えるので普段は自動で閉じて、ssh/moshの時だけ閉じないとかできて楽チンですね。

Moshをインストールしてみた

Moshを使うとネットが遅かったり切れたりしても大丈夫とかいう話を聞いたので、新しくなったさくらVPSにMoshをインストールしてみました。

サーバのDebianにインストール

Debianにはmoshのパッケージがないようなので自分でコンパイルする。
以下の様にして必要なパッケージを導入。ただ、元々入っているパッケージもあるのでこれで全部かは不明。

1
sudo aptitude install build-essential protobuf-compiler libprotobuf-dev pkg-config dh-autoreconf zlib1g-dev libboost-dev libncurses-dev

必要なパッケージが入ったら後はgithubからソースを持ってきて普通にコンパイルする。
管理者権限が必要なく、ログインアカウントのPATHさえ通ってれば行ける感じだったので普段通り/homeディレクトリ内にインストールした。

1
2
3
4
5
6
7
git clone git://github.com/keithw/mosh.git
cd mosh
./autogen.sh
./configure \
  --prefix=$HOME/local

make && make install

クライアントのUbuntuにインストール

Ubuntuにはパッケージからインストールできるようなのでここを参考にパッケージからインストールする。

1
2
3
4
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:keithw/mosh
sudo apt-get update
sudo apt-get install mosh

接続テスト

クライアント側とサーバ側でのインストールが完了したら接続テストをしてみる。
特別サーバ側で事前になにかする必要はなく、クライアント側からの接続時にmosh-serverが立ち上がります。

1
mosh {sakura_vps_ip_address}

まだMoshのメリットを享受してないので分からないですが、良い感じなら他のサーバにも導入しようかな。

「X分で読めるよ」のブログパーツ入れてみたったよー!

人のブログ見てて、ふと思い立ったので「X分で読めるよ」ブログパーツを入れてみたった。
プログラム弄るの面倒だったので、arccosineさんが作ったJavaScriptで動くやつを使ってます。
しかし、theme以下がgitに入ってなかったのでとりあえず生成後のファイルに直書きしてしまっているので後で直さんといかんなぁ……

第2回 クラウドサーバ勉強会に参加してきた

第2回クラウドサーバ勉強会に参加してきました。
今回はXOOPS初心者勉強会の横でやってたのですがほとんどの時間関係ないことやってたのであまり出来ませんでしたorz
そんな訳であまり時間かけずにできそうだったLVSの設定をちょこっとだけやってみた位ですが一応ログ残しておきます。

サーバ

今回はLVSを1台とwebを2台さくらのクラウドで用意しました。
その際にスイッチネットワークを1つ作成し、LVSのeth1とwebのeth0をそのネットワークに当てています。

ルーターの設定

今回はグローバルIP勿体無い気がしたのでNATでやってみたのでグローバルIPを持っているLVSからローカルIPしかないwebサーバが外部につながるようにします。
とりあえずシンプルに、iptablesの設定クリアしてから他のネットワーク内のサーバが外部に接続できるようにします。

iptables -F
iptables -t nat -F
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

これでデフォルトゲートウェイをLVSにしたwebサーバでdigとか実行すると結果が返ってきてネットにちゃんと繋がってるのがわかると思います。

今回LVSのローカルIPが192.168.1.11なのでwebサーバのgatewayをLVSに設定します。

/etc/network/interfaces
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.168.1.51
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.11

これでwebサーバがLVSを通してネットに繋がるようになっていると思います。

LVSの設定

LVSにipvsadmを入れて設定します。まず、分散させるIP:portを登録し、分散対象のサーバを追加していきます。
-s rrでラウンドロビンに設定し、-mでNATにしています。なので、この2つのパラメータを変更すれば他の方法で分散することができるようになります。

ipvsadm -A -t {LVS_IP}:80 -s rr
ipvsadm -a -t {LVS_IP}:80 -r 192.168.1.51:80 -m
ipvsadm -a -t {LVS_IP}:80 -r 192.168.1.52:80 -m

ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  133.242.52.61:80 rr
  -> 192.168.1.51:80              Masq    1      1          1
  -> 192.168.1.52:80              Masq    1      2          1

これでブラウザから133.242.52.61にアクセスするとweb1とweb2に振り分けられていることが確認できます。

終わり

今回このくらいしかできなかったので結構テキトーです。
本当はもう1台LVSを用意してLVSが片方落ちても大丈夫にしてみたりとかしたかったのですが……

Windowsでハードリンク使ってみた

WindowsであまりGvimを使ってなかったんだけど最近のcygwinは気軽に入れれたりしたのでWindowsのGvim環境を整えたりした時にmklinkでちょっと嵌ったのでメモ。
mklinkでファイルのリンクを作成する場合に/Hを付けないとシンボリックリンクになるけど、vimrcやgvimrcを編集した時にリンクが切れてしまい普通のファイルになってしまうみたい。
なのでコマンドとしてはこんな感じでWindowsのGvimも快適に使えるようになってgitで管理しやすくなりますよ。

mklink /D .vim .\dotfiles\dot.vim
mklink /H _vimrc .\dotfiles\dot.vimrc
mklink /H _gvimrc .\dotfiles\dot.gvimrc

第1回 クラウドサーバ勉強会に参加してきた

先日suinさんの開催したクラウドサーバ勉強会に参加してきました。
さくらのクラウドでなんかやってみようとかいう事だったので使ってみたいと思っていたfluentdを使ってみたのでメモ兼ねてエントリー。
今回はあまり時間がなかったりして思ってたより進まなかったけど一応動く所までは出来た。
基本fluentdのGitHub見ながらなのであまり難しいことはしてないです。
色々やってから知ったけども開発元からtd-agentという名前で安定版はapt-getとかで入れれるらしい……

Web & DB

とりあえず両方ともで使うのでfluentdが試せる所まで構築する。

Rubyのインストール

Rubyの1.9.2が必要らしいのでrbenv+ruby-buildでインストールする。
まずは必要なパッケージのインストールをする。

sudo aptitude install zlib1g-dev libssl-dev

パッケージのインストールが終わったらRubyのコンパイルとか頑張る。この辺は結構テキトー。

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
mkdir ~/.rbenv/plugins
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

~/.zshenv
  $path .rbenv/bin
~/.zshrc
  eval "$(rbenv init -)"

exec $SHELL
rbenv install 1.9.2-p318
rbenv rehash
rbenv global 1.9.2-p318
rehash

install fluentd

fluentd 自体はgemで簡単に入ります。

gem install fluentd

使ってみる

fluentdにはコンフィグファイルを生成する機能があるので、それを使って動作確認。

fluentd --setup fluent

/ _ / X ls fluent
fluent.conf  plugin/

root権限が必要だけどsuするとパスが通らなくなるのでとりあえずsudoでrootになってから起動する。

sudo -s
fluentd -c fluent/fluent.conf

何やらずらずらっとログが表示されたら違う端末でHTTPリクエストを投げて見る。

curl http://133.242.55.236:8888/debug.curl -F 'json={"name": "suin"}'

正常に動いていると、fluentdがstdoutに受け取ったJSONデータをそのまま出してくれます。

2012-04-01 15:13:55 +0900 debug.curl: {"name":"suin"}

Web

fluentdの動作が確認できたら次はwebサーバのログを見るように設定する

nginxのインストールと設定

今回はwebサーバのログをfluentd経由でMongoDBに突っ込むまでやりたいので、nginxをインストールしてログをstdoutに出す所までやる。 特にnginxに理由はなくて、隣でnginxとApacheの速度比較してたりしたのでなんとなく入れただけ。むしろApacheのがそのままでいけるはずなので楽だと思う。

sudo aptitude install nginx

そのままだとログのフォーマットがApacheと違うため同じフォーマットでログを吐くようにする。

sudo vim /etc/nginx/nginx.conf

+     log_format main '$remote_addr - $remote_user [$time_local] "$request" '
+                     '$status $body_bytes_sent "$http_referer" '
+                     '"$http_user_agent"';

fluentdの設定

nginxの設定が終わったので次はfluentdがnginxのログを見るように設定。所々apacheの文字があるのはfluentdがapacheの吐くログの形式に対応していて、それを使ったりしてるからです。

sudo vim ~/works/fluent/fluent.conf
1
2
3
4
5
6
7
8
9
10
<source>
  type tail
  format apache
  path /var/log/nginx/localhost.access.log
  pos_file /tmp/td-agent/apache.pos
  tag apache.access
</source>
<match apache.access>
  type stdout
</match>

pos_fileとか設定しなきゃいけないみたいなので、何処かのサイトに書いてあったのと同じ場所にした。ただこのままだとディレクトリが存在しないので作成する。

mkdir /tmp/td-agent

これで、ブラウザとかでnginxにアクセスするとfluentdがstdoutにアクセスログを出してくれます。

DB

webサーバの設定が終わったので、次はDBサーバにMongoDBを入れて設定する。

MongoDBのインストール

MongoDBも使ったことなくてよくわからないのでaptで入れただけ。

sudo aptitude install mongodb

MongoDBプラグインのインストール

fluentdのMongoDBプラグインを入れて、nginxのログをMongoDBを入れるよう設定。 起動すると何か言って来たので一応bson_extも入れた。

fluent-gem install fluent-plugin-mongo
gem install bson_ext

とりあえずこれで準備完了。

Web & DB

WebサーバとDBサーバの準備ができたのでnginxのアクセスログをDBサーバに飛ばしてMongoDBに保存する設定を書く。

Web Server’s fluent.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
<match apache.access>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type forward
    retry_limit 50
    <server>
      host 133.242.54.192
    </server>
  </store>
</match>
DB Server’s fluent.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<source>
  type forward
</source>
<match apache.access>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type mongo
    host localhost
    database fluent
    collection accesslog
  </store>
</match>

後はテキトーにwebにアクセスすると、Webサーバのstdoutに出力 –> DBサーバのstdoutに出力 –> MongoDBに保存 とされる。

Octopressのテーマを変更してみた

Octopressのテーマがデフォルトだとつまんないなーとか思ったので変更してみた。
しかし今の所そんなにテーマが豊富じゃないようなのでそんなに選択肢は多くないっぽい。

テーマのインストール

List Of Octopress ThemesにOctopress用のテーマがリストアップされています。 今回は検索してて一番最初に見つけたSlashというテーマを入れてみます。
インストール方法も上記Wikiに書いてある通りコマンドを3つほど実行するだけで簡単にインストールできます。

git clone git://github.com/tommy351/Octopress-Theme-Slash.git .themes/slash
rake install['slash']

テーマ確認

インストールが完了したらプレビューで確認してみましょう。
サーバが立ち上がったあと http://127.0.0.1:4000/ とかで確認できるはずです。

rake preview

テーマ反映

プレビューしてみて良い感じであればそのままgenerateして本番環境に反映させます。

rake gen_deploy

GitHub Pagesで運用している場合暫く待つとGitHubからメールが飛んできてテーマが変わるはず。

vim

Vim をソースからコンパイルする

普段使っているプラギンが7.3以上専用だったりして、基本的にディストリ標準のVimだとまともに動かないので、最近はvimを自分でコンパイルしてる。
こないだインストールした時にも思ったけど、新規でインストールする時に必要なパッケージとか調べるの面倒なのでメモしておく。
UbuntuでインストールしたのでUbuntuになってるのでCentOSとかの場合は適宜置き換えること。
もし今度CentOSでコンパイルすることがあれば追記するかも。

必要なパッケージのインストール

sudo aptitude install mercurial libncurses-dev libx11-dev libxt-dev libgtk2.0-dev

Vimのソースの取得

今後それなりにコンパイルすることになると思うので、VimはMercurialのリポジトリから取得してくる。

hg clone https://vim.googlecode.com/hg/ vim

2回目以降は以下の方法でリポジトリを更新する。

hg pull
hg update

Make

後は普通にコンパイルするだけ。configureのオプションは結構テキトー。とりあえず動いてるからいいかなーとか思ってる。 自分しか使わないし、サーバ上とかで他の人が使ってなにかあったりしたら面倒なのでホームディレクトリ以下にインストールされるようにしてるくらいで後は普通かと。

終わり!

GitHub PagesでOctopress使ってみる

Markdownでメモ書きたかったので以前1回やったOctopressをまたセットアップしてみた。 前やった時のメモとか公式とか見ながら再度セットアップしたのでMarkdownの練習兼ねてメモ。

Github Pages用のリポジトリ作成

GitHubで hamaco.github.com という名前でリポジトリを作成する。

Octopressのダウンロード

ダウンロードというかgitでcloneしてくる。

git clone https://github.com/imathis/octopress.git

bundlerとかいうやつで必要なgemとかインストールして初期処理を行う。

cd octopress
gem install bundler
bundle install
rake install

Octopressの設定

初期設定

下記コマンドを実行するとgithubのリポジトリを聞かれるので最初に作成したGithub PageのリポジトリURLを指定する。

rake setup_github_pages

git@github.com:hamaco/hamaco.github.com.git

その後、下記コマンドを実行してしばらく(10分弱)待つと見れるようになる。

rake generate
rake deploy

Blogの設定

設定ファイルを弄ってタイトルとかをちゃんとしたのにする。

gvim _config.yml

記事の作成

記事を作成するのにはrakeを実行して、内容を書いてやる。

rake new_post\["title name"\]
gvim source/_posts/2012-03-23-title-name.markdown

ソースの管理

なんかプロジェクトページとユーザページを統合しとくと面倒とか書いてあるブログがあったりしたので丁度アカウントも持ってたしBitbucketでソースを管理するようにしてみる。
と言ってもBitbucketでリポジトリを作成してpushしてあげるだけ。
Bitbucketでのリポジトリ作成はGitHubとたいして変わらないので割愛。分からなければ参考サイト見て下さい。

git add .
git commit -m 'commit message'
git push origin source
git remote add bitbucket git@bitbucket.org:hamaco/octopress-github.git
git push -u bitbucket source

参考サイト

First Post

よく覚えてなかったからoctopreessやり直してみた。

markdownってどうやって書くんだっけかな。

<?php
function hello($name)
{
  return "Hello {$name}!!";
}
echo hello("hamaco");

codeblockってのがoctopressにはあるのかな?

1
2
3
4
var hello = function(name) {
  return "Hello " + name + "!!";
}
console.log(hello("hamaco"));