Skip to content

Instantly share code, notes, and snippets.

@vanduc95
Created October 1, 2017 08:38
Show Gist options
  • Save vanduc95/f996464b1ecde798262b64460eefa956 to your computer and use it in GitHub Desktop.
Save vanduc95/f996464b1ecde798262b64460eefa956 to your computer and use it in GitHub Desktop.

Giới thiệu về Nginx

Bài viết giới thiệu tổng quan về Nginx và cách thiết lập cân bằng tải trong hệ thống máy chủ sử dụng Nginx. Trước khi đi vào tìm hiểu vẫn đề này, chúng ta sẽ nói qua chút về Proxy.

1. Proxy là gì?

Proxy là một Internet server làm nhiệm vụ chuyển tiếp thông tin và kiểm soát tạo sự an toàn cho việc truy cập Internet của các máy khách. Có 2 loại Proxy là Forward proxyReverse proxy.

1.1 Forward proxy

Là khái niệm miêu tả sự kiện proxy nhận dữ liệu từ server và gửi cho client thay vì client nhận dữ liệu trực tiếp từ server. Nếu không chỉ rõ thì khi nói đến proxy có thể hiểu là forward proxy.

Cụ thể, ta có 3 máy tính kết nối tới internet.

  • X: đóng vai trò client
  • Y: đóng vai trò proxy
  • Z: website bạn muốn truy cập, ví dụ ww.google.com

Thông thường, người dùng muốn kết nối trực tiếp từ X → Z. Tuy nhiên, trong trường hợp này Y sẽ kết nối tới Z thay vì X và có luồng như sau: X → Y → Z. Fordward proxy sẽ ẩn đi thông tin của client X.

Lí do tại sao X muốn dùng Forward proxy server?

  • Admin chặn truy cập tới site Z từ X. Ví dụ các nhân viên trong công ty bị quản lí chặn truy cập tới facebook.com trong giờ làm việc...
  • Admin của website Z chặn truy cập từ X. Ví dụ admin nhận thấy X đang cố truy cập trái phép tới Z, khi đó admin sẽ block địa chỉ IP của X ...

1.2 Reverse proxy

Lấy ví dụ sau: có 3 máy tính kết nối internet

  • X: đóng vai trò client
  • Y: đóng vai trò proxy
  • Z: website bạn muốn truy cập, ví dụ ww.google.com

Thông thường người dùng muốn truy cập từ X → Z. Tuy nhiên, trong trường hợp này, admin của Z không muốn người dùng truy cập trực tiếp tới Z và bắt người dùng phải đi qua proxy Y . Y sẽ nhận dữ liệu từ Z và trả lời lại cho X.

Vậy sự khác nhau giữa forward proxy và reverse proxy là gì? Đó là trong reverse proxy, người dùng X không biết họ đang truy cập tới Z mà chỉ biết họ đang giao tiếp với Y. Còn trong forward proxy, X biết chính xác địa chỉ của Z, tuy nhiên Z sẽ không biết được rằng X đang truy cập tới mình. Hay nói tóm lại, forward proxy ẩn đi thông tin của client còn reverse proxy ẩn đi thông tin của server.

Lí do tại sao Z muốn thiết lập một reverse proxy

  • Admin của Z muốn tất cả các lưu lượng truy cập vào trang web Z phải đi qua Y trước. Ví dụ Z là một website lớn với hàng triệu lượt truy cập, do vậy một single webserver không thể xử lí tất cả các request. Do vậy Z phải là nhiều server và có đặt một reverse proxy lắng nghe các yêu cầu của người dùng và gửi yêu cầu đến server X gần nhât giúp cân bằng tải.

  • Admin của Z không muốn để lộ trực tiếp địa chỉ IP của Z công khai.

    a

2. NGINX

2.1 Tổng quan về Nginx

  • Nginx ( phát âm là ‘engine x’ ) là một web server tập trung mạnh mẽ vào khả năng xử lí đồng thời cao, hiệu suất và sử lí ít bộ nhớ. Nó cũng có thể hoạt động như một reverse proxy server cho các giao thức HTTP, HTTPS, SMTP, POP3 và IMAP cũng như cân bằng tải (load)))) balancer) và HTTP cache.
  • Được tạo bởi Igor Sysoev năm 2002, Nginx chạy trên Unix, Linux, các biến thể BSD, Mac OS X, AIX, HP-UX và Microsoft window.
  • Không giống như các chương trình máy chủ khác, Nginx không dựa vào luồng (threads) để xử lý các truy vấn (request). Thay vào đó, Nginx sử dụng kiến trúc hướng sự kiện (event-driven) không đồng bộ (asyschronous) và có khả năng mở rộng. Vì vậy Nginx có hiệu suất cao và yêu cầu bộ nhớ thấp hơn Apache.

2.2 Thiết lập cân bằng tải (load balancer) trong hệ thống máy chủ Nginx.

Nignx có một số tính năng như có khả năng xử lí hơn 10.000 kết nối cùng một lúc với bộ nhớ thấp, tăng tốc reverse proxy bằng bộ nhớ đệm (cache), cân bằng tải đơn giản và khả năng chịu lỗi. Trong bài viết này, chúng ta chỉ tìm hiểu cách thiết lập cân bằng tải sử dụng Nginx .

Cân bằng tải là kĩ thuật thường được sử dụng để tối ưu hóa việc sử dụng tài nguyên, băng thông, giảm độ trễ và tăng cường khả năng chịu lỗi. Khi chúng ta có nhiều hơn một web server, cùng với đó là sự gia tăng lưu lượng truy cập thì việc bổ sung thêm máy chủ để phân phối lưu lượng này một cách hợp lí là cần thiết.

Trong bài viết này, chúng ta sẽ sử dụng 3 server:

  • Master: cài Nginx đóng vai trò Load balancer - IP: 192.168.20.51
  • Backend1: webserver 1, cài Apache - IP: 192.168.20.120
  • Backend2: webserver 2, cài Apache - IP : 192.168.20.130

2.2.1 Cấu hình chi tiết

  • Trên các node backend:

    • Cài đặt và khởi động apache

      # yum install httpd httpd-devel
      # systemctl start httpd
      
    • Truy cập thư mục /var/www/html và tạo file index.html với nội dung như sau:

      <h1>WEB1 (2)</h1>
      
  • Trên node master:

    • Thêm repo, cài đặt nginx và khởi động nginx

      # yum install epel-release
      # yum  install nginx
      # systemctl start nginx
      
    • Khởi động firewall-cmd :

      # systemctl start firewalld
      # systemctl enable firewalld
      
    • Cấu hình firewalld và restart lại dịch vụ:

      # firewall-cmd --permanent --zone=public --add-service=http 
      # firewall-cmd --permanent --zone=public --add-service=https
      # firewall-cmd --reload
      
    • Truy cập địa chỉ http://192.168.20.51 để kiểm tra

      Screenshot_30

    • Trong file /etc/nginx/nginx.conf , sửa lại cấu hình như sau:

      • Trong block http thêm cấu hình tại block upstream
        upstream backends {
                server 192.168.20.120:80 weight=3;
                server 192.168.20.130:80 weight=1;
            }
      
        # Cấu hình trên có nghĩa là cứ 4 request gửi tới server sẽ có 3 request vào web 1 và 1 request vào web 2.
      
      • Trong block http thêm hoặc sửa block server như sau:
        server {
                listen      80 default_server;
                listen      [::]:80 default_server;
                server_name www.srv.world;
                proxy_redirect           off;
                proxy_set_header         X-Real-IP $remote_addr;
                proxy_set_header         X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header         Host $http_host;
                
                location / {
                    proxy_pass http://backends;
                }
            }
      
    • Restart lại nginx

      systemctl restart nginx
      
  • Để kiểm tra truy cập địa chỉ http://192.168.20.51

    Screenshot_31

2.2.2 Lựa chọn thuật toán cân bằng tải

Round Robin

Round Robin là thuật toán mặc định của Nginx khi chúng ta không cấu hình gì thêm trong block upstream. Đặc điểm của thuật toán này là các request sẽ được luân chuyển liên tục giữa các server theo tỉ lệ 1:1, giúp giảm tải cho các hệ thống có lượng request lớn.

upstream backends {
        server 192.168.20.120:80;
        server 192.168.20.130:80;
    }

Weighted load balancing

Với round robin, các request sẽ được chuyển luân phiên đến các server để xử lí theo tỉ lệ 1:1, tuy nhiên đối với weighted load balancing chúng ta có thế phân ra khối lượng xử lí giữa các server. Ví dụ chúng ta có 2 server và muốn cứ 5 request thì có 3 request đến server 1 và 2 request đến server 2.

upstream backends {
        server 192.168.20.120:80 weight=3;
        server 192.168.20.130:80 weight=2;
    }

Least connection

Đây là thuật toán nâng cấp của round robin và weighted load balancing, thuật toán này sẽ giúp tối ưu hóa cân bằng tải cho hệ thống. Đặc điểm của thuật toán này là sẽ chuyển request đến cho server đang xử lý it hơn làm việc, thích hợp đối với các hệ thống mà có các session duy trì trong thời gian dài, tránh được trường hợp các session duy trì quá lâu mà các request được chuyển luân phiên theo quy tắc định sẵn , dễ bị down 1 server nào đó do xử lý qúa khả năng của nó.

upstream backends {
		least_conn;
        server 192.168.20.120:80;
        server 192.168.20.130:80;
    }

Health check

Thuật toán này thực hiện liên tục việc kiểm tra các server trên block upstream để tránh điều hướng các request của người dùng vào các server không hoạt động. Các hoạt động của thuật toán này là nó sẽ gửi một kết nối TCP đến máy chủ, nếu như máy chủ đó lắng nghe trên địa chỉ và port đã cấu hình thì nó mới gửi request đến cho server xử lý.

  • max_fails: Số lần kết nối không thành công trong một khoảng thời gian nhất định tới backend server. Giá trị mặc định là 0 (disabled heath checks).
  • fail_timeout: Khoảng thời gian xảy ra số lượng max_fails kết nối không thành công. Giá trị mặc định là 10.

Khi có 1 server backend bị fail, nginx master sẽ điều hướng toàn bộ các traffic sang lần lượt các backend còn lại.

http {
    upstream backends {
        server 192.168.20.120:80 max_fails=3 fail_timeout=10s;
        server 192.168.20.130:80 max_fails=3 fail_timeout=10s;
    }

3. Tài liệu tham khảo

[1] https://github.com/hocchudong/ghichep-nginx

[2] https://www.nginx.com/resources/glossary/nginx/

[3] https://stackoverflow.com/questions/224664/difference-between-proxy-server-and-reverse-proxy-server

[4] https://kipalog.com/posts/Su-dung-NGINX-nhu-mot-Load-Balancer

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment