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

09 Oct 2014, 23:05 By mosuke5

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

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

というわけで、さくら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

    <p>同様にweb2においても同じことを行った。</p>
    <p>また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/vagrant">vagrant</a>では一般的に対象のディレクトリで<a class="keyword" href="http://d.hatena.ne.jp/keyword/vagrant">vagrant</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/ssh">ssh</a>を利用してサーバに入るが、<br>
    今回はプライベートアドレスも振ってあるし、物理サーバとしてイメージしているので以下のようにしてサーバにはいるようにした。</p>
    
    

    $ ssh [email protected] # web1への接続 $ ssh [email protected] # web2への接続

    
    <p>ホストサーバ側の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A1%BC%A5%D5%A5%A7%A5%A4%A5%B9">インターフェイス</a>情報をみると。</p>
    
    

    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

    
    <p>vboxnet0という仮想の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A1%BC%A5%D5%A5%A7%A5%A4%A5%B9">インターフェイス</a>が作成され、<a class="keyword" href="http://d.hatena.ne.jp/keyword/IP%A5%A2%A5%C9%A5%EC%A5%B9">IPアドレス</a>も192.168.33.1が振られていることを確認。</p>
    <p>ルーティングテーブルも確認しておくと</p>
    
    

    $ 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

    <p>192.168.33.0/24行はvboxnet0から出るように設定されている。</p>
    <p>上の物理イメージに詳細書き込むと以下。<br>
    <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/mosuke5/20141006/20141006000246.png" alt="f:id:mosuke5:20141006000246p:plain" title="f:id:mosuke5:20141006000246p:plain" class="hatena-fotolife" itemprop="image"></span></p>
    <p></p>
    <div style="border: solid 1px #dddddd;"></div>
    <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Apache">Apache</a>のみインスールする必要があるので、<br>
    web1, web2で以下を実施。(プロビジョニングしたほうが後々楽です。)</p>
    
    

    $ sudo apt-get apache2

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

    ##Apache起動 $ sudo service apache2 start

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

    <p>これでWebサーバの準備は完了。</p>
    
    </div>
    <div class="section">
        <h2>4, Nginxでリバースプロキシサーバを構築する</h2>
        <p>Nginx初めて触ったがとてもシンプル。<br>
    今回はNginxをリバースプロキシとして利用したので、proxy.confを作成するだけ。</p>
    

    ##インスール $ 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

    </div>
    <div class="section">
        <h2>まとめ</h2>
        <p>はじめてのリバースプロキシをサーバ仮想化を使って体験してみました。IPアドレスなどを意識しながら行うと非常に勉強になります。ちなみに、この数年後に下記のNginxの仕組みの記事を書いていますので、こちらもご覧ください。</p>
        <div class="iframely-embed"><div class="iframely-responsive" style="height: 140px; padding-bottom: 0;"><a href="https://blog.mosuke.tech/entry/2016/06/04/180122/" data-iframely-url="//cdn.iframe.ly/nheb2qe"></a></div></div><script async src="//cdn.iframe.ly/embed.js" charset="utf-8"></script>
    </div>
    </body>
    
    フィードバック・相談(β)

    本記事に対して、執筆者にフィードバックや聞きたいことがあればこちらのフォームからご記入ください。執筆者に問い合わせてみる

    このエントリーをはてなブックマークに追加
    comments powered by Disqus