読者です 読者をやめる 読者になる 読者になる

Goldstine研究所

mosuke5's tech blog

ブログ移転しました。5秒後にリダイレクトします。

【VPS1台でインフラ勉強】サーバ複数台構成、Nginxでリバースプロキシ構築

ロードバランシングとかクラスタリングとかリバースプロキシとか、
業務でも使っているし、概念とかはわかってるけど、自分で構築したことはやっぱりない。

自分で構築してみたいなーと思いつつもあたりまえだけど、サーバやネットワーク機器をそう簡単に調達もできない。
お金も当然ない。

というわけで、さくらVPSで仮想化つかってロードバランシングとかクラスタリングとかリバースプロキシとか勉強しましょうという「サーバインフラ会」を友人と始めた。
その第1回目のメモ。

第1回 サーバ複数台構成、Nginxでリバースプロキシ構築
第2回 HAProxyでロードバランサ構築

1. 使用した環境

まず今回利用した環境は以下のとおり。
さくらVPSの1GBのプラン。
・メモリ:1GB
・CPU:仮想2コア
・HDD:100GB
・OS:CentOS7
・仮想化:Vagrant
 →dockerなどもはじめ検討していたが、コンテナ型仮想化だとサーバ感がでないので、よりサーバとして意識できるVagrantを採用

【参考】
料金・サービス仕様 | VPS(仮想専用サーバ)は「さくらのVPS」

2. 完成イメージ・物理イメージ

f:id:mosuke5:20140930210924p:plain

f:id:mosuke5:20140930210914p:plain

3. VagrantでWebサーバ2台分を構築する

Vagrantの詳細な利用方法は公式ドキュメントをみてもらうとするが、セットアップまでのひととおりの流れと注意点のみ記載する。
Vagrant Documentation

今回はWebサーバ2台を仮想で実現するので、それぞれweb1, web2とする。
それぞれのディレクトリを作成。

## web1, web2のディレクトリ作成
$ pwd
/home/vagrant
$ mkdir web1
$ mkdir web2

## 仮想化で利用するOSイメージをダウンロード
$ vagrant box add ubuntu1310 ¥
http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_ubuntu-13.10_chef-provisionerless.box

## web1サーバ構築
$ cd web1
$ vagrant init ubuntu1310

## ほぼほぼデフォルトの設定だが以下2つだけは設定を行った。
$ vim Vagrantfile
# (1)プライベートアドレスの割り当て。
config.vm.network "private_network", ip: "192.168.33.10"

# (2)1GBしかメモリがないのでこの設定をしないと2つ仮想化するとだいぶ大変なことになりました。
config.vm.provider "virtualbox" do |vb|
     vb.customize ["modifyvm", :id, "--memory", "128"]
end

$ vagrant ssh

同様にweb2においても同じことを行った。

また、vagrantでは一般的に対象のディレクトリでvagrant sshを利用してサーバに入るが、
今回はプライベートアドレスも振ってあるし、物理サーバとしてイメージしているので以下のようにしてサーバにはいるようにした。

$ ssh vagrant@192.168.33.10  # web1への接続
$ ssh vagrant@192.168.33.11  # web2への接続

ホストサーバ側のインターフェイス情報をみると。

# cent7なので以下コマンドだがifconfig -aのこと
$ ip a 
(中略)
5: vboxnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.1/24 brd 192.168.33.255 scope global vboxnet0
       valid_lft forever preferred_lft forever
    inet 192.168.56.101/24 brd 192.168.56.255 scope global dynamic vboxnet0
       valid_lft 839sec preferred_lft 839sec
    inet6 fe80::800:27ff:fe00:0/64 scope link
       valid_lft forever preferred_lft forever

vboxnet0という仮想のインターフェイスが作成され、IPアドレスも192.168.33.1が振られていることを確認。

ルーティングテーブルも確認しておくと

$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         153.120.2.1     0.0.0.0         UG        0 0          0 eth0
153.120.2.0     0.0.0.0         255.255.254.0   U         0 0          0 eth0
192.168.33.0    0.0.0.0         255.255.255.0   U         0 0          0 vboxnet0

192.168.33.0/24行はvboxnet0から出るように設定されている。

上の物理イメージに詳細書き込むと以下。
f:id:mosuke5:20141006000246p:plain

Apacheのみインスールする必要があるので、
web1, web2で以下を実施。(プロビジョニングしたほうが後々楽です。)

$ sudo apt-get apache2

##どちらがweb1でどちらがweb2か区別するために以下ファイルは変えておきます。
$ sudo vim /var/www/index.html
#Web1とかWeb2とかわかりやすい文言を入れておきます。

##Apache起動
$ sudo service apache2 start

##Apache起動確認
$ curl localhost
 上記で変更したindex.htmlの内容が表示されること 

これでWebサーバの準備は完了。

4, Nginxでリバースプロキシサーバを構築する

Nginx初めて触ったがとてもシンプル。
今回はNginxをリバースプロキシとして利用したので、proxy.confを作成するだけ。

##インスール
$ sudo yum install nginx

## /etc/nginx以下に設定ファイルなどあること確認
$ ls /etc/nginx

## プロキシ構築のための設定ファイル作成
$ cd /etc/nginx/conf.d
$ sudo vim proxy.conf
server {

    # /web1にアクセスが来た時
    location /web1 {

	proxy_http_version 1.1;

	#受け渡す際のヘッダ情報を指定
	proxy_set_header Host $host:$server_port;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded_Proto http;

        # 飛ばす先のURL(Web1サーバ)
        proxy_pass http://192.168.33.10/;
    }

    # /web2にアクセスが来た時
    location /web2 {

	proxy_http_version 1.1;

	#受け渡す際のヘッダ情報を指定
	proxy_set_header Host $host:$server_port;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded_Proto http;

        # 飛ばす先のURL(Web2サーバ)
	proxy_pass http://192.168.33.11/;
    }
}

## あとは起動させるのみ
$ sudo systemctl enable nginx
$ sudo systemctl start nginx