101 NGINX & OPENRESTY (P1)

#24
Topic created · 1 Posts · 24 Views

  • Vào ngày 02/08/2019 mình có buổi Open Talk tại trụ sở của công ty OpenCommerce Group
    với chủ đề 101 NGINX & OPENRESTY. Nay mình sẽ chia sẽ lại cho các bạn về nội dung buổi Open Talk này. Sau bài Blog này mình mong các bạn sẽ có cách nhìn khái quát về NGINX và OPENRESTY, cách lập trình cho nó. Những áp dụng thực tế,…

    Ở phần 1 này, mình sẽ giới thiệu và hướng dẫn các bạn cài đặt cũng như luyện tập thao tác với NGINX.


    Trên đây là Profile của mình.

    NGINX là gì?


    NGINX là một mã nguồn mở Web Server được phát triển từ năm 2012 và phát hành vào năm 2014. Với tính chất là nhẹ, hiệu năng cao và thiết kế để phục vụ chịu tải lớn (lượng truy cập lớn, ví dụ như 20.000 lượt truy cập trên 1 giây chẳng hạn). NGINX sử dụng kiến trúc Event Driven (hướng sự kiện) và Asynchronous (bất đồng bộ). Hiện tại được sử dụng phổ biến bởi nhiều ông lớn như Google, Microsoft, Cloudflare, Netflix, Shopify,.… NGINX có cả bản miễn phí lẫn bản thu phí (NGINX PLUS).

    NGINX sử dụng phổ biến để:

    • Truyền tải các nội dung tĩnh như HTML, CSS, hình ảnh,…
    • Load Balancing (Cân bằng tải)
    • Caching (Cache trên Disk hoặc trên Memory)
    • WAF (Web Application Firewall)
    • Reverse Proxy
    • Rate Limiting (Giới hạn truy cập từ 1 danh sách địa chỉ IP)
    • Authentication TTL/SSL (Xác thực chứng chỉ kết nối an toàn)
    • Redirect (Chuyển hướng)

    Hỗ trợ chạy trên nhiều môi trường bao gồm: Linux/Unix (MacOS), Windows, Docker

    Website: nginx.com

    Kiến trúc và cách hoạt động của NGINX


    Đối với các Web Server khác, khi một yêu cầu từ trình duyệt được gửi lên Server, một Thread sẽ được tạo mới, và xử lý yêu cầu đó. Tuy nhiên NGINX với việc sử dụng kiến trúc Event Driven và Asyncronous thì nó lại khác. Thay vì tạo mới một Thread mỗi khi có một HTTP Request từ Client mới được gửi lên, thì các HTTP Request này sẽ đi qua một Master Process. Master Process này sẽ gửi đến các Worker Processes (hay còn gọi là các process con). Mỗi Worker Process sẽ có thể có lên đến 1024 worker connections tương đồng nhau, vì vậy có thể xử lý đồng thời 1024 requests khác nhau tại 1 thời điểm. Với kiến trúc này của NGINX thực sự hiệu quả cho các dự án có yêu cầu chịu tải lớn ví dụ như liên quan tới thương mại điện tử, tìm kiếm và lưu trữ.


    Dưới đây là Workflow của một Request được thể hiện như sau:

    • Request gửi đến Server NGINX. NGINX đọc các Headers từ Request, áp dụng SSL nếu có để mã hóa kết nối.
    • Kiểm tra địa chỉ Request Path(Location) có đúng với cấu hình đã được khai báo hay không?
    • Có Rate Limit không? Nếu có thì kiểm tra và áp dụng phương pháp, ví dụ bị Limit thì sẽ Redirect về HTTP_NOT_FOUND 400 chẳng hạn. Còn không thì đi tiếp.
    • Kiểm tra quyền truy cập từ IP Address (được cho phép/không cho phép) và áp dụng. Nếu không được phép thì sẽ Redirect về HTTP_FORBIDDEN (403). Còn không thì đi tiếp.
    • Đến đây sẽ kiểm tra xem có bất kỳ nội dung phản hồi (Response) nào được Cache lại trên Proxy hay chưa? Thì đi tiếp bước tiếp theo. Còn không thì chuyển đến Server Backend (Upstream) ví dụ như Server API viết bởi C#, Golang, Java,… hoặc Front-end, hoặc Server Cache trên Memory như Memcached, Redis để lấy kết quả.
    • Thực hiện nén theo định dạng được cấu hình nếu có với tùy định dạng tệp.
    • Trả kết quả và thực hiện lưu lại Log của yêu cầu này.

    Cài đặt NGINX

    • Cài đặt trên MacOS với Homebrew:
    **sudo brew install nginx**
    
    • Cài đặt trên Ubuntu:
    **sudo apt-get install nginx**
    

    Môi trường khác xem thêm tại đây

    • Khởi chạy NGINX:
    **sudo service nginx start**
    

    Mặc định một Web Server sẽ được tạo tại Port 8080 ở localhost: http://localhost:8080



    Kết quả

    Các lệnh khác:

    • Reload: sudo service nginx reload
    • Restart: sudo service nginx restart
    • Stop: sudo service nginx stop
    • Kiểm tra các tệp cấu hình có chính xác hay không: sudo nginx -t

    Luyện tập:

    • Chuyển Port 8080 sang Port 80
    **sudo vim /usr/local/etc/nginx/nginx.conf**
    


    Thay đổi Port tại listen từ 8080 thành 80. Lưu lại với nút ESC và gõ :wq!

    • Chạy lệnh: sudo nginx -t để kiểm tra. Nếu OK thì thực hiện reload với lệnh sudo service nginx reload.
    • Kiểm tra http://localhost:80 xem đã chạy được chưa.

    Cảm ơn bạn đã đọc xong phần 1. Bạn có thể đọc tiếp Phần 2 tại đây


Log in to reply