Nginx là gì ? Demo load balancing với nginx

Nginx

1. What is Nginx?

  • Nginx ban đầu được tạo ra như một máy chủ web để giải quyết vấn đề C10k (là một vấn đề liên quan đến vấn đề hiệu suất xử lý 10.000 kết nối cùng lúc), nhưng bây giờ với các tính năng mở rộng Nginx cũng được sử dụng phổ biến như một máy chủ proxy (reverse proxy server), HTTP cache hoặc dùng làm cân bằng tải (load balancer).
  • Nginx được thiết kế khả năng chịu tải đồng thời cao và tốc độ cực nhanh. Nginx cấu hình dễ dàng hơn so với Apache httpd
  • Reverse proxy khi có nhiều web services listen trên nhiều port và cần một single public endpoint để định tuyến lại internal requests (cho phép dùng nhiều domain trên port 80).

2. Nginx architecture.

  • Kiến trúc cơ bản của nginx bao gồm 1 master processcác workers.
    • master process thực hiện các hoạt đông đặc quyền như đọc config và binding đến các port, sau đó tạo ra các processes con (3 loại process con).
    • cache loader process (load cache) chạy khi khởi động để load bộ đệm trên đĩa vào RAM rồi exit. Nó được lên kế hoạch hoạt động, nên nhu cầu resource rất thấp.
    • cache manager process (quản lý cache) chạy định kỳ và chia các mục từ cache trên đĩa để giữ chúng vừa với kích thước được cấu hình.
    • worker processes xử lý network connections, read và write vào đĩa và liên lạc với các upstream server. Mỗi worker process là một single-thread và chạy độc lập với nhau, chúng liên lạc với nhau thông qua bộ nhớ dùng chung cho dữ liệu cache dùng chung, dữ liệu lưu phiên và các tài nguyên dùng chung khác.

Architecture

3. Nginx sử dụng single thread

Traditional server

  • NGINX sử dụng cơ chế asynchronous và event-driven để handle tất cả các connection. Để đạt được điều này nginx hoạt động trên các socket ở chế độ non-blocking và sử dụng một số phương pháp khác như epoll và kqueue. Đây là điểm khác biệt của nginx so với một số server khác, nginx có thể handle đồng thời hàng triệu request và khả năng scale rất tốt.

  • Tuy nhiên vấn đề asynchronous và event-driven vẫn có những problem, nếu nhiều module thứ 3 hoặc chính dev sử dụng blocking thì nginx mất đi thế mạnh vốn có.

4. Giải quyết vấn đề blocking.

to be continue

5. Thử load balancing dùng nginx.

  • Mô tả ngắn:

    • Chạy web app(flask) trên 2 server (demo dùng 2 port).
    • Dùng nginx để load balancing trên 2 server.

    Traditional server

  • Let’s start:

    • Điều chỉnh tường lửa allow cho Nginx HTTP (port 80)
        $ sudo ufw allow 'Nginx HTTP'
    
    • Verify

    Status

    • Demo flask app
        from flask import Flask
        app = Flask(__name__)
    
        @app.route('/index')
        def demo():
            return 'hello world'
    
    • Config nginx (/etc/nginx/nginx.conf)
        upstream demo {
            server 127.0.0.1:8080;
            server 127.0.0.1:8000;
        }
    
        server {
            listen 80;
    
            location / {
                proxy_pass http://demo;
            }
        }
    
    • Reload service nginx.
        $ sudo service nginx reload
    
    • Chạy web app trên port 8080 và 8000 giống như đã config
        $ flask run --port=8080
        $ flask run --port=8000
    

    Run

    • Thuật toán load balancing mặc định của Nginx là Round robin(các máy chủ sẽ được lựa chọn tuần tự, vòng tròn), chúng ta có thể config lại một thuật toán khác nếu muốn.

    • Kết quả.

    Lần đầu request được điều hướng tới server với port 8080 Run

    Lần request tiếp theo được điều hướng đến server port 8000 Run

References