Bagaimana jika ada konflik antara aturan Lua dan konfigurasi NGINX?

API7.ai

October 13, 2022

OpenResty (NGINX + Lua)

1. Nama dan Bahasa OpenResty

Q: Saya belum memahami asal-usul nama OpenResty hingga sekarang. Juga, OpenResty menggunakan bahasa Lua, mengapa tidak dengan bahasa skrip lainnya? Misalnya, Shell, dll.

A: OpenResty dimulai sebagai proyek perusahaan Yahoo!, yang dimulai pada Oktober 2007. Nama "Open" diambil dari OpenAPI, dan "Resty" diambil dari rest API. Awalnya, OpenResty tidak dimaksudkan untuk menjadi server web dan platform pengembangan, melainkan aplikasi seperti situs web.

Ketika OpenResty diopen-source lebih dari satu dekade yang lalu, sangat sedikit bahasa yang mendukung non-blocking sinkron. Bahkan sekarang, tidak banyak bahasa backend yang dapat mencapai tingkat performa seperti OpenResty. Saat ini, lebih banyak pengembang menggunakan OpenResty di API gateway dan soft WAF, yang merupakan pilihan alami bagi pengembang.

Mengenai bahasa, OpenResty bukan satu-satunya proyek yang menyematkan bahasa pengembangan lain ke dalam NGINX. Misalnya, NGINX secara resmi menyematkan JS; ada juga proyek open source yang menyematkan PHP ke dalam NGINX.

Biasanya, pilihan bahasa yang digunakan didasarkan pada faktor-faktor seperti konkurensi, JIT, dan popularitas bahasa. Untuk OpenResty, pada tahun 2007, Lua memang merupakan pilihan terbaik. OpenResty sempat mengambil jalan memutar dengan memilih perl daripada Lua pada versi awalnya.

2. Prioritas Aturan Konfigurasi

Q: Ketika aturan Lua di OpenResty bertentangan dengan file konfigurasi NGINX, misalnya, NGINX mengonfigurasi aturan rewrite, dan pada saat yang sama merujuk ke rewrite_by_lua_file, maka apa prioritas dari kedua aturan ini?

A: Sebenarnya, itu tergantung pada bagaimana aturan rewrite NGINX ditulis, apakah itu break atau last, yang dinyatakan dalam dokumentasi resmi OpenResty, dengan contoh kode:

location /foo { rewrite ^ /bar; rewrite_by_lua 'ngx.exit(503)'; } location /bar { ... }

Dalam konfigurasi contoh kode ini, ngx.exit(503) tidak akan dieksekusi.

Namun, jika Anda menulisnya seperti berikut, ngx.exit(503) akan dieksekusi.

rewrite ^ /bar break.

Namun, saya merekomendasikan menggunakan OpenResty untuk rewrite daripada konfigurasi NGINX. Untuk menghindari ambiguitas ini, banyak konfigurasi NGINX yang relatif tidak jelas dan mengharuskan Anda untuk berkonsultasi dengan dokumentasi untuk memahaminya berulang kali.

3. Mengapa Kode Saya Menghasilkan Error?

Q: Dalam fungsi tabel dari ekstensi LuaJIT, mengapa dua baris kode berikut menghasilkan error "module not found" ketika dieksekusi oleh LuaJIT? Saya menggunakan LuaJIT versi 2.0.5.

local new_tab = require('table.new') # atau require('table.clear') # Eksekusi akan menghasilkan error luajit: table_luajit.lua:1: module 'table.new' not found:

A: Dua baris kode ini memerlukan LuaJIT versi 2.1 untuk dijalankan, didokumentasikan di sini: https://github.com/LuaJIT/LuaJIT/blob/v2.1/doc/extensions.html#L218, Anda dapat mengetahuinya.

Seperti yang kami sebutkan, Anda perlu berhati-hati saat menggunakan OpenResty, yang memerlukan versi spesifik LuaJIT untuk berjalan dengan benar. OpenResty didasarkan pada cabang LuaJIT 2.1 dan telah membuat banyak ekstensi untuk LuaJIT.

Jadi, saat menjalankan kode di kolom ini, ingatlah untuk menggunakan instalasi resmi OpenResty. Jika Anda menambahkan lua-nginx-module untuk mengompilasi di atas NGINX, Anda masih akan menemui banyak masalah!

4. Kebingungan tentang Nilai Null

Q: Beberapa hal yang membingungkan yang saya temui adalah ngx.null, nil, null, dan "". Ketika saya mencari di web, saya melihat seseorang mengatakan null adalah definisi dari ngx.null. Ketika Redis mengembalikan nilai, sering kali menentukan apakah hasil yang dikembalikan adalah null atau tidak, jadi nilai mana yang dibandingkan saat membuat penentuan? Apakah ada jebakan lain terkait penggunaan nilai-nilai ini? Saya tidak memahami nilai-nilai ini dengan jelas.

A: Sebelum saya menjawab pertanyaan Anda, saya menyarankan Anda menggunakan kode berikut untuk mencari kunci di lua-resty-redis.

local res, err = red:get("dog")

Ini karena nil Lua tidak dapat digunakan sebagai nilai tabel, jadi OpenResty memperkenalkan ngx.null sebagai nilai null dalam tabel.

Kita dapat mencetak ngx.null dan tipenya dengan kode berikut.

# cetak ngx.null $ resty -e 'print(ngx.null)' null # Cetak tipe $ resty -e 'print(type(ngx.null))' userdata

Seperti yang Anda lihat, ngx.null bukan nil, tetapi bertipe userdata.

Lebih lanjut, ada banyak nilai null di OpenResty, seperti cjson.null, cdata``:NULL dan sebagainya, yang akan saya bahas nanti.

Satu-satunya nilai false di OpenResty adalah nil dan false. Jadi, ketika Anda menulis kode seperti if not res then, Anda harus berhati-hati, dan lebih baik mengubahnya menjadi eksplisit if res ~= nil and res ~= false then, dengan sesuatu seperti ini, dan dengan cakupan kasus uji yang sesuai.

5. Apa Sebenarnya API Gateway Itu?

Q: Apa itu API gateway yang telah disebutkan dalam artikel? Dan NGINX, Tomcat, Apache, dan server web lainnya?

A: API gateway adalah gateway yang digunakan untuk mengelola layanan secara terpadu. Misalnya, pembayaran, login pengguna, dll., semuanya adalah layanan yang disediakan dalam bentuk API, dan semuanya memerlukan gateway untuk melakukan keamanan dan autentikasi terpadu.

API gateway dapat menggantikan NGINX, Apache tradisional untuk menangani lalu lintas utara-selatan, tetapi juga dalam lingkungan microservices untuk menangani lalu lintas timur-barat, adalah middleware yang lebih dekat dengan bisnis, daripada server Web dasar.

Untuk informasi lebih lanjut tentang pengenalan dan implementasi API gateway, silakan merujuk ke Apache APISIX; Apache APISIX didasarkan pada implementasi OpenResty.