0
0
0
share
#nginx-unit#php#server#sysadmin
0 Komentar
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.
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 bagianroutes
untuk diproses lebih lanjutroutes
untuk mendefinisikan rute request ke program yang sesuai. Pada json di atas kita sudah mendaftarkan satu kondisi, bila request masuk dari domain localhost, makaaction
-nya arahkan keapplications/myapp
applications
untuk mendefinisikan aplikasi yang akan melayani request yang sudah dirutekan ke aplikasi yang dimaksud. Pada bagianroutes
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