Lompat ke konten

Ihsan Praditya Web

Berani Hapus XAMPP? Manual Memasang Apache, Mariadb, PHP

Programmer backend tentu membutuhkan web server lokal untuk testing. Sebut saja XAMPP, Nginx, Laragon (Laravel), dan lain-lain. Tanpa sadar programmer jadi ketergantungan dengan aplikasi tersebut. Tantangannya adalah jika ada kebutuhan yang mengharuskan kustom seperti versi database tertentu dengan web server tertentu. Install XAMPP ditambah aplikasi lain secara satu-satu? Haha, tentu saja tidak. Itu namanya pemborosan. Sebagai programmer, pasanglah aplikasi yang anda butuhkan.

Pada artikel ini, saya akan menyajikan bagaimana cara memasang PHP, database, dan web server secara terpisah, tidak tergabung dalam paket XAMPP. Ini adalah tantangan sebagai seorang pemula dalam dunia pemrograman. Pastikan anda menghapus XAMPP setelah selesai membaca artikel ini. Jika anda pengguna Linux, seharusnya anda tidak membaca artikel ini, haha.

Install PHP

Untuk pengguna MacOS bisa melalui Brew:

brew install php

untuk memasang versi terbaru, jika ingin memasang versi lainnya tambahkan prefix @x.x:

brew install php@8.1

Untuk pengguna Windows, berikut tatacaranya: Pertama, silakan menuju halaman resmi dari PHP: https://www.php.net/.

Halaman resmi PHP Halaman resmi PHP

Lanjutkan ke halaman Download.

Halaman download PHP Halaman download PHP

Bingung yah? Saya juga dulu begitu. Tapi itu kelihatan kan? Klik tautan “Windows downloads”.

Halaman download PHP untuk Windows Halaman download PHP untuk Windows

Tambah bingung? Kasian. Kan programmer. Hehe. Ada pilihan Thread Safe (TS) dan Non Thread Safe (NTS) pilih mana? Pilih yang NTS, karena kita akan menggunakan web server Apache.

Pilih NTS yang Zip. Jangan pilih yang source code, pusing nanti. Sesuaikan dengan arsitektur yang anda inginkan. Saran saya, pilih yang x64.

Setelah terunduh, ekstrak dan taruh pada folder C:\Program Files\php. Tambahkan direktori tersebut ke Environment Path. Ini penting, jika tidak maka PHP tidak akan jalan atau anda perlu menulis perintah panjang setiap kali mengeksekusi sebuah kode:

'C:\Program Files\php\php.exe' –version

Tidak akan muncul shortcut apapun di desktop Windows, karena fungsi dari php.exe di atas bukan sebagai aplikasi yang dieksekusi dengan sebuah klik. Ayolah! Anda programmer kan?

Install Database

Kita akan memasang MariaDB, mirip seperti MySQL yang biasa anda pakai karena memang dibuat oleh pembuat MySQL. Cerita pembuatannya asik untuk dibaca.

Untuk pengguna MacOS, silakan jalankan perintah berikut:

brew install mariadb

Untuk pengguna Windows, silakan menuju halaman resminya: https://mariadb.org/

Halaman resmi MariaDB Community Halaman resmi MariaDB Community

Jelas yah pilih menu Download.

Halaman resmi download MariaDB community Halaman resmi download MariaDB community

Pilih Windows pada Operating System, nanti muncul beberapa opsi. Pilih arsitektur x86_64, tipe MSI Package, mirror terdekat, saran saya mirror di Singapura.

Pilihan Download server MariaDB Pilihan Download server MariaDB

Pilih versi server terbaru yang tidak ada embel-embelnya.

Untuk folder instalasinya, tempatkan di dalam C:\Program Files\mariadb. Kemudian tambahkan juga ke Environment Path.

Setelah instalasi, anda akan memiliki shortcut aplikasi HeidiSQL di Desktop. Aplikasi itu digunakan layaknya phpMyAdmin sebagai panel pengaturan server database.

Install Apache/HTTPD

Ini adalah instalasi terakhir yang perlu anda lakukan. Sebenarnya untuk menjalankan server biasa, anda hanya perlu memasang Apache, tanpa PHP dan database. Dengan XAMPP pun anda hanya perlu menyalakan Apache jika yang dibutuhkan hanya web server lokal.

Untuk pengguna MacOS silakan jalankan perintah berikut:

brew install httpd

Silakan menuju halaman resminya: https://httpd.apache.org/

Halaman resmi Apache Web Server Halaman resmi Apache Web Server

Pilih menu Download! yang ada di samping kiri.

Halaman resmi download Apache Web Server Halaman resmi download Apache Web Server

Pilih tautan yang ada tulisan “Windows” -nya.

Halaman download file binary Apache untuk Windows Halaman download file binary Apache untuk Windows

Nah di sini plotwistnya, karena sejak awal tidak ada binary precompiled Apache untuk OS Windows. Pada akhirnya anda diarahkan juga ke XAMPP sebagaimana tertulis di atas, haha.

Tentu saja kita tidak akan menggunakannya kali ini. Pilih tautan “Apache Lounge”.

Halaman download third party Apache untuk Windows Halaman download third party Apache untuk Windows

Pilih file zip sesuai arsitektur yang anda inginkan, win64 untuk 64-bit, win32 untuk 32-bit. Taruh file ekstraknya di dalam C:\Program Files, ganti nama folder menjadi “apache” saja. Jangan lupa, pasangkan juga di Environment Path.

Setelah instalasi, akan ada shortcut dari Apache Lounge di desktop. Aplikasi tersebut bekerja layaknya panel untuk menyalakan server, memantau request, dan sebagainya.

Menyambungkan PHP dan Apache

Windows

Sebagaimana sudah saya sampaikan sebelumnya, anda hanya perlu memasang Apache server untuk dapat menggunakan web server lokal. PHP dan database digunakan untuk pemrograman yang lebih kompleks, yang menggunakan database sebagai mendia penyimpanan sehingga yang kita buat bukan hanya website, melainkan webapp.

Buka pengaturan server Apache di file C:\Program Files\apache\conf\httpd.conf.

Ada beberapa baris yang perlu anda ubah, deklarasikan variabel dengan value yang anda inginkan.

Define SRVROOT “c:/Apache24”

Kode di atas menunjukkan bahwa variabel SRVROOT memiliki value C:\Apache24, jelas saja ini salah karena kita memasang server Apache di C:\Program Files\apache. Sehingga deklarasi yang benar adalah:

Define SRVROOT "c:/Program Files/apache".

Tidak apa menggunakan backslash ()? Yah tidak mengapa, backslash digunakan pada CMD Windows atau PowerShell yang mana tetap memahami slash (/) dalam mengarahkan struktur direktori.

Direktori server bawaan adalah folder htdocs di dalam folder server tersebut. Masalahnya folder Apache berada di dalam C:\Program Files sehingga segala aktifitas di sini membutuhkan akses root. Kalau MacOS ini seperti /var/www. Maka saya sarankan untuk menggunakan direktori lain. Misalnya, My Documents.

Deklarasikan variabel berikut:

Define SRVDIR “C:\Users\nama_user\Documents”

Ganti nama_user dengan nama user yang anda pakai pada sistem anda.

Karena akan menggunakan PHP dalam server Apache, anda perlu memuat module PHP dalam konfigurasi server anda.

Bagaimana cara memuat module PHP ke dalam server Apache? Nah di sinilah logic anda akan meningkat. Biasa dimanjakan dengan XAMPP? Anda akan tahu bagaimana proses di belakang layar XAMPP. Jika kita mendownload PHP TS maka sudah ada module php8apache2_4.dll. Tapi karena kita memakai PHP NTS, module tersebut tidak ada. Kali ini kita membutuhkan module tambahan.

Silakan menuju halaman download Apache Lounge kembali. Gulir layar ke bawah dan download file mod_fcgid dalam bentuk zip.

Saat anda memasang PHP binary yang anda download dari web resminya, anda sudah mendapatkan module

Module fcgid berada di paling bawah pada gambar di atas Module fcgid berada di paling bawah pada gambar di atas

Ekstrak file zip tersebut dan pindahkan file mod_fcgid.so ke dalam folder C:\Program Files\apache\modules\ kemudian tambahkan konfigurasi server berikut:

<IfModule fcgid_module>
   FcgidMaxProcesses 300
   FcgidMaxProcessesPerClass 300
   FcgidOutputBufferSize 65536
   FcgidConnectTimeout 10
   FcgidProcessLifeTime 0
   FcgidMaxRequestsPerProcess 0
   FcgidMinProcessesPerClass 0
   FcgidFixPathinfo 0
   FcgidProcessLifeTime 0
   FcgidZombieScanInterval 20
   FcgidMaxRequestLen 536870912
   FcgidIOTimeout 120
   FcgidTimeScore 3
   FcgidPassHeader Authorization 
   FcgidInitialEnv PHPRC "C:/Program Files/php"
   FcgidInitialEnv PATH "C:/Program Files/php; C:/WINDOWS/system32; C:/WINDOWS; C:/WINDOWS/System32/Wbem;"
   FcgidInitialEnv SystemRoot "C:/Windows"
   FcgidInitialEnv SystemDrive "C:/"
   FcgidInitialEnv TEMP "C:/WINDOWS/TEMP"
   FcgidInitialEnv TMP "C:/WINDOWS/TEMP"
   FcgidInitialEnv windir "C:/WINDOWS"
   <Files ~ "\.php$">
      Options Indexes FollowSymLinks ExecCGI
      AddHandler fcgid-script .php
      FcgidWrapper "C:/Program Files/php/php-cgi.exe" .php
   </Files>
</IfModule> 

Capek? Itu tandanya kemampuan anda meningkat. Pengaturan lainnya saya gabung dalam konfigurasi final yang akan saya sertakan di akhir artikel.

MacOS

Pengaturan server Apache di MacOS tidak jauh berbeda dengan di Windows. Apalagi MacOS yang mana adalah Unix-like OS.

Di MacOS untuk menjalankan server dan database, jalankan perintah berikut:

brew services start httpd
brew services start mariadb

Untuk mengecek apakah server dan database lokal sudah berfungsi dengan benar, jalankan perintah berikut:

brew services list

Secara default, direktori server akan berada di /usr/local/var/www yang mana tidak mudah diakses dengan GUI. Saya biasanya memindahkannya ke direktori yang lebih mudah diakses GUI seperti ~/Documents atau membuat direktori baru: ~/Sites. Cari baris pengaturan DocumentRoot dan rubah menjadi seperti berikut:

DocumentRoot "~/Documents/Sites"
<Directory "~/Documents/Sites">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

Karena akan menggunakan php, kita perlu memuat modul PHP di dalam konfigurasi Apache. Ketika kita menginstall PHP melalui brew, kita memasang PHP versi NTS (Non Thread Safe), file modul PHP untuk Apache terletak pada /usr/local/opt/php/lib/httpd/modules/libphp.so. Maka untuk memuat modul tersebut, tambahkan baris berikut:

LoadModule php_module /usr/local/opt/php/lib/httpd/modules/libphp.so

PHP belum dapat dijalankan. Karena Apache hanya memuat PHP dan tidak tahu file apa saja yang dideteksi sebagai file PHP sehingga modul akan dijalankan. Tambahkan beberapa pengaturan berikut:

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

Dengan ini, begitu Apache menemukan file berekstensi .php, ia akan memproses modul PHP yang telah dimuat sebelumnya. Sampai di sini server belum bisa menjalankan file .php, karena file tersebut belum dimiliki oleh user dengan grup yang tertulis dalam konfigurasi Apache. Hal ini bisa terjadi karena OS yang Unix-like memiliki pengaturan user yang ketat dan lebih rapih dibandingkan OS Windows. Ganti baris berikut:

User _www
Group _www
Menjadi
User nama_user
Group grup_user

Pengaturan lengkapnya akan saya sertakan di akhir artikel.

Menjalankan PHP pada Apache

Setelah PHP dan Apache terhubung, coba jalankan server anda

Windows

Buka aplikasi Apache Lounge yang ada di Desktop, jalankan server.

MacOS

Jalankan perintah berikut:

brew services start httpd

Untuk berhenti jalankan perintah berikut:

brew services stop httpd

Untuk restart, jalankan perintah berikut:

brew services restart httpd

Kemudian, silakan uji dengan file index.php berikut:

<?php phpinfo(); ?>

Taruh file berikut pada direktori yang telah anda jadikan sebagai DocumentRoot dari server Apache anda kemudian akses http://localhost:80 atau http://127.0.0.1:80/.

phpinfo

Apache akan memuat modul PHP dan menjalan perintah phpinfo() yang menghasilkan informasi mengenai konfigurasi PHP pada sistem yang sedang dijalankan. Jika anda belum mendapatkan tampilan seperti di atas silakan tinggalkan komentar di bawah dengan menyertakan kendala apa saja seperti tidak menemukan modul PHP dan sebagainya.

Konfigurasi Final Apache

Windows

Define SRVROOT "C:/Program Files/apache"
Define SRVDIR "C:/Users/nama_user/Documents"
ServerRoot "${SRVROOT}"
Listen 80
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
LoadModule allowmethods_module modules/mod_allowmethods.so
LoadModule asis_module modules/mod_asis.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
LoadModule fcgid_module modules/mod_fcgid.so 
LoadModule include_module modules/mod_include.so
LoadModule isapi_module modules/mod_isapi.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
<IfModule fcgid_module>
   FcgidMaxProcesses 300
   FcgidMaxProcessesPerClass 300
   FcgidOutputBufferSize 65536
   FcgidConnectTimeout 10
   FcgidProcessLifeTime 0
   FcgidMaxRequestsPerProcess 0
   FcgidMinProcessesPerClass 0
   FcgidFixPathinfo 0
   FcgidProcessLifeTime 0
   FcgidZombieScanInterval 20
   FcgidMaxRequestLen 536870912
   FcgidIOTimeout 120
   FcgidTimeScore 3
   FcgidPassHeader Authorization 
   FcgidInitialEnv PHPRC "C:/Program Files/php"
   FcgidInitialEnv PATH "C:/Program Files/php; C:/WINDOWS/system32; C:/WINDOWS; C:/WINDOWS/System32/Wbem;"
   FcgidInitialEnv SystemRoot "C:/Windows"
   FcgidInitialEnv SystemDrive "C:/"
   FcgidInitialEnv TEMP "C:/WINDOWS/TEMP"
   FcgidInitialEnv TMP "C:/WINDOWS/TEMP"
   FcgidInitialEnv windir "C:/WINDOWS"
   <Files ~ "\.php$">
      Options Indexes FollowSymLinks ExecCGI
      AddHandler fcgid-script .php
      FcgidWrapper "C:/Program Files/php/php-cgi.exe" .php
   </Files>
</IfModule> 
<IfModule unixd_module>
    User daemon
    Group daemon
</IfModule>
ServerAdmin email_anda@gmail.com
<Directory />
    AllowOverride none
    Require all denied
</Directory>
DocumentRoot "${SRVDIR}"
<Directory "${SRVDIR}">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>
<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>
<Files ".ht*">
    Require all denied
</Files>
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>
ErrorLog "logs/error.log"
LogLevel warn
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access.log" common
</IfModule>
<IfModule alias_module>
    ScriptAlias /cgi-bin/ "${SRVROOT}/cgi-bin/"
</IfModule>
<Directory "${SRVROOT}/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>
<IfModule headers_module>
    RequestHeader unset Proxy early
</IfModule>
<IfModule mime_module>
    TypesConfig conf/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType application/x-httpd-php .php
    AddType text/html .php
</IfModule>
<IfModule proxy_html_module>
    Include conf/extra/proxy-html.conf
</IfModule>
<IfModule ssl_module>
    SSLRandomSeed startup builtin
    SSLRandomSeed connect builtin
</IfModule>

MacOS

ServerRoot "/usr/local/opt/httpd"
Listen 8080
LoadModule php_module /usr/local/opt/php/lib/httpd/modules/libphp.so
LoadModule mpm_prefork_module lib/httpd/modules/mod_mpm_prefork.so
LoadModule authn_file_module lib/httpd/modules/mod_authn_file.so
LoadModule authn_core_module lib/httpd/modules/mod_authn_core.so
LoadModule authz_host_module lib/httpd/modules/mod_authz_host.so
LoadModule authz_groupfile_module lib/httpd/modules/mod_authz_groupfile.so
LoadModule authz_user_module lib/httpd/modules/mod_authz_user.so
LoadModule authz_core_module lib/httpd/modules/mod_authz_core.so
LoadModule access_compat_module lib/httpd/modules/mod_access_compat.so
LoadModule auth_basic_module lib/httpd/modules/mod_auth_basic.so
LoadModule reqtimeout_module lib/httpd/modules/mod_reqtimeout.so
LoadModule filter_module lib/httpd/modules/mod_filter.so
LoadModule mime_module lib/httpd/modules/mod_mime.so
LoadModule log_config_module lib/httpd/modules/mod_log_config.so
LoadModule env_module lib/httpd/modules/mod_env.so
LoadModule headers_module lib/httpd/modules/mod_headers.so
LoadModule setenvif_module lib/httpd/modules/mod_setenvif.so
LoadModule version_module lib/httpd/modules/mod_version.so
LoadModule unixd_module lib/httpd/modules/mod_unixd.so
LoadModule status_module lib/httpd/modules/mod_status.so
LoadModule autoindex_module lib/httpd/modules/mod_autoindex.so
<IfModule !mpm_prefork_module>
</IfModule>
<IfModule mpm_prefork_module>
</IfModule>
LoadModule dir_module lib/httpd/modules/mod_dir.so
LoadModule alias_module lib/httpd/modules/mod_alias.so
<IfModule unixd_module>
User nama_user
Group grup_user
</IfModule>
ServerAdmin you@example.com
<Directory />
    AllowOverride none
    Require all denied
</Directory>
DocumentRoot "C:/Program Files/Users/nama-user/Documents"
<Directory "C:/Program Files/Users/nama-user/Documents">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>
<Files ".ht*">
    Require all denied
</Files>
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>
ErrorLog "/usr/local/var/log/httpd/error_log"
LogLevel warn
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "/usr/local/var/log/httpd/access_log" common
</IfModule>
<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/usr/local/var/www/cgi-bin/"
</IfModule>
<Directory "/usr/local/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>
<IfModule headers_module>
    RequestHeader unset Proxy early
</IfModule>
<IfModule mime_module>
    TypesConfig /usr/local/etc/httpd/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
</IfModule>
<IfModule proxy_html_module>
    Include /usr/local/etc/httpd/extra/proxy-html.conf
</IfModule>
<IfModule ssl_module>
    SSLRandomSeed startup builtin
    SSLRandomSeed connect builtin
</IfModule>

Ini adalah usaha anda memahami struktur dari sebuah server yang biasa disediakan layanan hosting. Dengan ini diharapkan anda bisa melakukan debugging seandainya terjadi eror. Mengingat hal-hal sederhana sebenarnya bisa kita lakukan jika kita mengetahuinya, tanpa perlu menyewa jasa berbayar. Terima kasih.