Skip to main content

Command Palette

Search for a command to run...

Docker-compose + Nginx as Load Balancer

Updated
1 min read

前言

之前測過 Nginx 當 Load Balancer 在某些條件下分配是否均勻,由於並沒有要測試效能,所以直接在本機寫了個 docker-compose 。以下紀錄設定檔案大概怎麼寫。

目標

用一個 docker-compose 和一些 Dockerfile ,組成一個這樣的架構

實作

所以,會需要兩種容器

  • Nginx 和 lb.conf

  • server_i 的 Dockerfile

server_i

這部分我們直接使用 SimpleHTTPServer 作為示範,並沒有用其他統計機制。

事實上這裏可以用更快(例如 go server 、 green event … )的 server 端來取代,以做出有效率的測試。

FROM python:3.8
CMD python3 -m SimpleHTTPServer
EXPOSE 8080

Nginx

config file

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    upstream backend {
        server server1:8080;
        server server2:8080;
        server server3:8080;
    }

    server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass <http://backend>;
        }
    }
}

docker-compose

version: '3'
services:
  lb:
    image: nginx
    volumes:
      - ./lb/server.conf:/etc/nginx/nginx.conf
    ports:
      - 8080:80
    depends_on:
      - server1
      - server2
      - server3

  server1:
    build: server/

  server2:
    build: server/

  server3:
    build: server/

測試

這裏並沒有把測試 Script 擺上,不過細節說一下,為了可以測的更快速,建議在 Server 端和 Client 端都使用有 async 機制的方式。例如: Python 使用 green event + grequest。

然後用 Logger 紀錄打到的 Request ,打完再做統計。

More from this blog

簡介 C++ 的 Type Erase (用多型和模板做 Duck Type)

起點 讓我們先從 template 出發:foo 需要一個 callback function。 template<typename Func> void foo(Func callback) { // ... callback(); } 但是這會讓編譯錯誤訊息有點模糊:假如 callback 並不是一個可以呼叫的函數指標,或者並不是一個 callable object ,那編譯器會說錯出在第四行。但是我們都希望,編譯器在呼叫函數時就幫我們指出:這不是 foo 想要的 call...

May 14, 20243 min read

帕秋莉的魔法筆記

45 posts

後端工程師。

不定時張貼一些寫扣時的筆記。