KLab若手エンジニアの これなぁに?

KLab株式会社の若手エンジニアによる技術ブログです。phpやRubyなどの汎用LLやJavaScript/actionScript等のクライアントサイドの内容、MySQL等のデータベース、その他フレームワークまで幅広く面白い情報を発信します。

Infra

とある遠隔勤務者の冒険記録#1 ~Linuxルータ作るよっていうかD510おいしいです~

はじめまして、インなんとかさんです。いやうそです。ごめんなさいよく知らないんですそのアニメ。 私たちKLabには、六本木本社や大阪、福岡の各事業所以外に、遠隔地から参加して勤務している社員が何名かおりまして、私はそのうちの一人です。普段の業務はメールはもちろんJabberやIRCやSkype、WikiやTracなど様々なツールを用いて連絡を取り合いつつ、通常勤務の人たちと変わらず日々はたらいております。 さてそんな折、自宅のネットワーク環境はやっぱりまあある程度充実させておきたいなと思うわけです。ましてやネットワークやLinuxをいじって飯食ってる手前、ただ漫然と○○バシカメラで買ってきたブロードバンドルータをつなげてわーいらくちんだなあえへへーとか言ってるんじゃいかんと思ったわけです。どうやってISPとつなげてどうやってパケットがルータを通って、とか見てみたいじゃないですか。 というわけでやってみました。Linuxマシンでルータづくり。 まず機材選定というか、PCを組まなければいけないわけですが最初から狙いはAtomで組もうと定めてました。mini ITXなら静音で小型のやつが組めるだろうなと。でどうせルータ用途に専念させるなら拡張性は無視でいいし、ディスク容量もほとんど要らないので取捨選択もしやすかったです。 http://www.intel.co.jp/products/desktop/motherboards/D510MO/D510MO-overview.htm Intel® Desktop Board D510MO - Overview 私が選んだのはScythe製BM639。縦置き可能なほうが都合よかったので選びました。 http://www.scythe.co.jp/case/bm639.html 株式会社サイズ | 商品詳細 |BM639 メモリやHDDはそこそこに、あとせっかくルータなのでNICを1枚買ってきてONUと直結用にしました。 http://buffalo.jp/products/catalog/item/l/lgy-pci-gt/ LANアダプタ|LGY-PCI-GT そして組み立ては無難に完了。LinuxのインストールはUSBメモリを使いました。 http://www.jp.debian.org/releases/lenny/i386/ch04s03.html.ja#usb-copy-flexible 4.3.2. ファイルのコピー — 柔軟な方法 [www.jp.debian.org] USBメモリを使ってインストールイメージを作成するのには、上記URLの方法を参考にしました。設定項目を入力していけばほとんど詰まることなくいけましたよ。 あとは設定ですね。まずはsysctl周り。
net.ipv4.ip_forward = 1
これがないとはじまりません。 続いてiptablesなんですが、最近のDebianでは/etc/network/if-pre-up.d/以下に配置するべきと聞きまして、下のようなスクリプトを用意しました。
#!/bin/sh

IPTABLES='/sbin/iptables'

LOCAL_IF=eth0
LOCALNET='x.x.x.x/yy'

##########
# initialize

$IPTABLES -F
$IPTABLES -X
$IPTABLES -Z

$IPTABLES -t nat -F POSTROUTING

$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT ACCEPT

##########

$IPTABLES -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
$IPTABLES -A INPUT -j ACCEPT -i lo
$IPTABLES -A INPUT -j ACCEPT -s $LOCALNET
$IPTABLES -A INPUT -j ACCEPT -p tcp --dport 1723
$IPTABLES -A INPUT -j ACCEPT -p 47

$IPTABLES -A FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED

##########

$IPTABLES -N outer_local

##########

$IPTABLES -N local_outer
$IPTABLES -A local_outer -j ACCEPT -s $LOCALNET

##########
# nat

$IPTABLES -t nat -A POSTROUTING -j MASQUERADE -s $LOCALNET -o ! $LOCAL_IF

##########
# main table

$IPTABLES -A FORWARD -j outer_local -i ! $LOCAL_IF -o $LOCAL_IF
$IPTABLES -A FORWARD -j local_outer -i $LOCAL_IF

$IPTABLES -A INPUT -j outer_local -i ! $LOCAL_IF
さて最後にPPPoEの設定、こちらはマルチセッションでつないでいるので、以下のようなファイルを二つ、それぞれ/etc/ppp/peers/配下に置きました。
# /etc/ppp/peers/ISP_A
noipdefault
defaultroute
hide-password
lcp-echo-interval 20
lcp-echo-failure 3
connect /bin/true
noauth
persist
mtu 1492
noaccomp
default-asyncmap
plugin rp-pppoe.so eth1
user "aaa@bbb"
usepeerdns
# /etc/ppp/peers/ISP_B
noipdefault
nodefaultroute
noproxyarp
hide-password
lcp-echo-interval 20
lcp-echo-failure 3
connect /bin/true
noauth
persist
mtu 1492
noaccomp
default-asyncmap
plugin rp-pppoe.so eth1
user "xxx@yyy"
パスワードファイルが必要なので、/etc/ppp/{chap-secrets,pap-secrets}に次の内容で配置します。
"aaa@bbb" * "ccc"
"xxx@yyy" * "zzz"
最後に、自動接続させるために/etc/network/interfacesに下記を追加。
auto eth1
iface eth1 inet static

auto ppp0
iface ppp0 inet ppp
  pre-up /sbin/ifconfig eth1 up
  provider ISP_A

auto ppp1
iface ppp1 inet ppp
  pre-up /sbin/ifconfig eth1 up
  provider ISP_B
最後に、マルチセッションの使い分けのためのルーティング設定を追加しました。ISP_Bの方の接続は固定IPアドレスになっていて、本社との間のsshやVPN接続を行う際の認証にこのIPアドレスでのフィルタリングも行っているためです。
#!/bin/sh

if [ "x$PPP_IFACE" = "xppp1" ]; then
  ip route add a.a.a.a dev $PPP_IFACE
  ip route add b.b.b.b dev $PPP_IFACE
fi
以上の設定で無事Linuxルータが稼働しました。でも、これはまだまだ最初の一歩にすぎません。せっかく市販のブロードバンドルータからLinuxに入れ替えたからには、中をいろいろといじりやすい環境になったわけですからまだまだいろいろと試してみたいじゃないですか。次回以降、これにさらに手を加えて自分なりにあそんでみたいと思います。

若手ブログ(WordPress)のインフラ構成

はじめまして kihira-h です。 普段は、サーバ管理やネットワーク構築などインフラ関係の仕事をしています。 今回は、この「KLab若手エンジニアの これなぁに?」、通称 “若手ブログ” のインフラ構成をご紹介します。 弊社には DSAS と呼ばれる分散冗長構成のインフラ技術がありますが、この「若手ブログ」も DSAS 程ではありませんが分散環境の上でサービスされています。

インフラ構成

まず、「若手ブログ」インフラの構成要素には
  • リアルサーバ
  • ロードバランサ
  • マスタサーバ
の3つがあります。 「リアルサーバ」が、皆さんからのアクセスを受け付けている Web サーバです。 現在のところ2台のサーバが稼働しています。 次の「ロードバランサ」が、下図のように配下のリアルサーバに対してアクセスを振り分けています。

このロードバランサには、リアルサーバの死活確認を行う仕組みがあり、万一リアルサーバの一部がダウンしても自動的にそのサーバは分散対象から外れます。

最後に、「マスタサーバ」を紹介します。このサーバがある意味この分散環境のポイントでもあります。 先ほど、リアルサーバが Web サーバだと説明しましたが、このマスタサーバも Web サーバです。リアルサーバ2台に加えて、このマスタサーバでも Apache が稼働していて WordPress が動いています。

記事の書き方

それでは、この若手ブログでどのように記事を投稿していくのかをご紹介します。 私たちは、マスタサーバ上で動いている WordPress の管理ページにアクセスして、記事を書き込みます。WordPress のデータは MySQL 上に乗っているので、記事本体はリアルサーバ上でも即座に反映されます。 では画像などの素材のアップロードは、どのようになっているのでしょうか? 実は、マスタサーバ上にアップロードした素材を、スクリプト等を駆使してリアルサーバに同期しているのです。

上図の通り、素材のアップロードは、大きく分けて「マスタサーバへのアップロード」と「各リアルサーバへの同期」の2つの手順で行われます。それぞれどのように行われているか詳しくご説明します。

  1. 関連ファイルのリポジトリ管理 若手ブログにアップロードされている画像などのコンテンツや、WordPress のテーマ、さらには WordPress 本体も含めて関連するファイルは全て git リポジトリ上で管理されています。アップロードしたいファイルを追加してコミット、その後社内のサーバ上のリポジトリにプッシュすることでメンバー間のファイル共有を行っています。
  2. マスタサーバへのアップロード 素材のサーバへのアップロードには rsync を使っていますが、毎回コマンドラインを組み立てるのは面倒なので Makefile を作って使用しています。
    $ make install-young
    のように実行すると、マスタサーバ上のコンテンツがローカル上のファイルに同期するように rsync が実行されます。
  3. アップロード内容のチェック 3.で行ったアップロードはマスタサーバのみに対して行われるため、外には公開されないマスタサーバ上で内容のチェックができます。例えば、テーマの変更や一部の編集などを行った場合でも、公開系に影響を与えずに確認ができるということです。
  4. 各リアルサーバへの同期 マスタサーバからリアルサーバへの素材の展開も、マスタサーバへのアップロード時と同じく Makefile にターゲットが仕込んであります。
    $ make mirror-young
    のように実行すると、マスタサーバ上で各リアルサーバへの rsync が実行されてファイルが同期します。

インフラ構成のポイント

この「若手ブログ」のインフラのポイントは、分散リポジトリ( git )と Makefile による省力化です。 ソースコードだけでなく素材などもまとめてリポジトリ上で管理してしまうことで、アップロード済みデータの管理を簡単にできるほか、コミットのログから誰がどんな変更を行ったかが追跡できるほか、トラブルが発生しても簡単に1つ前のリビジョンに戻すことができます。 また、アップロードに必要なコマンドも引数を含め全て Makefile に書いてしまうことで、扱いやすくミスの少ない作業ができます。 皆さんも身近なファイル管理などを、リポジトリ管理 &Makefile で自動化してみてはどうでしょうか?
 KLab若手エンジニアブログのフッター