09 Oct 2014, 23:05

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

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

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

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

  • 第1回 サーバ複数台構成、Nginxでリバースプロキシ構築
  • 第2回 HAProxyでロードバランサ構築
  • 第3回 SoftEtherを使ってVPN構築
  • 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 [email protected]  # web1への接続
    $ ssh [email protected]  # 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 
    

    まとめ

    はじめてのリバースプロキシをサーバ仮想化を使って体験してみました。IPアドレスなどを意識しながら行うと非常に勉強になります。ちなみに、この数年後に下記のNginxの仕組みの記事を書いていますので、こちらもご覧ください。

    関連する記事はこちら
  • Docker上でMySQLを利用する際のセットアップについて (2018/04/21)
  • [随時更新] ElasticSearchの基本APIのまとめ (2018/01/14)
  • ElasticSearch入門 インストールから検索、そしてKibanaまで (2017/08/13)
  • クラウド上でのWordPressのスケールアウトを考える (2017/01/04)
  • Nginxの仕組みについて入門 (2016/06/04)
  • comments powered by Disqus
    このエントリーをはてなブックマークに追加