Tidak sempat menerapkannya sendiri? Kami bisa mengerjakannya untuk Anda — sepenuhnya remote.
Menentukan saran mode process manager
GB
Menentukan innodb_buffer_pool_size
httpd + php-fpm + mysqld + tomcat dalam satu mesin — 32 GB RAM, 8 vCPU
Apache 200 → PHP-FPM 100 → MySQL 200
Setiap tahap tidak boleh lebih kecil dari tahap sebelumnya. Rem ditahan di Apache, bukan di database.Backup, backup dan SELALU BACKUP file aslinya dulu, salin isi di bawah, validasi sintaks, baru restart.
Apache — kapasitas & keep-alive
/etc/httpd/conf.d/mpm-event.conf# Dihasilkan oleh Kalkulator Tuning Server DEKATE (dekate.id/tuning-server)
# Peran: Server tunggal | 32 GB RAM | 8 vCPU | target 100 pengguna bersamaan
#
# MaxRequestWorkers WAJIB = ServerLimit x ThreadsPerChild.
# Kalau tidak, Apache diam-diam memakai angka yang lebih kecil dan menulis
# peringatan AH00515 setiap kali start.
<IfModule mpm_event_module>
StartServers 4
ServerLimit 8
ThreadsPerChild 25
MaxRequestWorkers 200
MinSpareThreads 25
MaxSpareThreads 75
MaxConnectionsPerChild 10000
</IfModule>
Timeout 60
KeepAlive On
KeepAliveTimeout 5
MaxKeepAliveRequests 100
ServerTokens Prod
ServerSignature Offhttpd -t && systemctl reload httpdPHP-FPM — jumlah worker & sesi
/etc/php-fpm.d/www.conf; Dihasilkan oleh Kalkulator Tuning Server DEKATE (dekate.id/tuning-server) ; Peran: Server tunggal | 32 GB RAM | 8 vCPU | target 100 pengguna bersamaan ; ; Tambahkan/ubah baris berikut di dalam blok [www]. ; Perhatikan: JANGAN ada titik koma di akhir nilai — "30s;" membuat ; nilainya diabaikan tanpa pesan error apa pun. pm = ondemand pm.max_children = 100 pm.process_idle_timeout = 30s pm.max_requests = 500 ; Catatan: pada mode ondemand, pm.start_servers / min_spare_servers / ; max_spare_servers DIABAIKAN sepenuhnya. pm.status_path = /php-fpm-status ping.path = /php-fpm-ping ; Permintaan lebih lama dari 10 detik dicatat lengkap dengan baris kodenya. ; Ini alat diagnosa terpenting yang Anda punya. request_slowlog_timeout = 10s slowlog = /var/log/php-fpm/www-slow.log ; JANGAN pasang request_terminate_timeout di server ini — ; operasi BPJS/INACBG/tagihan yang sah memang berdurasi panjang ; dan akan ikut terbunuh. ; --- Sesi Redis (bagian 9 panduan) --- ; Mengaktifkan ini akan mengeluarkan SEMUA pengguna sekali. Lakukan di jam sepi. php_value[session.save_handler] = redis php_value[session.save_path] = "tcp://127.0.0.1:6379"
php-fpm -t && systemctl reload php-fpmPHP — batas memori & unggah
/etc/php.ini; Dihasilkan oleh Kalkulator Tuning Server DEKATE (dekate.id/tuning-server) ; Peran: Server tunggal | 32 GB RAM | 8 vCPU | target 100 pengguna bersamaan ; ; Ubah baris-baris berikut pada file yang sudah ada (jangan menambah blok baru). memory_limit = 256M ; per permintaan, bukan total max_execution_time = 120 post_max_size = 32M upload_max_filesize = 32M max_input_vars = 5000 ; form SIMGos panjang, bawaan 1000 sering kurang realpath_cache_size = 4M realpath_cache_ttl = 600 expose_php = Off
systemctl reload php-fpmOpcache — wajib nyala
/etc/php.d/10-opcache.ini; Dihasilkan oleh Kalkulator Tuning Server DEKATE (dekate.id/tuning-server) ; Peran: Server tunggal | 32 GB RAM | 8 vCPU | target 100 pengguna bersamaan ; ; Tanpa opcache, PHP menerjemahkan ulang ribuan file SIMGos pada SETIAP ; permintaan. Beda kecepatannya 2-3 kali lipat. zend_extension=opcache opcache.enable=1 opcache.enable_cli=0 opcache.memory_consumption=256 opcache.interned_strings_buffer=16 opcache.max_accelerated_files=20000 opcache.validate_timestamps=1 ; biarkan 1 supaya deploy langsung terbaca opcache.revalidate_freq=2 opcache.save_comments=1 ; WAJIB 1 — Laminas membaca anotasi opcache.fast_shutdown=1
systemctl reload php-fpmMySQL — memori, koneksi, rem laporan
/etc/my.cnf.d/simgos.cnf# Dihasilkan oleh Kalkulator Tuning Server DEKATE (dekate.id/tuning-server) # Peran: Server tunggal | 32 GB RAM | 8 vCPU | target 100 pengguna bersamaan # # PERIKSA DULU: grep -n "includedir" /etc/my.cnf # MySQL versi resmi tidak selalu punya "!includedir /etc/my.cnf.d/". # Tanpa baris itu, file ini diabaikan diam-diam. # # PERIKSA JUGA: grep -n "max_connections" /etc/my.cnf /etc/my.cnf.d/*.cnf # Kalau sebuah setelan muncul dua kali, yang berlaku adalah yang TERAKHIR. [mysqld] # === Memori === innodb_buffer_pool_size = 10G innodb_buffer_pool_instances = 8 innodb_redo_log_capacity = 2G innodb_log_buffer_size = 64M # === Disk I/O (SSD) === innodb_flush_method = O_DIRECT innodb_flush_log_at_trx_commit = 2 # 2 = lebih cepat. Transaksi <=1 detik terakhir bisa hilang saat listrik mati mendadak (aman karena ada UPS). innodb_io_capacity = 1000 innodb_io_capacity_max = 2000 innodb_flush_neighbors = 0 # === Koneksi === # Harus lebih besar dari total pm.max_children semua server aplikasi, # ditambah cadangan untuk cron integrasi (SATUSEHAT, BPJS, aplicares, RSOnline, SITB). max_connections = 200 thread_cache_size = 32 table_open_cache = 4000 table_definition_cache = 2000 skip_name_resolve = 1 # semua grant HARUS memakai IP, bukan hostname # === Buffer per sesi (kecil! nilainya dikalikan jumlah koneksi) === sort_buffer_size = 2M join_buffer_size = 2M read_buffer_size = 256K read_rnd_buffer_size = 512K # === Tabel sementara (laporan SIMGos berat) === tmp_table_size = 256M max_heap_table_size = 256M # === Rem laporan liar === # Hanya berlaku untuk SELECT, jadi aman untuk transaksi tulis. # Tanpa ini, satu laporan yang tertahan bisa berjalan belasan jam dan # menyandera backup malam. max_execution_time = 120000 # === Keamanan & visibilitas === max_allowed_packet = 64M slow_query_log = 1 slow_query_log_file = /var/log/mysql-slow.log long_query_time = 2 log_queries_not_using_indexes = OFF # JANGAN ON — slow log akan tercemar sampai belasan GB log_slow_admin_statements = OFF performance_schema = ON # === Warm-up setelah restart === innodb_buffer_pool_dump_at_shutdown = 1 innodb_buffer_pool_load_at_startup = 1
mysqld --validate-config && systemctl restart mysqldMySQL — batas jumlah file terbuka
/etc/systemd/system/mysqld.service.d/limits.conf# MySQL butuh sekitar max_connections + table_open_cache x 2 file terbuka. # Bawaan sering hanya 10000 — kurang untuk max_connections = 200. # Berlaku setelah restart mysqld berikutnya. [Service] LimitNOFILE=32000
mkdir -p /etc/systemd/system/mysqld.service.d && systemctl daemon-reload && systemctl restart mysqldTomcat — heap, G1GC, rem Jasper
/opt/tomcat/bin/setenv.sh# Dihasilkan oleh Kalkulator Tuning Server DEKATE (dekate.id/tuning-server) # Peran: Server tunggal | 32 GB RAM | 8 vCPU | target 100 pengguna bersamaan # # Kalau sudah ada baris -Djava.rmi.server.hostname=... untuk JMX, JANGAN diubah. CATALINA_OPTS="$CATALINA_OPTS -Xms1G -Xmx2G" # G1GC = petugas kebersihan bertim. SerialGC (bawaan lama) membuat Tomcat # tampak "hang" padahal sedang tercekik garbage collection. CATALINA_OPTS="$CATALINA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=200" CATALINA_OPTS="$CATALINA_OPTS -XX:MaxMetaspaceSize=384m" CATALINA_OPTS="$CATALINA_OPTS -Djava.awt.headless=true" # Kalau kehabisan memori: tinggalkan bukti, lalu MATI BERSIH supaya systemd # bisa menghidupkan ulang otomatis. Tanpa ini Tomcat menggantung selamanya. CATALINA_OPTS="$CATALINA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat/logs" CATALINA_OPTS="$CATALINA_OPTS -XX:+ExitOnOutOfMemoryError" # Rem darurat JasperReports. CATALINA_OPTS="$CATALINA_OPTS -Dnet.sf.jasperreports.governor.max.pages=5000" CATALINA_OPTS="$CATALINA_OPTS -Dnet.sf.jasperreports.governor.timeout=300000" export CATALINA_OPTS
systemctl restart tomcatTomcat — supaya bisa pulih sendiri
/etc/systemd/system/tomcat.service# Type=forking TANPA PIDFile membuat systemd kehilangan jejak proses, # sehingga Restart=on-failure tidak pernah berfungsi. Ini pernah membuat # auto-recovery "ada di config tapi tidak pernah jalan" selama berbulan-bulan. # # UMASK=0002 membuat Jasper menulis PDF yang bisa dibaca grup — mengurangi # ketergantungan pada sudo chmod. [Service] Type=forking PIDFile=/opt/tomcat/temp/tomcat.pid Restart=on-failure RestartSec=10 UMASK=0002
systemctl daemon-reload && systemctl restart tomcatTomcat — batasi laporan bersamaan
/opt/tomcat/conf/server.xml<!-- Ganti blok <Connector port="8080" ...> yang sudah ada dengan ini.
Bawaan Tomcat ~200 thread: 200 laporan bersamaan pasti menghabiskan heap.
Mengantre jauh lebih baik daripada semuanya gagal karena kehabisan memori. -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="20"
acceptCount="40"
redirectPort="8443" />systemctl restart tomcatSudo — syarat mutlak agar cetak laporan jalan
/etc/sudoers.d/simgos# SIMGos mensyaratkan baris ini. Tanpanya SEMUA cetak laporan gagal dengan # pesan "Failed to load PDF document", sementara HTTP status tetap 200 dan # Content-Length 0 — sehingga lolos dari pemantauan berbasis status code. # # Sering hilang saat migrasi/instal ulang OS, karena /etc/sudoers memang # sengaja tidak disalin antar versi distro. # # Pasang sebagai drop-in, JANGAN edit /etc/sudoers langsung: # echo 'apache ALL=(ALL) NOPASSWD: ALL' > /tmp/s && visudo -cf /tmp/s \ # && install -m 0440 -o root -g root /tmp/s /etc/sudoers.d/simgos apache ALL=(ALL) NOPASSWD: ALL
echo 'apache ALL=(ALL) NOPASSWD: ALL' > /tmp/s && visudo -cf /tmp/s && install -m 0440 -o root -g root /tmp/s /etc/sudoers.d/simgosRedis — penyimpan sesi
/etc/redis/redis.conf# Tambahkan di AKHIR file. Hanya localhost — jangan pernah dibuka ke jaringan. # # PENTING: AlmaLinux/RHEL 9 mengirim SEMUA baris "save" dalam keadaan # dikomentari. Tanpa baris save, setiap restart Redis menghapus seluruh # session dan semua pengguna ter-logout. bind 127.0.0.1 -::1 protected-mode yes maxmemory 512mb maxmemory-policy allkeys-lru save 3600 1 save 300 100 save 60 10000
dnf install -y redis php-pecl-redis5 && systemctl enable --now redis && redis-cli pingKernel — antrean koneksi
/etc/sysctl.d/99-simgos.conf# Dihasilkan oleh Kalkulator Tuning Server DEKATE (dekate.id/tuning-server) # Peran: Server tunggal | 32 GB RAM | 8 vCPU | target 100 pengguna bersamaan net.core.somaxconn = 4096 net.ipv4.tcp_tw_reuse = 1 net.ipv4.ip_local_port_range = 10000 65535 vm.swappiness = 10
sysctl -p /etc/sysctl.d/99-simgos.confBackup — jangan tersandera oleh laporan
autobackup.sh (tambahan pada perintah xtrabackup)# Tambahkan tiga baris ini pada perintah xtrabackup yang sudah ada. # # Artinya: kalau ada query yang menghalangi lebih dari 2 menit, BUNUH query # itu dan lanjutkan backup. Lebih baik satu laporan gagal dicetak daripada # tidak ada backup semalam. # # Tanpa ini, satu stored procedure laporan yang tertahan (pernah berjalan # 10-14 jam) menyandera tahap FLUSH TABLES, backup menggantung berjam-jam, # lalu restart terjadwal menggagalkannya sama sekali. xtrabackup --backup \ --ftwrl-wait-timeout=120 \ --kill-long-queries-timeout=120 \ --kill-long-query-type=all \ ...
edit script backup Anda, lalu uji satu kali secara manualScript penerapan (backup → validasi → restart)
Urutan restart yang aman untuk server ini#!/usr/bin/env bash
# Urutan penerapan yang aman — Server tunggal (32 GB / 8 vCPU)
# Dihasilkan oleh Kalkulator Tuning Server DEKATE (dekate.id/tuning-server)
set -euo pipefail
# 1. Backup dulu. Kalau belum ada backup, jangan mulai.
for f in /etc/httpd/conf/httpd.conf /etc/php-fpm.d/www.conf /etc/php.ini /etc/php.d/10-opcache.ini /etc/my.cnf /opt/tomcat/bin/setenv.sh; do
[ -f "$f" ] && cp -a "$f" "$f.bak-$(date +%Y%m%d-%H%M%S)"
done
mkdir -p /root/tuning-backup
tar -czf "/root/tuning-backup/pre-$(date +%Y%m%d-%H%M%S).tgz" /etc/php-fpm.d/ /etc/php.ini /etc/php.d/ \
/etc/my.cnf /etc/my.cnf.d/ /etc/httpd/conf/ /etc/httpd/conf.d/ 2>/dev/null || true
# 2. Salin file konfigurasi dari kalkulator ke tempatnya masing-masing.
# (lakukan manual, lalu jalankan lagi script ini mulai langkah 3)
# 3. Validasi sintaks SEBELUM menyentuh service apa pun.
httpd -t
php-fpm -t
mysqld --validate-config
# 4. Restart dari belakang ke depan.
systemctl restart mysqld
systemctl restart php-fpm
systemctl reload httpd
systemctl restart tomcat
# 5. Verifikasi.
systemctl is-active mysqld php-fpm httpd tomcat
free -h
grep -c AH00515 /var/log/httpd/error_log # harus 0
pgrep -c php-fpm
php-fpm -m | grep redis # harus muncul, kalau kosong login akan gagal
echo "Selesai. Backup ada di /root/tuning-backup/pre-$(date +%Y%m%d-%H%M%S).tgz"Semua peringatan di bawah berasal dari pengalaman & kejadian nyata di server rumah sakit / klinik — bukan teori.
Panduan lengkapnya menjelaskan tiap setelan dalam bahasa sehari-hari, lengkap dengan kamus istilah, cara mengukur beban server, 26 jebakan yang pernah menjatuhkan sistem produksi, dan langkah diagnosa dari gejala ke penyebab.
Kalkulator dan panduannya kami susun dari pengalaman menangani server rumah sakit dan klinik sungguhan. Tidak ada iklan, tidak berbayar, dan tidak perlu mendaftar. Kalau ini menghemat waktu Anda, secangkir kopi sangat berarti untuk menjaga alat ini tetap diperbarui.
Tautan terbuka di tab baru. Halaman ini tidak memuat apa pun dari kedua layanan tersebut.Membangun sistem kesehatan digital yang aman, terukur, dan sesuai standar untuk institusi kesehatan Indonesia.
© 2026 DEKATE. All rights reserved.