Program OpenResty Pertama Anda: Hello World

API7.ai

September 9, 2022

OpenResty (NGINX + Lua)

Ketika kita mulai mempelajari bahasa pengembangan baru, tutorial biasanya menyediakan contoh sederhana hello world. Jadi, mari kita lewati dulu proses instalasi dan lihat bagaimana menulis contoh ini di OpenResty:

$ resty -e "ngx.say('hello world')" hello world

Ini seharusnya menjadi kode hello world yang paling sederhana yang pernah Anda lihat, mirip dengan Python:

$ python -c 'print("hello world")' hello world

Di balik ini adalah manifestasi dari filosofi OpenResty. Kode harus cukup ringkas untuk membuat Anda terhindar dari pemikiran "dari awal sampai menyerah." Posting ini akan fokus pada contoh hello world.

Seperti yang kami katakan dalam posting Apa perbedaan antara OpenResty dan NGINX, OpenResty berbasis pada NGINX. Jadi, Anda mungkin bertanya: Mengapa kita tidak melihat bayangan NGINX di sini? Jangan khawatir, mari kita tambahkan satu baris kode untuk melihat apa yang berjalan di balik resty:

$ resty -e "ngx.say('hello world'); ngx.sleep(10)" &

Kami menambahkan metode ngx.sleep sehingga program tidak akan keluar setelah mencetak string hello world. Dengan cara ini, kita memiliki kesempatan untuk mencari tahu:

$ ps -ef | grep nginx root 15944 6380 0 13:59 pts/6 00:00:00 grep --color=auto nginx

Akhirnya proses NGINX muncul! Tampaknya perintah resty pada dasarnya memulai layanan NGINX, jadi apa itu resty?

Anda mungkin belum menginstal OpenResty di mesin Anda, jadi selanjutnya, mari kita kembali ke langkah instalasi yang kita lewati di awal, dan instal OpenResty sebelum melanjutkan.

Instalasi

Seperti perangkat lunak sumber terbuka lainnya, kita dapat menginstal OpenResty dengan berbagai cara, seperti menggunakan manajer paket sistem operasi, mengompilasi dari kode sumber, atau menggunakan gambar docker. Namun, saya menyarankan Anda untuk pertama kali menggunakan manajer paket seperti yum, apt-get, dan brew untuk menginstal OpenResty. Dalam posting ini, saya akan menggunakan macOS sebagai contoh:

$ brew tap openresty/brewbrew install openresty

Menggunakan sistem operasi lain juga serupa. Pertama, tambahkan URL repositori OpenResty ke manajer paket, lalu gunakan manajer paket untuk menginstal OpenResty. Untuk langkah-langkah lebih detail, Anda dapat merujuk ke dokumentasi resmi.

Namun, ada dua masalah di balik instalasi yang tampaknya sederhana ini:

  1. Mengapa saya tidak merekomendasikan menggunakan kode sumber untuk menginstalnya?
  2. Mengapa tidak bisa diinstal langsung dari repositori resmi sistem operasi tetapi perlu menyetel repositori lain terlebih dahulu?

Silakan pikirkan kedua pertanyaan tersebut terlebih dahulu.

Di sini saya ingin menambahkan satu hal lagi. Saya akan menaruh banyak "mengapa" di balik penampilan dalam kursus ini. Saya harap Anda bisa berpikir sambil mempelajari hal baru. Tidak masalah apakah hasilnya benar atau tidak. Sayangnya, pemikiran independen juga langka di bidang teknis. Karena perbedaan dalam bidang dan kedalaman teknis setiap orang, guru pasti akan memiliki pendapat pribadi dan kesalahan dalam pengetahuan dalam kursus apa pun. Kita dapat secara bertahap membentuk sistem teknis kita sendiri dengan bertanya beberapa mengapa dalam proses belajar dan memahaminya.

Banyak insinyur menikmati membangun dari kode sumber, dan saya juga melakukannya bertahun-tahun yang lalu. Namun, ketika menggunakan proyek sumber terbuka, saya selalu berharap bisa secara manual configure dan make dari kode sumber dan memodifikasi beberapa parameter kompilasi. Saya merasa ini adalah cara terbaik untuk menyesuaikan lingkungan mesin ini dan memaksimalkan kinerjanya.

Tetapi ini tidak terjadi dalam kenyataan. Setiap kali saya mengompilasi kode sumber, saya menghadapi masalah lingkungan yang aneh, dan saya hanya bisa menginstalnya setelah tersandung. Sekarang saya mengerti bahwa tujuan awal kita adalah menggunakan proyek sumber terbuka untuk memenuhi kebutuhan bisnis. Kita tidak boleh membuang waktu dan lingkungan untuk berjuang, apalagi manajer paket dan teknologi kontainer. Ini justru untuk membantu kita menyelesaikan masalah ini.

Mari kita kembali ke topik. Menggunakan kode sumber OpenResty untuk menginstal, tidak hanya langkah-langkahnya rumit, Anda perlu menyelesaikan dependensi eksternal seperti PCRE, OpenSSL, dll., tetapi Anda juga perlu mem-patch versi OpenSSL yang sesuai secara manual. Jika tidak, akan ada kekurangan fungsi saat menangani SSL sessions. Misalnya, API Lua seperti ngx.sleep yang menyebabkan yield tidak dapat digunakan. Jika Anda ingin mempelajari lebih lanjut tentang bagian ini, Anda dapat merujuk ke dokumentasi resmi untuk informasi lebih detail.

OpenResty memelihara patch tersebut dalam skrip paket OpenSSL sendiri. Ketika OpenResty meningkatkan versi OpenSSL, itu harus menghasilkan patch yang sesuai dan melakukan pengujian regresi lengkap.

Source0: https://www.openssl.org/source/openssl-%{version}.tar.gz Patch0: https://raw.githubusercontent.com/openresty/openresty/master/patches/openssl-1.1.0d-sess_set_get_cb_yield.patch Patch1: https://raw.githubusercontent.com/openresty/openresty/master/patches/openssl-1.1.0j-parallel_build_fix.patch

Pada saat yang sama, kita dapat melihat skrip paket OpenResty di CentOS untuk melihat apakah ada poin tersembunyi lainnya:

BuildRequires: perl-File-Temp BuildRequires: gcc, make, perl, systemtap-sdt-devel BuildRequires: openresty-zlib-devel >= 1.2.11-3 BuildRequires: openresty-openssl-devel >= 1.1.0h-1 BuildRequires: openresty-pcre-devel >= 8.42-1 Requires: openresty-zlib >= 1.2.11-3 Requires: openresty-openssl >= 1.1.0h-1 Requires: openresty-pcre >= 8.42-1

Seperti yang Anda lihat di sini, OpenResty memelihara versi OpenSSL sendiri dan versi zlib dan PCRE sendiri. Namun, dua yang terakhir menyesuaikan parameter kompilasi dan tidak mempertahankan patch mereka.

Jadi, mempertimbangkan faktor-faktor ini, saya tidak merekomendasikan mengompilasi OpenResty dari kode sumber kecuali Anda sudah mengetahui detailnya.

Seharusnya jelas bagi Anda mengapa instalasi sumber tidak direkomendasikan. Ketika kita menjawab pertanyaan pertama, kita juga menjawab pertanyaan kedua: mengapa tidak bisa diinstal langsung dari repositori paket resmi sistem operasi tetapi perlu menyetel repositori lain terlebih dahulu?

Ini karena repositori resmi tidak mau menerima paket OpenSSL, PCRE, dan zlib yang dipelihara oleh pihak ketiga untuk mencegah mereka menyebabkan kebingungan bagi pengguna lain yang tidak tahu mana yang harus dipilih. Di sisi lain, OpenResty membutuhkan versi tertentu dari pustaka OpenSSL dan PCRE untuk berjalan normal, dan versi default sistem relatif lama.

CLI OpenResty

Setelah menginstal OpenResty, CLI OpenResty resty sudah diinstal secara default. Ini adalah skrip Perl, dan seperti yang kami sebutkan sebelumnya, alat ekosistem OpenResty semuanya ditulis dalam Perl, yang ditentukan oleh preferensi teknis penulis OpenResty.

$ which resty /usr/local/bin/resty $ head -n 1 /usr/local/bin/resty #!/usr/bin/env perl

CLI resty sangat kuat, dan kita dapat menggunakan resty -h atau membaca dokumentasi resmi untuk daftar fungsionalitas lengkap. Selanjutnya, saya akan memperkenalkan dua fitur menarik.

$ resty --shdict='dogs 1m' -e 'local dict = ngx.shared.dogs dict:set("Tom", 56) print(dict:get("Tom"))' 56

Contoh di atas menunjukkan konfigurasi Nginx dengan kode Lua, yang menyelesaikan pengaturan dan pencarian kamus memori bersama. dogs 1m adalah konfigurasi Nginx yang mendeklarasikan ruang memori bersama bernama dogs dengan ukuran 1m. Memori bersama digunakan sebagai kamus dalam kode Lua.

Juga, parameter --http-include dan --main-include digunakan untuk menyiapkan file konfigurasi NGINX, sehingga kita bisa menulis ulang contoh di atas sebagai:

$ resty --http-conf 'lua_shared_dict dogs 1m;' -e 'local dict = ngx.shared.dogs dict:set("Tom", 56) print(dict:get("Tom"))'

Alat debugging standar di dunia OpenResty, seperti gdb, valgrind, sysetmtap, dan Mozilla rr juga dapat digunakan dengan resty untuk memfasilitasi pengembangan dan pengujian normal. Mereka sesuai dengan perintah berbeda dari resty, jadi implementasi internalnya sangat sederhana, hanya lapisan tambahan panggilan baris perintah. Mari kita ambil valgrind sebagai contoh.

$ resty --valgrind -e "ngx.say('hello world'); " ERROR: failed to run command "valgrind /usr/local/openresty/nginx/sbin/nginx -p /tmp/resty_rJeOWaYGIY/ -c conf/nginx.conf": No such file or directory

Mereka tidak hanya berlaku untuk dunia OpenResty tetapi juga alat umum untuk sisi server, jadi mari kita pelajari mereka langkah demi langkah.

"Hello world" yang lebih formal

Program OpenResty pertama yang kita tulis, di awal, menggunakan perintah resty tanpa proses master dan tanpa mendengarkan port tertentu. Selanjutnya, mari kita implementasikan program hello world lainnya.

Kita membutuhkan setidaknya tiga langkah untuk menyelesaikannya.

  1. Buat direktori kerja.
  2. Modifikasi file konfigurasi NGINX untuk menyematkan kode Lua di dalamnya.
  3. Mulai layanan OpenResty.

Mari kita mulai dengan membuat direktori kerja.

$ mkdir openresty-sample $ cd openresty-sample $ mkdir logs/ conf/

Berikut adalah nginx.conf minimalis dengan direktif content_by_lua OpenResty di direktori root, yang menyematkan metode ngx.say.

events { worker_connections 1024; } http { server { listen 8080; location / { content_by_lua ' ngx.say("hello, world") '; } } }

Pastikan openresty telah ditambahkan ke lingkungan PATH terlebih dahulu; kemudian, mulai layanan OpenResty:

$ openresty -p `pwd` -c conf/nginx.conf

Jika tidak ada kesalahan yang terjadi, layanan OpenResty telah berhasil dimulai. Kita dapat mengaksesnya dengan perintah cURL untuk melihat hasil yang dikembalikan.

$ curl -i 127.0.0.1:8080 HTTP/1.1 200 OK Server: openresty/1.13.6.2 Content-Type: text/plain Transfer-Encoding: chunked Connection: keep-alive hello, world

Selamat! Hello World formal di OpenResty selesai!

Ringkasan

Mari kita tinjau apa yang kita pelajari hari ini. Pertama, kita memulai instalasi OpenResty dan CLI dengan satu baris kode sederhana "hello, world", dan akhirnya, kita memulai proses OpenResty dan menjalankan program backend yang sebenarnya.

Di antara mereka, resty adalah alat baris perintah yang akan sering kita gunakan di masa depan. Oleh karena itu, kode demo dalam kursus dijalankan dengannya, daripada memulai layanan OpenResty di latar belakang.

Yang lebih penting, banyak detail budaya dan teknis tersembunyi di balik OpenResty, dan itu seperti gunung es yang mengambang di laut. Melalui kursus ini, saya berharap dapat menunjukkan kepada Anda OpenResty yang lebih komprehensif, bukan hanya API yang terpapar.