NGINXでロードバランサを試す。

docker-composeでnginxでロードバランサを試した。 nginxの後ろに、3台のexpressのサーバに振り分けるようなものを試してみた。

version: '3'
services:
  lb:
    image: nginx:latest
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
    depends_on:
      - express1
      - express2
      - express3
  express1:
    build:
      context: ./express
    ports:
      - "3000:3000"
  express2:
    build:
      context: ./express
  express3:
    build:
      context: ./express

nginx.confはこんな感じ。

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile on;
    #tcp_nopush on;
    keepalive_timeout 65;
    server_tokens off;

    #gzip  on;
    #gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/grpc application/octet-stream;

    upstream backend {
        server express1:3000;
        server express2:3000;
        server express3:3000;
    }

    server {
        listen 80 default_server;
        server_name 127.0.0.1;

        location / {
            proxy_pass http://backend;
        }
    }
}

nginx.confの設定を見ていく。

まず、ここでバックエンドの3台に振り分ける設定は以下で書いている。

    upstream backend {
        server express1:3000;
        server express2:3000;
        server express3:3000;
    }

次に、ここでロードバランサを有効にするパスを設定している。今回はルートにしている。

        location / {
            proxy_pass http://backend;
        }

立ち上げて、ブラウザでアクセスしてみると、こんな感じでアクセスが振り分けられた。

express1_1  | GET / 304 30.441 ms - -
express2_1  | GET /stylesheets/style.css 304 2.718 ms - -
express3_1  | GET / 304 31.145 ms - -
express1_1  | GET /stylesheets/style.css 304 0.943 ms - -

とりあえずここまで。