LoginSignup
19
22

More than 3 years have passed since last update.

dockerとnginxでロードバランシング

Last updated at Posted at 2018-07-21

はじめに

ネットワークの勉強するのに実機買ったりクラウドサービス使うのはお財布に優しくないのでとりあえずdockerで色々試していきたいと思います。今回は手始めにサーバー二つ建ててnginxでロードバランシングします。

前提条件

dockerがインストールされていること
macユーザーであること(この記事はmac環境で作業するので)

構成図

想定としてインターネットからLBめがけて降ってきたアクセスをclosedなネットワークにおいてあるサーバー2台に着弾させてあげる感じです。(ほんとはLBの前にFWとかあると良いんですけどそれはまた別の記事でやります...)
スクリーンショット 2018-07-21 18.03.01.png

こんな感じの構成で作っていきます。

dockernetworkの作成

dockerでは仮想networkを作成することができます。今回は以下のコマンドでfrontとbackの二つのネットワークを作成し、LBをfrontとbackにつなぎbackにwebサーバーを2台置きます。

docker network create --subnet=192.168.3.0/24 network_LB_front
docker network create --subnet=192.168.4.0/24 network_LB_back

lbの作成

前述の通りlbにはnginxを使います。普通ならvm建ててnginx突っ込んでみたいなめんどくさいことをしなきゃいけませんが、dockerなら最初からnginx入りのコンテナが用意されてます。素敵ですね。
すでにimageを持っている方も多いとは思いますが、持っていない方は下の公式urlの方見てpullしておいてください。
https://hub.docker.com/_/nginx/


lbという名前のvmをホストpcの8080ポートのポートフォワーディングさせてrunしてます。ホスト側のポートは適宜好きなポートにしてください。

docker run -it --name lb -p 8080:80 --net=network_LB_front --ip=192.168.3.101 -d  nginx

続いてbackセグとの接続を行います。下記のコマンドでbackセグと接続してください。

docker network connect --ip 192.168.4.101 network_LB_back lb

ここでwebブラウザを使ってlocalhost:8080にアクセスし、下のようなページに遷移すれば正常です。

スクリーンショット 2018-07-21 18.21.03.png

webserverの作成

アクセスの振り先であるwebserverを建てます。
一応切り戻して確認できるようにポートフォワーディングしていますが、なくても大丈夫といえば大丈夫です。

docker run -it --name l_server1 -p 8085:80 --net=network_LB_back --ip=192.168.4.102 -d  nginx
docker run -it --name l_server2 -p 8086:80 --net=network_LB_back --ip=192.168.4.103 -d  nginx

LBの設定

コンテナへログイン

下記コマンドでログインします

docker exec -it lb bash

vimのインストール

まずnginx公式から落としてきたimageにはvimが入っていないので設定ファイルの編集ができません。なのでapt-getしましょう。
また、curl等々したりしたくなることもあると思いますがそれらもないので適宜入れてください。pingに関してはpingそのものがないので代わりに iputils-ping入れてあげると良いですb

apt-get update
apt-get install vim

nginx.confの設定

ここからやっと本番の設定です。/etc/nginx/nginx.confを編集していきます。+部分が追記場所で-が削除箇所です。やっていることはupstream proxy.comというスコープでアクセスの振り先を複数列挙し、locationの中でまとめて指定しています。
そして、conf.d配下の*.confを読み込んでいますが、ここに書かれている処理(初期状態だとdefault.conf)と競合するのでその行を消しています。

 user  nginx;
中略

http {
    中略
    #gzip  on;
    +upstream proxy.com{
    +   server 192.168.4.102;
    +   server 192.168.4.103;
    +}
    server {
        listen 80;

     +   location / {
     +      proxy_pass http://proxy.com;
     +  }
    }
    -  include /etc/nginx/conf.d/*.conf;
}

nginx の再起動

下記のコマンドで再起動をかけます。

nginx -s reload

処理の可視化

これで実装そのものは完了で、LBに着弾したアクセスがbackのネットワークにあるserver1,2に振り分けられるようになっています。ですが表示されるのはロードバランシング前と同じWelcome to nginx!これではあまりに味気ないので、server1、2のhtmlファイルを書き換えて見ましょう。

まずserver1へログイン
docker exec -it l_server1 bash

vimがないのでvimをインスコ

apt-get update
apt-get install vim

htmlのある場所へ移動してvimで開く

cd /usr/share/nginx/html
vim index.html

あとはwellcome to nginx をwellcome to server1とかにしてあげれば...
スクリーンショット 2018-07-21 18.53.25.png

19
22
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
22