Salah-satu komponen yang dapat menjembatani webmap frontend (tentu saja ini: HTML) dengan database yang paling populer adalah PHP. Pada bagian ini kita akan membahas tentang bagaimana konfigurasinya dan bagaimana menghubungkannya dengan HTTP server yang akan kita gunakan, yaitu Nginx.
Sedikit OOT, banyak developer yang memandang-rendah terhadap PHP. Mereka bilang PHP itu bahasa pemrogramannya newbies, nggak mutu, sucks dan ketinggalan jaman. Issue yang kebanyakan mereka angkat adalah performa (terutama pada saat sistemnya diakses oleh ratusan, ribuan, bahkan jutaan users). Dan masih banyak lagi issues lain yang dimanfaatkan oleh para PHP-haters itu untuk bad-mouthing about PHP di Internet.
Tapi bagi saya (saya berharap Anda juga) tidak. Saya bukan PHP-hater. Saya jadi PHP-user saja. (Webmap) development pada prinsipnya adalah proses penyelesaian masalah, yang mana hasil akhirnya adalah sebuah solusi. PHP (dan sama juga dengan bahasa-bahasa pemrograman lainnya) itu pada akhirnya hanya menjadi sebuah alat untuk mencapai tujuan akhir. Pada prosesnya, yang penting juga bukan PHP-nya juga koq, tapi arsitektur dan algoritma yang diterapkan dalam setiap business logic-nya, bahkan hingga komponen terkecil dan paling sederhana sekalipun. Saya nggak malu pakai PHP, karena saya pikir reputasi saya akan lebih memalukan lagi jika webmap saya nggak jalan.
Stop OOT-nya, langsung mulai kerja saja. Asumsikan saja Anda sudah login ke server sebagai rinjani melalui SSH dari workstation Anda:
Langkah pertama adalah membuat direktori untuk penampungan PHP_SESSION files, dan diikuti dengan mengedit file php.ini
yang by default berada di direktori /etc
. Commands-nya:
[rinjani@nusantara ~]$ sudo mkdir /tmp/phpsessions
[rinjani@nusantara ~]$ sudo chmod -R 777 /tmp/phpsessions
[rinjani@nusantara ~]$ sudo nano /etc/php.ini
Sebagai catatan, pada file
php.ini
, comments selalu diawali dengan karakter ; (titik-koma / semicolon).
Tambahkan, atau ganti values pada entries berikut ini, yang akan ditampilkan dalam sebuah table:
Entry/Setting | Default/Old Value | New Value | Comments |
---|---|---|---|
expose_php | On |
Off |
- |
error_reporting | E_ALL & ~E_DEPRECATED & ~E_STRICT |
E_ALL |
- |
post_max_size | 2M |
200M |
- |
upload_max_filesize | 2M |
200M |
- |
date.timezone | disabled, empty |
"Asia/Jakarta" |
uncomment |
pdo_mysql.default_socket | empty |
/var/lib/mysql/mysql.sock |
- |
mysqli.default_socket | empty |
/var/lib/mysql/mysql.sock |
- |
mysqli.default_host | empty |
localhost |
- |
session.save_path | disabled, empty |
"/tmp/phpsessions" |
uncomment |
Misal:
...
;date.timezone =
...
menjadi:
...
date.timezone = "Asia/Jakarta"
...
Dan misal:
...
mysql.default_socket =
...
menjadi:
...
mysql.default_socket = /var/lib/mysql/mysql.sock
...
Jadi, ada values yang pakai "..." (petik-ganda / double-quotes), dan ada yang tidak. Cermati format values-nya.
Save perubahannya dengan menekan Ctrl+O lalu <Enter> untuk mengkonfirmasi Yes, dan exit dari nano editor dengan menekan Ctrl-X.
Setelah file php.ini
diedit, maka PHP-FPM-nya harus diaktifkan lewat systemd:
[rinjani@nusantara ~]$ sudo systemctl enable php-fpm.service
[rinjani@nusantara ~]$ sudo systemctl start php-fpm.service
Test PHP-nya dengan commands berikut ini:
[rinjani@nusantara ~]$ php --ri pgsql
[rinjani@nusantara ~]$ php --ri mysqli
[rinjani@nusantara ~]$ php --ri gd
[rinjani@nusantara ~]$ php --ri gmp
[rinjani@nusantara ~]$ php --ri json
[rinjani@nusantara ~]$ php --ri session
[rinjani@nusantara ~]$ php --ri sqlite3
[rinjani@nusantara ~]$ php --ri exif
Kalau tests di atas sudah menampilkan informasi bahwa modul-modul tersebut support-nya enabled, maka PHP Anda sudah siap.
Setting php.ini
memang njlimet (rumit). Yang berikut ini bakalan lebih njlimet lagi, yaitu setting Nginx pada file nginx.conf
:
[rinjani@nusantara ~]$ sudo nano /etc/nginx/nginx.conf
Yang diedit/ditambah adalah:
Yang tadinya:
...
types_hash_max_size 2048;
...
menjadi:
...
types_hash_max_size 4096;
...
Tambahkan entry client_max_body_size
di bawah types_hash_max_size
supaya user bisa meng-upload file hingga 200 MB:
...
types_hash_max_size 4096;
client_max_body_size 200m;
...
Masuk ke blok server { ... }
, ubah index yang tadinya:
...
root /usr/share/nginx/html;
index index.html index.htm;
...
menjadi:
...
root /usr/share/nginx/html;
index index.php index.html index.htm;
...
Sambil mulai membahas strategi reverse-proxy pada Nginx, masih di blok server { ... }
, tambahkan:
...
proxy_buffering off;
proxy_buffer_size 128k;
proxy_buffers 128k;
...
sebagai proxy buffer directives yang berlaku secara global.
Kemudian tambahkan directives untuk PHP FastCGI-nya:
...
location / {
}
...
menjadi:
...
location / {
}
location ~ [^/]\.php(/|$) {
try_files $uri =404;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_param HTTP_PROXY "";
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
}
...
Dan akhirnya tambahkan directives berikut ini di akhir blok server { ... }
:
...
location ~ /\.ht {
deny all;
}
...
Save perubahannya dengan menekan Ctrl+O lalu <Enter> untuk mengkonfirmasi Yes, dan exit dari nano editor dengan menekan Ctrl-X.
Untuk lebih lengkapnya, Anda bisa melihat contoh nginx.conf ini.
Untuk mengaktifkan Nginx sebagai service, jalankan commands:
[rinjani@nusantara ~]$ sudo chmod -R 777 /usr/share/nginx/html
[rinjani@nusantara ~]$ sudo systemctl enable nginx.service
[rinjani@nusantara ~]$ sudo firewall-cmd --permanent --zone=FedoraServer --add-port=80/tcp
[rinjani@nusantara ~]$ sudo firewall-cmd --reload
[rinjani@nusantara ~]$ sudo firewall-cmd --permanent --zone=FedoraServer --add-port=443/tcp
[rinjani@nusantara ~]$ sudo firewall-cmd --reload
[rinjani@nusantara ~]$ sudo systemctl restart php-fpm.service
[rinjani@nusantara ~]$ sudo systemctl start nginx.service
Buka URL http://192.168.1.23
di browser Anda, maka Nginx test page akan muncul.
Kalau pada bagian sebelumnya kita test Nginx-nya untuk menampilkan default HTML file (index.html) sebagai test page, maka langkah selanjutnya adalah test PHP-nya. Ini mudah saja, create file ber-extension .php dalam root directory Nginx, yaitu di /usr/share/nginx/html
.
[rinjani@nusantara ~]$ sudo nano /usr/share/nginx/html/phptest.php
Dalam file yang masih kosong ini tuliskan saja:
<?php phpinfo(); ?>
Save perubahannya dengan menekan Ctrl+O lalu <Enter> untuk mengkonfirmasi Yes, dan exit dari nano editor dengan menekan Ctrl-X. Lalu ubah permission-nya menjadi 777 saja, dengan command:
[rinjani@nusantara ~]$ sudo chmod 777 /usr/share/nginx/html/phptest.php
Buka URL http://192.168.1.23/phptest.php
di browser Anda, maka PHP info page akan muncul.
Sampai pada tahap ini, PHP dan PHP-FPM sudah terintegrasi dengan Nginx HTTP server, sehingga dapat mengakses database dan layanan data lainnya, seperti WMS/WMTS/WFS services_.
Sekarang adalah eranya API (Application Programming Interface). Salah satu implementasi dari API adalah Web Service, yaitu layanan data (data service) yang "dibungkus" atau "ditumpangkan" dalam layanan HTTP (atau HTTPS). Dalam terminologi Web Service, kita sering mendengar istilah "endpoint".
There's nothing new under the sun. Sesuatu yang terlihat kompleks dan "canggih" itu ternyata (masih saja) gabungan dari hal-hal yang sederhana dan sangat mendasar. Yang dimaksud dengan endpoint pada modern API adalah URL yang dituju aplikasi untuk mendapatkan data tertentu. Misal: http://192.168.1.23/webservice/points
adalah endpoint yang outputnya GeoJSON point. Sekarang masalahnya sederhana saja: endpoint itu kalau bisa ya berformat sederhana dan tidak "berpihak" pada salah satu jenis bahasa pemrograman saja. Kondisi Webmap Development Server kita sekarang, kalau mau membuat endpoint, ya di belakangnya masih harus menuliskan .php -- misal: http://192.168.1.23/webservice/points.php
.
Nah, webmap moderen itu ya juga menggunakan Web Service, misalnya untuk mendapatkan data GeoJSON. Pada pemrograman frontend-nya, penulisan endpoint sudah cenderung nggak akan mempedulikan engine apa yang bekerja dalam endpoint-nya. Misal, kalau frontend butuh data points, ya mengarahnya ke http://192.168.1.23/webservice/points
, bukan ke http://192.168.1.23/webservice/points.php
. Kita lihat segi positifnya saja, dengan menerapkan API-style seperti ini, tentu saja akan lebih membebaskan backend untuk memilih dan mengembangkan teknologi under the hood-nya. Misal, kalau webmap-nya sudah sangat kompleks dan traffic-nya tinggi, dan backend (yang pakai PHP) sudah mulai kepayahan, ya backend bisa switching teknologinya (misal pakai Node atau Golang) tanpa mengubah endpoints-nya sama-sekali.
Lalu apa langkah awal yang harus kita lakukan supaya Webmap Development Server bisa fleksibel dengan kebutuhan modern API-style? Ya mode akses PHP di Nginx-nya dibuat extensionless. Jadi nanti kalau kita mengakses -- misalnya -- http://192.168.1.23/webservice/points
ya berarti sama saja dengan mengakses http://192.168.1.23/webservice/points.php
.
Langkah-langkahnya adalah sebagai berikut:
[rinjani@nusantara ~]$ sudo systemctl stop php-fpm.service
[rinjani@nusantara ~]$ sudo systemctl stop nginx.service
[rinjani@nusantara ~]$ sudo nano /etc/nginx/nginx.conf
dan ubah blok:
...
location / {
}
location ~ [^/]\.php(/|$) {
try_files $uri =404;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_param HTTP_PROXY "";
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
}
...
menjadi:
...
location / {
try_files $uri $uri.html $uri/ @extensionless-php;
}
location ~ [^/]\.php(/|$) {
try_files $uri =404;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_param HTTP_PROXY "";
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
}
location @extensionless-php {
rewrite ^(.*)$ $1.php last;
}
...
Save perubahannya dengan menekan Ctrl+O lalu <Enter> untuk mengkonfirmasi Yes, dan exit dari nano editor dengan menekan Ctrl-X. Lalu aktifkan lagi PHP-FPM dan Nginx-nya:
[rinjani@nusantara ~]$ sudo systemctl start php-fpm.service
[rinjani@nusantara ~]$ sudo systemctl start nginx.service
Untuk lebih lengkapnya, Anda bisa melihat contoh nginx.conf ini.
Kalau pada bagian sebelumnya Anda sudah mencoba membuat PHP test page di URL http://192.168.1.23/phptest.php
, maka coba sekarang Anda buka URL http://192.168.1.23/phptest
(perhatikan: tanpa .php) di browser Anda, maka PHP info page akan tetap muncul, tanpa harus menggunakan .php pada URL-nya (lihat box merah).
Dan akhirnya, kalau sudah beres semua, delete saja file phptest.php
dari root-nya Nginx, supaya sistemnya tetap bersih.
[rinjani@nusantara ~]$ sudo rm -rf /usr/share/nginx/html/phptest.php
Hingga tahap ini, Webmap Development Server Anda sudah dapat berfungsi sebagai database server dan HTTP server yang (juga) mendukung modern API-style. Pada tahap berikutnya, kita akan mengulas reverse-proxy di Nginx. Terima kasih sudah bersabar untuk mengikuti terus tutorial ini!
Instalasi dan konfigurasi sebuah tech-stack adalah sebuah craftmanship -- semakin mendalam Anda menggali bagaimana sebuah komponen bekerja dalam ekosistemnya, in-and-out, maka semakin paham pula Anda terhadap seluruh ketidaksempurnaan yang pernah Anda jumpai dalam hidup.
- Part 1: Post-Installation / OS Configuration
- Part 2: Configuring Apache Tomcat for GeoServer
- Part 3: GeoServer Installation / Configuration
- Part 4: Configuring PostgreSQL and PostGIS
- Part 5: Configuring MySQL Database
- Part 6: Configuring PHP, PHP-FPM and Nginx (this file)
- Part 7: Configuring Nginx as a Reverse-Proxy
- Part 8: Configuring Pure-FTPd