続・Webサーバーの構築

前回、構築したサーバーの記事にリバースプロキシのことを書くのを忘れていたので追記します。

リバースプロキシを構築する

今回はIPアドレスが1本しかないので、WebアクセスをリバースプロキシをつかってドメインでローカルのVMへ振り分けることにしました。それには、nginxを使いました。

aptをつかって nginx を入れると、設定ファイルが /etc/nginx/sites-available/ に設置可能なので、ここに設定ファイルを作ります。今回は次のような設定にしました。

server {
    listen 80;
    server_name dev.nekomimi.sk;

    access_log  /var/log/dev.nekomimi.sk/logs/access.log;

    proxy_set_header  X-Real-IP       $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Host            $http_host;
    proxy_redirect    off;
    proxy_max_temp_file_size          0;

    location / {
        proxy_pass http://dev;
        break;
    }
}

ドメインを判定して、そこへのアクセスログを適当なディレクトリに飛ばしています。

参考:Nginxでリバースプロキシ - taslamの日記
nginx の バーチャルホスト設定 - hogeskyの日記

やってみて

今回は、正直とにかく動かすためにあまり調べずにやりました。nginx はこれまでちゃんと使ったこともなく、どういったことが出来るのかよく分かっていないのでこれからいろいろ調べてちゃんとした設定書きたいです。
そういった感じなので、この記事の内容はそのまま使うことはお勧めしません。こういうことも可能、ということで具体的な方法はよく調べてからお願いします。

Webサーバの構築

今年の頭に用意していた KVM の入ったマシンを使って今回は Web サーバを構築しました。
現状予算的に i-revo の回線1本で構築することになったので、 nginx をつかって、ドメインで VM を切り替えて、サービスを分けることにしました。あとあとIPが必要になってきたらそれだけ分離して IP を割り振る方向で。
また、ルーターも無かったので、 VM ホストに直接フレッツをつないで、 PPPoE セッションを張っています。
今回やって結構、単純なことだけど Linux 触ってないと忘れるなぁと思うことが多かったので、簡単なことでも覚書として書いてます。

ネットワーク構成

とりあえずこんな感じの構成。 VM は増やせるなぁと思いつつ。
f:id:sora_sakaki:20130408192722p:plain

やったこと

モジュールの自動読み込み

まず、マシンを起動したら VM が立ち上がらなかったので、記事を参照したら kvm のモジュールが立ち上がってなかったことに気づきました。触ってないと駄目ですね。なので起動時に立ち上がるようにしました。 Ubuntu の場合 /etc/modules に起動時に自動読み込みするモジュールが一覧になっていたので、 kvm_amd を追加。

参考カーネルモジュールの起動時の自動読み込みについてとOpenRC - 試験運用中なLinux備忘録

PPPoE の設定

前回行わなかった PPPoE の設定を新規で行う必要があったので、やりました。ぱっと設定ファイルの書き方が分からなかったので pppoeconf を使って設定しました。
設定したあと、なぜかデフォルトの route だとデフォルトで br0 に流していたので、 /etc/ppp/ip-up.d/99route-add で ppp0 へ変更しています。

#!/bin/sh
/sbin/route del -net default br0
/sbin/route add -net default ppp0

参考UbuntuでPPPoE接続 - りょうのはてな
Linux(Ubuntu)でルーティングテーブルを変更する。: 麒麟一躍

iptables の設定

このサーバーが外部へのゲートウェイになることになったので、簡単に iptables を設定しました。

Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  192.168.0.0/16       anywhere
ACCEPT     udp  --  192.168.0.0/16       anywhere
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain

ちょっと途中で失敗したのが、外から中に入る DNS をはじめ開くのを忘れていたので、それだけ注意でした。実際はこれにsshを追加であけています。
また、TCP/80 へのアクセスを内部のVMに転送するためと、外へアクセスするために次の設定をしています。

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:192.168.0.6

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  anywhere             anywhere

また、ubuntu では iptables が自動ロードされないので、自分でロードする必要があるので、 /etc/network/if-pre-up.d/iptables_start というスクリプトを用意しました。

参考Man page of IPTABLES
FORWARD と NAT のルール
知らなきゃ損するiptablesのTips(1/3) - @IT

guest をコピーする

guest をコピーしようとしたときにはまったことがありました。

MAC アドレスの変更

MAC アドレスを変更したところ、別のハードウェアとして認識されて、設定が適用されなく(当然だけど)なったので、あたらしいデバイスを eth0 として修正する必要がありました。 /etc/udev/rules.d/70-persistent-net.rules にその対応があったので、これを変更しました。

参考Ubuntuでネットワークカードを変更した時 - DB@WEB

host 名の変更

host 名を変更するのに、 /etc/hostname を変更しました。それに伴って、 /etc/hosts も変更する必要があります。

参考Ubuntu/インストール後の設定 - TOBY SOFT wiki

やってみて

ブリッジデバイス周りの知識が怪しかったのでその辺をちょっと調べるのに時間が若干かかったのと、最近Linux触ってなかったため忘れてることがわりとおおくて変に時間かかりました。br に tap がぶら下がって、その tap につながってパケットのやり取りをする、という構図なんですね。今回は br0 に対して、vm の数 tap を生成しています。
あと、ネットワークはぜんぜんやったことないので iptables でやっとくべき設定とかわからなくて、はじめ ssh のログインのレスポンスがなんかわるいとか(DNSがひけてなかった)で困ってましたが、 @akkiesoft にヒントもらって解決しました。なにかあればアドバイスください。

あの鐘を鳴らすのはお前 in OSC2013 spring

昨日、2/23 に明星大学で開催された OSC2013 spring に参加した。
一般で参加したのだけど、なぜか途中から Open Design Computer Project の店番を手伝っていたので、ブースに訪れた方が多くて非常に嬉しかった。(でも私中の人じゃないから、ここで dis っておくべきなのか?w)

素晴らしいの展示用ディスプレイ

今回の報告で、まずはこれだ。

13.3インチ 液晶モバイルモニター ON-LAP1302

13.3インチ 液晶モバイルモニター ON-LAP1302


OSC に直接関係ない?気のせい(白目)
これは、持ち運び可能なディスプレイで、電源を USB で給電できる。解像度も 1366*768 でこのサイズとしては標準的といえる。そして、なによりも軽い! 865g しかない。出先でディスプレイを使ってデモをする必要があるなら、これを使えばわざわざ電車にディスプレイの大きな箱を持ち込む必要もなく、 MBA といっしょに鞄にいれればOK!
さらに、信号としては VGA、DVI、HDMI とよく使うところであれば大体つかえるので HDMI な RsPI な方々も幸せになれる。というか、 RsPI ブースの人に教えてもらったのだけど。

真の自作コンピュータ

冒頭にも書いたが、私が途中から手伝っていた、友達の @cpu_labs と出していた Open Design Computer Project はすごかった。
このプロジェクトは、彼と、都合私が行った日はいなかった @hktechno が進めている CPU を命令セットから設計し、実際にプロセッサも設計して、さらに gcc 等開発環境も移植して、 OS まで用意しようというプロジェクトだ。つまり、たまにジョークで言われる、よくパソコンを知らない人が思い浮かべるそのままの自作コンピュータを作るプロジェクトといえるだろう。会場では、デモとして、 FPGA ボード上でプレゼンテーションのアプリケーションを展示していた。
彼から話には聞いていたのだが、私も昔は憧れたもので、実物をみるとすごくわくわくした。この歳でこんなことをいうのも少し恥ずかしいが、男のロマンだとおもう。
公式ページにはさまざまな資料が出ているので、興味がある人は一度のぞいてみるといいとおもう。ぜひ、実物を見ることをお勧めする。

printf で NetBSD のカーネルを読む

LT で @masterq_teokure さんが発表されていたのが、スタート低レイヤーだ。スライドはこのURLから見ることができる。聞いた内容は、スライドそのままだが、

  1. UNIXの本を読む
  2. 自作OS
  3. 起動プロセスを調べる

これらの方法でOSを学ぶのは困難な点がある。なので、

  • printfをbacktraceしよう

という方法でコードを読む、というものだ。
私自身、このような困難にはすごく身に覚えがあるので、このようなアプローチでどのようにコードがよめるのか、ぜひ参加したいとおもった。ただ、同日にすでに OS コードリーディングの読書会が被ってしまったため今回は参加できなかったのだが。

あの鐘を鳴らすのはお前

やっぱり LT といえば eject !というわけで、今回も eject の LT があった。今回は、除夜の鐘を鳴らすというもの。具体的には、 Twitter で特定のハッシュタグ付きのツイートをすると、 eject によって鐘が鳴るというもの。実施結果は・・・
スライドは公開されていないので、もし LT が見たい人がいれば、UST の録画の 10:00 付近で見れる。

アセンブリ短歌

@kozossakai さんが LT したのがアセンブラ短歌だ。
アセンブラ短歌とはなにか
5・7・5・7・7の機械語コードでプログラムを書いてみる近未来的文化的趣味
というわけで、機械語で短歌を行うというすごく無茶文化的なネタを持ってきた。しかし、アセンブラ短歌ができるアーキテクチャは 5 種類ほどしかなく、改めて文化的な活動にも使える x86 の凄さがわかる結果になった(謎(なぜなら、奇数Bytesの命令がないため)
これもスライドが見つからなかったので、興味がある人は UST の録画 で見てほしい。

参加して

今回、1年ぶりくらいの OSC への参加だったが、やはり、 OSC は楽しかった!展示でも懇親会でもいろいろな方に多くの面白い話をしていただいたので本当に良かった。 OpenStreetMap の話とかケン・トンプソンの話とかほかいろいろ。ただ、実は 4 階の存在に気付かなくて、オープンハードカンファレンスに行けなかったのが心残りに・・・


P.S.タイトルにつかったのにあっきぃさんのネタをあまり書いてなくてすみません