101 NGINX & OPENRESTY (P2)

#26
Topic created · 1 Posts · 22 Views
  • Nối tiếp phần 1 của Series 101 NGINX & OPENRESTY, ở phần 2 này mình sẽ giới thiệu với các bạn về OPENRESTY, và ngôn ngữ lập trình Lua, các ví dụ và hướng dẫn cài đặt.

    Xem lại phần 1 tại đây
    , nếu bạn đã bỏ lỡ.

    OPENRESTY là gì?

    OPENRESTY cũng là một dự án Open Source đang được sử dụng rộng rãi để thay thế cho NGINX. Bản chất OPENRESTY là một sản phẩm nâng cao của NGINX. Với mục đích hướng đến việc chạy toàn bộ các ứng dụng ở phía Server hoàn toàn trên NGINX. Hỗ trợ tối đa cơ chế non-blocking I/O không chỉ riêng cho mỗi HTTP Client, mà còn cho các Server Backend khác ví dụ như MySQL, PostgreSQL, Memcached, Redis,…


    Tuy nhiên bạn cần lưu ý rằng, OPENRESTY không phải là một bản sao chép của NGINX rồi phát triển thêm. OPENRESTY được phát triển dựa trên các tiêu chuẩn có trong bộ NGINX Core, kết hợp cùng các thư viện chất lượng được viết sẵn bằng ngôn ngữ lập trình Lua biên dịch bởi LuaJIT (một máy ảo tương tự như JVM trên Java cho Lua), ngoài ra còn được hỗ trợ bởi các thư viện của bên thứ ba do cộng đồng phát triển. Dựa trên những đặc điểm này kết hợp cùng kiến trúc của NGINX, bạn hoàn toàn có thể sử dụng Lua để cấu hình thêm cho NGINX để có thể phục vụ được từ 10.000 đến 100.000 kết nối đồng thời trên một Server.

    Hiện tại OPENRESTY đang được sử dụng tại một số công ty, tổ chức điển hình như Cloudflare
    , Kong
    , Shopify
    ,…

    LUA và OPENRESTY

    Lua là gì?

    Lua là ngôn ngữ kịch bản (scripting language) được phát triển dựa trên C với đặc điểm là gọn nhẹ, cú pháp đơn giản, tốc độ thực thi nhanh. Được sử dụng khá phổ biến trong việc phát triển các ứng dụng đồ hoạ hay làm game, điển hình như World of Warcraft và Adobe Photoshop Lightroom. Lua có thể chạy trên nhiều tên tảng hệ điều hành khác nhau ví dụ Unix, Linux, Windows,…

    Toàn bộ các thư viện được phát triển trên OPENRESTY, đều được viết bởi Lua. Bạn có thể dễ dàng tìm các thư viện này bằng cách gõ từ khoá: “lua-resty-tên thư viện”. Một số ví dụ như, “lua-resty-mysql" thư viện hỗ trợ cho MySQL. Hoặc bạn có thể xem một bản tổng hợp các thư viện lua-resty đang được tin tưởng sử dụng tại đây
    .

    Sử dụng Lua để cấu hình NGINX



    Các directive được sử dụng phổ biến trong OPENRESTY

    Khi sử dụng OPENRESTY bạn sẽ thấy Lua xuất hiện mọi nơi, bạn có thể sử dụng bởi các directive bắt đầu bằng cú pháp xxx_by_lua_yyy trong đó xxx là mục đích sử dụng, yyy chỉ định code Lua sẽ nằm ở đâu (ở trong code block hay file Lua), ví dụ các directive bạn có thể sử dụng để xử lý một location cụ thể như hình ở bên trên. Khi một request gửi đến location /example thì lần lượt các directive sẽ được thực thi theo thứ tự như sau: access_by_lua (xử lý quyền access của request), rewrite_by_lua (xử lý request trước khi trả response về, trong trường hợp bạn không muốn trả bất kỳ nội dung nào ở phase tiếp theo, bạn có thể sử dụng phase này để trả một kết quả cố định, ví dụ như validate thông tin request trước khi trả response về), content_by_lua (xử lý response cho request), log_by_lua (log lại quá trình xử lý request sau khi hoàn thành).



    Vòng đời xử lý của 1 request trong OpenResty

    Sử dụng Lua trong Location

    Ví dụ sử dụng access_by_lua_block như hình trên: Toàn bộ request được gửi đến từ địa chỉ IP: 127.0.0.1 (localhost) sẽ không được chấp nhận và kết quả trả về sẽ là có HTTP Status Code là 403 (Forbidden).

    Sử dụng Lua để viết Load Balancer cho Proxy

    Để viết cơ chế Round Robin cho chức năng Proxy trong NGINX khi được gọi đến một Upstream (Server Backend), ta thực hiện như sau:

    • Sử dụng directive balancer_by_lua_block và thực hiện viết code Lua ở ngay bên trong này.
    • Sử dụng ngx.balancer với phương thức set_current_peer(host, port) để thực hiện chọn backend server cho lần proxy này.


    Để xem thêm các directive có sẵn trong OPENRESTY bạn có thể tham khảo tại đây
    .

    Cài đặt

    OPENRESTY:

    Mặc định khi cài OPENRESTY thì Lua và LuaJIT cũng sẽ được cài đặt cùng.

    • MacOS:

    Sử dụng Homebrew:

    brew install openresty/brew/openresty
    
    • CentOS:

    Kiểm tra version bạn muốn cài đặt tại đây
    , mình sẽ sử dụng version: 1.13.6.2. Lần lượt thực hiện các lệnh sau:

    sudo apt-get update  
    sudo apt-get install build-essential  
    sudo apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl  
    wget [https://openresty.org/download/openresty-1.13.6.2.tar.gz](https://openresty.org/download/openresty-1.13.6.2.tar.gz)
      
    tar -xvf openresty-1.13.6.2.tar.gz  
    cd openresty-1.13.6.2
    

    Chúng ta sẽ cấu hình cài đặt OPENRESTY hỗ trợ PCRE Regular Expression và hỗ trợ IPv6 bằng cách thực hiện lần lượt các lệnh:

    ./configure -j2 --with-pcre-jit --with-ipv6  
    make -j2
    

    Cuối cùng chúng ta sử dụng lệnh sudo make install để tiến hành cài đặt OPENRESTY đúng vị trí. Có thể sử dụng flag -prefix=/usr/local/openresty để tiến hành cài đặt OPENRESTY tại địa chỉ thư mục /usr/local/openresty, ví dụ:

    ./configure -prefix=/usr/local/openresty -j2 --with-pcre-jit --with-ipv6  
    make -j2  
    sudo make install
    

    Sau khi cài đặt hoàn tất, bạn có thể chạy OPENRESTY bằng cách:

    sudo /usr/local/openresty/bin/openresty
    

    Hoặc thêm ALIAS openresty cho địa chỉ trên trong .bash_profile

    alias openresty=/usr/local/openresty/bin/openresty
    

    Bạn có thể kiểm tra bằng cách thử vào trang localhost:8080 nhé.

    • Docker:

    Bạn có thể cài đặt trên Docker với Image: openresty/openresty:1.13.6.2-centos

    Cài đặt trình quản lý thư viện cho OPENRESTY

    Hiện tại có hai trình quản lý thư viện phổ biến cho OPENRESTY là OPM và LuaRocks

    • OPM: Mặc định OPM sẽ được cài sẵn cùng với OPENRESTY
    • LuaRocks:
    wget [https://luarocks.org/releases/luarocks-3.1.3.tar.gz](https://luarocks.org/releases/luarocks-3.1.3.tar.gz)
      
    tar zxpf luarocks-3.1.3.tar.gz  
    cd luarocks-3.1.3  
    ./configure  
    make build  
    sudo make install
    

    Cách sử dụng:

    Sử dụng opm get tên_thư_viện để cài đặt, ví dụ: opm get ledgetech/lua-resty-http

    Sử dụng luarocks install tên_thư_viện để cài đặt, ví dụ: luarocks install luasocket

    Cảm ơn các bạn đã đọc, nếu có góp ý hay thắc mắc gì các bạn có thể comment ở phía bên dưới nhé!

    Ở phần tiếp theo, mình sẽ giới thiệu các kỹ hơn về lập trình Lua trong OPENRESTY, các bạn nhớ đón theo dõi nhé.


    101 NGINX & OPENRESTY (P2)
    was originally published in Open Commerce Group
    on Medium, where people are continuing the conversation by highlighting and responding to this story.

Log in to reply