{"id":1265,"date":"2026-05-24T00:49:03","date_gmt":"2026-05-23T17:49:03","guid":{"rendered":"https:\/\/www.jakhoster.com\/blog\/linux-hardening-vps-hosting-nginx-php-fpm\/"},"modified":"2026-05-24T00:49:03","modified_gmt":"2026-05-23T17:49:03","slug":"linux-hardening-vps-hosting-nginx-php-fpm","status":"publish","type":"post","link":"https:\/\/www.jakhoster.com\/blog\/linux-hardening-vps-hosting-nginx-php-fpm\/","title":{"rendered":"Implementasi Linux Hardening untuk VPS Hosting Multidomain dengan NGINX dan PHP-FPM: Studi Kasus Produksi"},"content":{"rendered":"<h2>Memahami Tantangan Hosting Multidomain di Linux<\/h2>\n<p>Dalam lingkungan produksi, terutama ketika mengelola VPS hosting untuk banyak domain, tantangan utama yang sering dihadapi adalah pengelolaan beban server, keamanan, dan performa. Misalnya, dalam sebuah kasus nyata di perusahaan kami, kami menghadapi masalah performa yang signifikan saat traffic meningkat secara tiba-tiba. Setiap domain harus dilayani dengan cepat, sementara juga harus mempertahankan keamanan tinggi dari serangan seperti brute force atau malware. Karena itu, kami memutuskan untuk melakukan hardening Linux pada server yang menjalankan NGINX dan PHP-FPM.<\/p>\n<h2>Pengenalan Arsitektur<\/h2>\n<p>Sebelum kita mulai, mari kita tinjau arsitektur yang akan kita gunakan. Kami menggunakan VPS yang menjalankan Ubuntu 22.04 LTS dengan NGINX sebagai web server dan PHP-FPM untuk memproses skrip PHP. Database menggunakan MariaDB. Kami juga akan menggunakan beberapa alat untuk pemantauan dan keamanan seperti fail2ban dan logwatch.<\/p>\n<h2>Langkah 1: Memperbarui Sistem<\/h2>\n<p>Pertama-tama, pastikan semua paket di sistem Anda diperbarui. Ini adalah langkah penting untuk memastikan bahwa Anda memiliki semua patch keamanan terbaru. Gunakan perintah berikut:<\/p>\n<pre><code>sudo apt update && sudo apt upgrade -y<\/code><\/pre>\n<p>Perintah ini melakukan dua hal: pertamanya, <code>apt update<\/code> meminta informasi terbaru dari repositori, dan keduanya <code>apt upgrade -y<\/code> akan menginstal semua pembaruan yang tersedia tanpa meminta konfirmasi. Menjalankan perintah ini secara teratur akan sangat membantu dalam menjaga keamanan sistem Anda.<\/p>\n<h2>Langkah 2: Mengonfigurasi Firewall dengan UFW<\/h2>\n<p>Setelah sistem diperbarui, kita perlu mengonfigurasi firewall. UFW (Uncomplicated Firewall) adalah alat yang bagus untuk memulai. Pertama, kita perlu mengaktifkan UFW dan menambahkan aturan untuk membolehkan trafik SSH dan HTTP\/HTTPS:<\/p>\n<pre><code>sudo ufw allow OpenSSH\nsudo ufw allow 'Nginx Full'\nsudo ufw enable<\/code><\/pre>\n<p>Perintah di atas pertama-tama mengizinkan koneksi untuk SSH, yang penting untuk mengelola server secara remote, dan aturan kedua untuk mengizinkan trafik menuju NGINX. Setelah itu, kita mengaktifkan firewall dengan <code>ufw enable<\/code>.<\/p>\n<h2>Langkah 3: Menginstal dan Mengonfigurasi Fail2Ban<\/h2>\n<p>Fail2Ban adalah alat yang dapat membantu melindungi server dari serangan brute force dengan memblokir alamat IP yang gagal login setelah sejumlah percobaan tertentu. Instalasi dapat dilakukan dengan:<\/p>\n<pre><code>sudo apt install fail2ban<\/code><\/pre>\n<p>Setelah terinstal, kita perlu mengkonfigurasi fail2ban. Buat salinan konfigurasi default:<\/p>\n<pre><code>sudo cp \/etc\/fail2ban\/jail.conf \/etc\/fail2ban\/jail.local<\/code><\/pre>\n<p>Selanjutnya, buka file konfigurasi tersebut dan ubah pengaturan sesuai kebutuhan Anda:<\/p>\n<pre><code>sudo nano \/etc\/fail2ban\/jail.local<\/code><\/pre>\n<p>Cari bagian [sshd] dan ubah <code>enabled<\/code> menjadi <code>true<\/code>. Anda juga dapat menambahkan pengaturan untuk NGINX:<\/p>\n<pre><code>[nginx-http-auth]\nenabled = true\nport = http,https\nfilter = nginx-http-auth\nlogpath = \/var\/log\/nginx\/error.log\nmaxretry = 3\nbantime = 86400<\/code><\/pre>\n<p>Pengaturan ini akan memblokir alamat IP yang melakukan lebih dari 3 kali percobaan gagal dalam 24 jam.<\/p>\n<h2>Langkah 4: Mengoptimalkan Konfigurasi NGINX<\/h2>\n<p>Setelah keamanan dasar diterapkan, kita perlu memastikan bahwa NGINX dioptimalkan untuk performa. Pertama, kita akan mengubah pengaturan di <code>\/etc\/nginx\/nginx.conf<\/code>:<\/p>\n<pre><code>worker_processes auto;\nworker_connections 1024;<\/code><\/pre>\n<p>Dengan mengatur <code>worker_processes<\/code> ke <code>auto<\/code>, sistem akan menyesuaikan jumlah proses worker sesuai dengan jumlah core CPU tersedia, sementara <code>worker_connections<\/code> menentukan jumlah koneksi per proses worker.<\/p>\n<p>Kemudian, tambahkan gzip compression untuk mempercepat pengiriman konten:<\/p>\n<pre><code>gzip on;\ngzip_types text\/plain text\/css application\/json application\/javascript text\/xml application\/xml application\/xml+rss text\/javascript;<\/code><\/pre>\n<p>Dengan mengaktifkan gzip, kita bisa mengurangi ukuran data yang dikirim ke klien, sehingga mempercepat waktu loading.<\/p>\n<h2>Langkah 5: Mengatur PHP-FPM untuk Performa Optimal<\/h2>\n<p>Berikutnya, kita akan mengoptimalkan pengaturan PHP-FPM. Buka file konfigurasi PHP-FPM:<\/p>\n<pre><code>sudo nano \/etc\/php\/7.4\/fpm\/pool.d\/www.conf<\/code><\/pre>\n<p>Ubah pengaturan berikut:<\/p>\n<pre><code>pm = dynamic\npm.max_children = 50\npm.start_servers = 5\npm.min_spare_servers = 5\npm.max_spare_servers = 10<\/code><\/pre>\n<p>Pengaturan ini mengizinkan PHP-FPM untuk mengelola proses PHP dengan lebih efisien berdasarkan traffic yang meningkat. Anda dapat menyesuaikan pengaturan <code>max_children<\/code> berdasarkan sumber daya server Anda.<\/p>\n<h2>Langkah 6: Memantau Log dengan Journalctl dan Logwatch<\/h2>\n<p>Pemantauan log sangat penting dalam menjaga kesehatan server. Gunakan <code>journalctl<\/code> untuk melihat log sistem dan NGINX:<\/p>\n<pre><code>journalctl -u nginx.service<\/code><\/pre>\n<p>Selain itu, Anda dapat menggunakan Logwatch untuk mendapatkan ringkasan harian dari aktivitas server:<\/p>\n<pre><code>sudo apt install logwatch<\/code><\/pre>\n<p>Setelah instalasi, Anda dapat menjalankan Logwatch dengan:<\/p>\n<pre><code>logwatch --detail high --mailto your-email@example.com --range yesterday<\/code><\/pre>\n<p>Ini akan mengirimkan laporan via email dengan detail tinggi tentang aktivitas server kemarin.<\/p>\n<h2>Langkah 7: Implementasi Backup dan Restore<\/h2>\n<p>Kami tidak dapat membahas keamanan tanpa menyentuh backup. Skenario terburuk adalah ketika kita kehilangan data. Gunakan rsync untuk melakukan backup:<\/p>\n<pre><code>rsync -av --delete \/var\/www\/html \/path\/to\/backup\/<\/code><\/pre>\n<p>Perintah ini akan mengcopy semua file dari direktori web dan melakukan sinkronisasi dengan lokasi backup. Opsi <code>--delete<\/code> memastikan bahwa file yang dihapus di sumber juga dihapus di backup.<\/p>\n<h2>Langkah 8: Tips Terakhir dan Kesalahan Umum<\/h2>\n<p>Saat mengonfigurasi server, ada beberapa kesalahan umum yang perlu dihindari:<\/p>\n<ul>\n<li>Melebih-lebihkan batas max_children di PHP-FPM, yang dapat menyebabkan kehabisan memori.<\/li>\n<li>Melupakan untuk mengamankan file konfigurasi seperti <code>config.php<\/code> dengan izin yang tepat.<\/li>\n<li>Tidak memantau log secara teratur, yang dapat menyebabkan ketidakpastian di kemudian hari.<\/li>\n<\/ul>\n<p>Secara umum, implementasi keamanan hardening ini adalah langkah penting untuk memastikan server produksi yang aman dan optimal. Dengan mengikuti langkah-langkah di atas, Anda meningkatkan ketahanan sistem dari serangan dan memastikan bahwa semua domain di server dapat berfungsi dengan baik meski di tengah lalu lintas yang padat.<\/p>\n<p class=\"mt-6 contextual-link\">Untuk memperdalam pemahaman Anda mengenai pengaturan server yang efektif, kami sarankan Anda membaca artikel &#8220;<a href=\"https:\/\/www.jakhoster.com\/blog\/linux-business-server-infrastruktur-website-modern\/\" target=\"_blank\" rel=\"noopener\">Linux Server untuk Infrastruktur Website Modern<\/a>&#8220;.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pelajari langkah demi langkah implementasi keamanan Linux untuk VPS hosting multidomain menggunakan NGINX dan PHP-FPM. Temukan praktik terbaik termasuk perlindungan dari brute force, pemantauan log, dan optimisasi performa.<\/p>\n","protected":false},"author":2,"featured_media":1264,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[46],"tags":[],"class_list":["post-1265","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux-server"],"_links":{"self":[{"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/posts\/1265","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/comments?post=1265"}],"version-history":[{"count":0,"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/posts\/1265\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/media\/1264"}],"wp:attachment":[{"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/media?parent=1265"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/categories?post=1265"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jakhoster.com\/blog\/wp-json\/wp\/v2\/tags?post=1265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}