0

0

0

share


#nginx-unit#php#server#sysadmin
0 Reaksi

0 Komentar

Install dan Konfigurasi Nginx Unit + PHP di Ubuntu, Lebih Kenceng dari Nginx + PHP-FPM!

Profile
Toni Haryanto

25 Desember 2024

Install dan Konfigurasi Nginx Unit + PHP di Ubuntu, Lebih Kenceng dari Nginx + PHP-FPM!

Ini adalah catatan hasil ulikan saya di hari libur, setelah nonton video mas Eko PZN yang bahas satu artikel di dev.to tentang PHP Runtime Benchmark (artikel disini]. Singkatnya, dari artikel itu saya mendapatkan insight menarik bahwa LAMP stack dan LEMP stack yang selama ini saya gunakan untuk aplikasi PHP saya bukan yang paling cepat. Ada 2 kandidat PHP runtime yang bisa jadi alternatif --atau solusi baru, bila ingin menjalankan aplikasi PHP dengan performa yang maksimal.

Image

Pada grafik benchmark di atas kita bisa lihat hasil dari tes request concurrency 1000, Nginx + PHP-FPM yang biasa saya gunakan ternyata masih kalah dengan Nginx Unit. Nginx Unit menjadi juara ketiga, setelah FrankenPHP (worker mode) dan Swoole. tapi kalau pakai Swoole kita bakal harus tulis ulang kode program kita karena dia konsepnya non-blocking I/O seperti NodeJS. Jadi kurang cocok untuk project PHP yang sudah jadi.

Jadi dua kandidat PHP runtime yang paling menarik buat saya ulik adalah Nginx Unit dan FrankenPHP. Namun pada artikel ini saya akan bahas dulu tentang cara install dan konfigurasi Nginx Unit dan PHP di komputer Ubuntu. Disini saya menggunakan Ubuntu 24.04 Noble Numbat. Dokumentasi lengkap Nginx Unit bisa dilihat di https://unit.nginx.org/ dan repo Githubnya di https://github.com/nginx/unit/.

Install PHP

Ini task standar ya, install dulu PHP dan Composer sebagaimana biasanya. Tapi tidak perlu install php-fpm karena kita tidak perlu itu di Nginx Unit.

sudo add-apt-repository -y ppa:ondrej/php sudo apt-get install -y php8.3-dev php8.3-embed \ php8.3-bcmath php8.3-cli php8.3-common php8.3-curl \ php8.3-gd php8.3-intl php8.3-mbstring php8.3-mysql php8.3-pgsql \ php8.3-redis php8.3-soap php8.3-sqlite3 php8.3-xml php8.3-zip curl -sLS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/bin/ --filename=composer

Install Nginx Unit

Daftarkan paket repositori ke sistem

wget https://raw.githubusercontent.com/nginx/unit/master/tools/setup-unit && chmod +x setup-unit sudo ./setup-unit repo-config

Install nginx-unit

sudo apt install unit

Install unit-php

Nginx Unit mendukung runtime untuk banyak bahasa pemrograman, diantaranya Go, JavaScript (Node.js), Java, Perl, PHP, Python, Ruby dan WebAssembly. Untuk sekarang saya akan install untuk PHP saja

sudo apt install unit-dev unit-php # restart unit setelah menginstal module sudo systemctl restart unit

Konfigurasi Nginx Unit untuk PHP

Nginx Unit tidak seperti Nginx yang biasa yang konfigurasinya disimpan di dalam file. Kita mengatur konfigurasi di Nginx Unit secara dinamis via HTTP menggunakan RESTful JSON API. Di satu sisi ini hal yang ga bisa, tapi di sisi lain cara ini bikin pengaturan lebih fleksibel sehingga pembaharuan konfigurasi dapat dilakukan tanpa ada jeda gangguan karena kesalahan konfigurasi.

Untuk melihat konfigurasi yang sudah terpasang jalankan perintah ini:

sudo curl --unix-socket /var/run/control.unit.sock localhost

Maka akan muncul json configuration semisal ini:

{ "certificates": {}, "js_modules": {}, "config": { "listeners": {}, "routes": [], "applications": {} }, "status": { "modules": { "php": { "version": "8.3.6", "lib": "/usr/lib/unit/modules/php.unit.so" } }, "connections": { "accepted": 0, "active": 0, "idle": 0, "closed": 0 }, "requests": { "total": 0 }, "applications": {} } }

Ada 3 pengaturan utama di Unit, diantaranya certificates untuk managemen sertifikat SSL, config untuk managemen konfigurasi, dan status untuk statistik penggunaan unit.

Di bagian status kita melihat sudah tampil modul yang terinstal yakni php.

Bila kita hanya ingin mengecek pengaturan config, maka kita dapat memanggil dengan perintah seperti ini

sudo curl --unix-socket /var/run/control.unit.sock localhost/config

Maka nanti yang tampil hanyak pengaturan config saja

{ "listeners": {}, "routes": [], "applications": {} }

Setup Aplikasi PHP

Saya akan pasang satu aplikasi sederhana menggunakan framework CodeIgniter sebagai contoh. Saya akan menyimpan folder projectnya di /var/development/. Kamu bebas mau simpan dimana saja, tidak mesti di /var/www/ karena kita tidak pakai nginx atau apache lagi.

# Buat folder sudo mkdir -p /var/development # Set folder permission menjadi 775 sudo chmod 775 /var/development -R # Set folder owner supaya group unit bisa mengakses folder sudo chown $USER:unit /var/development -R cd /var/development # Install aplikasi CodeIgniter 4 composer create-project codeigniter4/appstarter myapp # Pastikan folder dan files project dapat diakses oleh unit sudo chmod 775 myapp -R sudo chown :unit myapp -R

Sekarang kita akan memasang konfigurasi unit agar server dapat melayani rekues ke aplikasi kita. Kita buat dulu file konfigurasinya. Saya akan menyimpan file konfigurasi di dalam folder /var/development

cd /var/development nano unit.config.json

Masukkan json berikut ke dalam file unit.config.json

{ "listeners": { "*:80": { "pass": "routes" } }, "routes": [ { "match": { "host": "localhost", "uri": "!/index.php" }, "action": { "share": "/var/development/myapp/public$uri", "fallback": { "pass": "applications/myapp" } } } ], "applications": { "myapp": { "type": "php", "root": "/var/development/myapp/public/", "script": "index.php", "processes": {} } } }

Ada 3 key utama pada config di atas:

  • listeners untuk mendefinisikan request domain dan port yang akan dipantau oleh unit. Pada json di atas kita mendaftarkan port 80 dari domain apapun (*) yang masuk. Request kemudian diserahkan ke bagian routes untuk diproses lebih lanjut
  • routes untuk mendefinisikan rute request ke program yang sesuai. Pada json di atas kita sudah mendaftarkan satu kondisi, bila request masuk dari domain localhost, maka action-nya arahkan ke applications/myapp
  • applications untuk mendefinisikan aplikasi yang akan melayani request yang sudah dirutekan ke aplikasi yang dimaksud. Pada bagian routes kita mengarahkan request ke aplikasi myapp.

Setelah konfigurasi json disimpan di dalam file unit.config.json, jalankan perintah berikut ini untuk memasang konfigurasi ke unit

# Pastikan posisi terminal ada di dalam folder yang berisi unit.config.json sudo curl -X PUT --data-binary @unit.config.json --unix-socket /var/run/control.unit.sock localhost/config

Bila hasil yang muncul adalah json dengan pesan { "success": "Reconfiguration done." } berarti konfigurasi berhasil terpasang.

Untuk mengetes, buka http://localhost di browser, atau kalau kamu mencoba di server, jalankan perintah berikut untuk memanggil localhost

curl http://localhost

Perintah ini seharusnya akan mengembalikan html dari halaman welcome message CodeIgniter. Tandanya request ke http://localhost berhasil dilayani oleh Nginx Unit dan aplikasi myapp.

Memasang Domain

Kita akan memasang domain supaya aplikasi kita dapat diakses dari browser dengan domain yang riil.

Pertama-tama daftarkan domain di DNS server agar mengarah ke server tempat kamu menginstall Nginx Unit dan aplikasi PHP. Kalau kamu mencoba di komputer local, kamu tinggal pilih saja satu nama domain misalnya myapp.local.

Daftarkan nama domain di /etc/hosts

sudo nano /etc/hosts # Tambahkan baris ini di dalam file /etc/hosts 123.456.789.123 domainkamu.net # Atau kalau mau cuma ngetes di local 127.0.0.1 myapp.local

Kemudian ubah file konfigurasi Unit bagian routes/match/host dengan nama domain kamu

# File unit.config.json ... "routes": [ { "match": { "host": "domainkamu.net", "uri": "!/index.php" }, ...

Terakhir jangan lupa mengunggah pembaharuan pengaturan ke Unit

sudo curl -X PUT --data-binary @unit.config.json --unix-socket /var/run/control.unit.sock localhost/config

Coba panggil domain kamu dari browser. Sekarang aplikasi Codeigniter tampil di domain yang sudah kamu pasang.

Memasang SSL

Kita akan memasang SSL supaya domain aplikasi kita dapat diakses dengan https.

Pertama-tama install dulu certbot untuk menggenerate SSL Certificate menggunakan LetsEncrypt

sudo apt update sudo apt install certbot

Generate SSL Certificate untuk domain kamu

# Hentikan sementara service unit karena port 80 akan dipakai dulu oleh letsencrypt sudo systemctl stop unit # Generate certificate, ikuti langkah-langkah dari certbot #Sesuaikan dengan nama domain kamu sudo certbot certonly --standalone -d domainkamu.net # Nyalakan kembali service unit sudo systemctl start unit

Letsencrypt akan membuat dua buah file untuk certificate, fullchain.pem dan privkey.pem. Biasanya disimpan di /etc/letsencrypt/live/. Lokasi ini diberitahukan oleh certbot saat proses generate selesai.

Kita akan daftarkan file certificate ini ke Nginx Unit agar dapat dipakai oleh aplikasi

# Buat folder untuk menyimpan file certificate yang sudah digabung mkdir /var/development/ssl cd /var/development/ssl # Gabungkan dulu dua file certificate menjadi satu, sesuaikan nama domain sudo cat /etc/letsencrypt/live/domainkamu.net/fullchain.pem /etc/letsencrypt/live/domainkamu.net/privkey.pem > /var/development/ssl/domainkamu.net.pem # Daftarkan file certificate yang sudah digabung ke Nginx Unit sudo curl --unix-socket /var/run/control.unit.sock -X PUT --data-binary @/var/development/ssl/domainkamu.net.pem localhost/certificates/myapp

Perbaharui file unit.config.json di bagian listeners, dengan menambahkan listener ke port 443 dengan mendaftarkan nama certificatenya

{ "listeners": { "*:80": { "pass": "routes" }, "*:443": { "pass": "routes", "tls": { "certificate": "myapp" } } }, ...

Jangan lupa untuk mengupdate konfigurasi ke Unit

sudo curl -X PUT --data-binary @unit.config.json --unix-socket /var/run/control.unit.sock localhost/config

Coba panggil domain kamu dengan https://domainkamu.net.

0

0

0

share