2.5 Pembangunan Aplikasi SPBE
- Tips Pengelolaan Aplikasi Server
- Buat User Root di Ubuntu
- Ekstensi PHP yang perlu diinstall
- ±800 Koneksi Simultan Pengguna
- Cara kirim data dari /var/log/apache2/error.log ke Database
- Monitoring Penggunaan CPU Server
- Cek error log Apache2
- Fix Severity: 8192 Message: Creation of dynamic property CI_URI::$config is deprecated CodeIgniter
- Cara mengembalikan tema wordpress kembali semula karena tema yang baru diaktifkan error
- Perintah CLI untuk ekspor database
- Perintah CLI untuk import database
- Perintah untuk transfer file dan folder antar server
- Query Menampilan Unit Kerja yang Pegawainya Cuti
- Query untuk menampilkan hasil database mysql
- Cara merubah events pada perubahan qrcode presensi per 1 jam:
- Gagal Update Data Umum pada OpenDK Kecamatan
- Query Hapus isi data tabel dalam database menggunakan Terminal
- Wordpress
Tips Pengelolaan Aplikasi Server
Berisikan Tips yang sering lupa dalam pengelolaan aplikasi penunjang server
Buat User Root di Ubuntu
- Buat Pengguna Baru :
sudo adduser kominfox
- Tambahkan Pengguna ke Grup Sudo:
sudo usermod -aG sudo kominfox
- Cek Akses sebagai Root:
groups kominfox
Ekstensi PHP yang perlu diinstall
PHP 8.3
php8.3-mysql
php8.3-gd
php8.3-xml
php8.3-redis
php8.3-intl
php8.3-mbstring
php8.3-curl
php8.3-phpdbg
php8.3-fpm
php8.3-cli
php8.3-cgi
libphp8.3-embed
libapache2-mod-php8.3
±800 Koneksi Simultan Pengguna
Konfigurasi ini untuk kasus 700 koneksi pengguna bersamaan pada suatu waktu tertentu. Konfig ini telah diterapkan pada presensi online dan berjalan efektif untuk lebih dari 3500 pengguna.
Alih-alih menggunakan modul mpm_prefork, admin menggunakan modul mpm_event yang jauh lebih efektif menangani koneksi non-blok yang lebih efisien.
1. Nonaktifkan Modul PHP Apache:
a2dismod php8.2
2. Nonaktifkan mpm_prefork dan Aktifkan mpm_event:
a2dismod mpm_prefork
a2enmod mpm_event
systemctl restart apache2
3. Konfigurasi mpm_event di /etc/apache2/mods-available/mpm_event.conf
<IfModule mpm_event_module>
StartServers 5
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 800
MaxConnectionsPerChild 0
ServerLimit 35
</IfModule>
4. Konfigurasi PHP-FPM www.conf pada /etc/php/8.2/fpm/pool.d/www.conf
catatan : ini adalah koneksi untuk website. jika membebani cpu server mesti dikurangi. terutama pada pm.max_requests dan pm.max_children
[www]
user = www-data
group = www-data
listen = /run/php/php8.3-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 100
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.process_idle_timeout = 10s
pm.max_requests = 500
request_terminate_timeout = 60s
5. Restart Apache dan PHP-FPM:
systemctl restart php8.2-fpm
systemctl restart apache2
catatan tambahan:
- jika terjadi permasalahan web tidak bisa dibuka. coba non aktifkan modul mpm_event dan aktifkan ke mpm_prefork. setelah normal baru kemudian kembalikan ke mpm_event.
- jika ada pid yang belum tercover sehingga mpm_event penuh, maka lakukan stop apache lalu hapus pid apache pada /var/run/apache/
Permasalahan proses anak terjebak dalam apache
Cek isi proses anak:
ps aux | grep apache
bersihkan proses anak:
killall -9 apache2
pkill -9 apache2
pastikan jumlah proses anak yang berjalan normal, jika masih banyak yang terjebak ulangi terus hingga jumlah normal
Cara kirim data dari /var/log/apache2/error.log ke Database
Perintah untuk Manual:
php artisan read:apachelog
Perintah untuk Live:
php artisan read:apachelog --live
Monitoring Penggunaan CPU Server
1. Monitoring dilakukan menggunakan webmin. diperoleh penggunakan CPU server berlebihan (96%)
dari hasil ps aux | grep php diketahui adalah:
www-data 912356 99.6 0.1 85792 25116 ? R 05:51 247:50 php /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvLmdpdC9pbmZvZXJyb3JfNDA0LWhhbmRsZXI=
www-data 912364 99.6 0.1 85792 25032 ? R 05:51 247:49 php /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvLmdpdC9pbmZvZXJyb3JfNDA0LWhhbmRsZXI=
www-data 912372 99.6 0.1 85792 25124 ? R 05:51 247:48 php /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvLmdpdC9pbmZvZXJyb3JfNDA0LWhhbmRsZXI=
www-data 912378 99.8 0.1 85792 25044 ? R 05:53 246:47 php /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvdmVuZG9yL2ZydWl0Y2FrZS9waHAtY29ycy9zcmMvRXhjZXB0aW9uc2Vycm9yXzQwNC1oYW5kbGVy
www-data 912386 99.8 0.1 85792 25048 ? R 05:53 246:46 php /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvdmVuZG9yL2ZydWl0Y2FrZS9waHAtY29ycy9zcmMvRXhjZXB0aW9uc2Vycm9yXzQwNC1oYW5kbGVy
www-data 912395 99.8 0.1 85792 25144 ? R 06:03 236:04 php /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvdmVuZG9yL3JhbXNleS91dWlkL3NyYy9HZW5lcmF0b3JlcnJvcl80MDQtaGFuZGxlcg==
www-data 912403 99.8 0.1 85792 25340 ? R 06:03 236:04 php /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvdmVuZG9yL3JhbXNleS91dWlkL3NyYy9HZW5lcmF0b3JlcnJvcl80MDQtaGFuZGxlcg==
setelah dilakukan pengecekan pada salah satu file tmp sessions tersebut
sudo cat /tmp/.sessions/.L3Zhci93d3cvaHRtbC9wcmVzZW5zaS1hcGkvdmVuZG9yL2ZydWl0Y2FrZS9waHAtY29ycy9zcmMvRXhjZXB0aW9uc2Vycm9yXzQwNC1oYW5kbGVy
melakukan akses terhadap file error_404.php dimana file tersebut adalah backdoor yang ditanamkan untuk menyisipkan coding lain pada website.
lalu kill sesuai PID nya
sudo kill -9 912356
sudo kill -9 912364
sudo kill -9 912372
sudo kill -9 912378
sudo kill -9 912386
sudo kill -9 912395
sudo kill -9 912403
Hasilnya CPU server normal kembali
2. Pemeriksaan Terhadap File Mencurigakan
Kata kunci: error_404.php, .htaccess, html
cari file tersebut pada lokasi yang folder public, vendor dan system dimana seharusnya file tersebut tidak seharusnya berada di lokasi tersebut.
cek rutin tail -f /var/log/apache2/error.log
untuk memantau aktivitas ip yang mengakses server mencurigakan.
lakukan blok ip tersebut jika fail2ban tidak mendeteksinya, dengan cara:
1. Blok IP dengan IPTABLES
untuk tambah ip yang diblok
sudo iptables -A INPUT -s 36.70.12.0/24 -j DROP
untuk menghapus ip yang diblok
sudo iptables -D INPUT -s 36.70.12.0/24 -j DROP
untuk menghapus ip yang diblok dalam daftar
contoh:
5 DROP all -- 192.168.1.100 0.0.0.0/0
7 DROP all -- 203.0.113.45 0.0.0.0/0
sudo iptables -D INPUT 7
sudo iptables -D INPUT 5
untuk melihat ip yang sudah diblok
sudo iptables -L INPUT -n
sudo iptables -L -n
sudo iptables -L INPUT -n --line-numbers | grep DROP
2. Blok IP dengan UFW
untuk tambah ip yang diblok
ufw deny from 36.70.12.0/24
untuk menghapus ip yang diblok
ufw status numbered
ufw delete <number>
untuk melihat ip yang sudah diblok
ufw status
3. Pemeriksaan Terhadap Log Apache
tail -f /var/log/apache2/error.log ditemukan koneksi seperti gambar berikut:
dari log diatas akses yang tidak normal adalah:
[Tue Jun 18 16:42:30.675064 2024] [authz_core:error] [pid 2187:tid 140011890530048] [client 49.229.89.23:54361] AH01630: client denied by server configuration: /var/www/html/presensi/.https:, referer: https://presensi.baritotimurkab.go.id/login
Jaringan ip 49.229.89.23 wajib diblok:
ufw deny from 349.229.0.0/16
sedangkan, log lain seperti:
[Tue Jun 18 17:35:58.026576 2024] [proxy_fcgi:error] [pid 2263:tid 140011865351936] (104)Connection reset by peer: [client 36.75.65.115:19429] AH01075: Error dispatching request to : (reading response body)
adalah log koneksi normal dimana pengguna sedang mengakses page aplikasi ATEI.
4. Batasi Akses ke bin/sh
Batas ke bin/sh agar pengguna lain selain root tidak bisa mengaksesnya (kemungkinkan pengguna exploit):
chmod 700 /bin/sh
dan menambah rule pada .htaccess pada root web, untuk mencegah metode traversal directoy:
# Prevent directory traversal attacks
RewriteCond %{REQUEST_URI} \.\. [NC]
RewriteRule ^ - [F]
5. Buat rule untuk serve-cgi-bin.conf
serve-cgi-bin.conf terletak pada /etec/apache2/conf-available. Tambahkan aturan berikut:
Cek error log Apache2
1. Cek error log apache
tail -f /var/log/apache2/error.log
2. Kosongkan error log apache
truncate -s 0 /var/log/apache2/error.log
Fix Severity: 8192 Message: Creation of dynamic property CI_URI::$config is deprecated CodeIgniter
adalah masalah yang sering terjadi jika aplikasi menggunakan CI yang sudah tidak kompetible dengan versi PHP terbaru. Cara mengataasinya dengan dengan cara menambahkan code:
[\AllowDynamicProperties]
1. Folder /system/core/
pada file URI.php -> di atas class CI_URL {
Router.php -> di atas class CI_Router {
Loader.php -> di atas class CI_Loader {
Controller.php -> di atas class CI_Loader {
2. Folder /system/database
pada file DB_driver.php -> di atas abstract class CI_DB_driver {
[\ReturnTypeWillChange]
Folder /system/libraries/Session/drivers/
pada file Session_files_driver.php
-> di atas public function open($save_path, $name)
-> di atas public function read($session_id)
-> di atas public function write($session_id, $session_data)
-> di atas public function close()
-> di atas public function destroy($session_id)
-> di atas public function gc($maxlifetime)
Terima kasih pada sumber referensi : Raja Coding
https://www.youtube.com/watch?v=rM1C-88cYVc
Cara mengembalikan tema wordpress kembali semula karena tema yang baru diaktifkan error
Cara mengembalikan tema wordpress kembali semula karena tema yang baru diaktifkan error sedangkan tidak bisa login ke halaman admin wordpress (dalam kondisi blank):
- Masuk ke dalam database wordpress
- Buka Tabel wp_options
- Cari template dan stylesheet pada Kolom option_name
- Ubah/isi dengan tema sebelumnya yang normal misal: twentysixteen
- Simpan perubahan
Perintah CLI untuk ekspor database
Untuk melakukan ekspor data dari MySQL dapat menggunakan perintah mysqldump. Perintah ini memungkinkan Anda untuk membuat salinan dari struktur database, tabel, atau data tertentu ke dalam file SQL. Berikut adalah contoh penggunaannya:
mysqldump -u username -p database_name > nama_file_dump.sql
-u username: Nama user MySQL yang memiliki hak akses untuk database yang akan diekspor.-p: Opsi password.database_name: Nama database yang ingin Anda ekspor.nama_file_dump.sql: Nama file untuk menyimpan dump data.
Contoh:
mysqldump -u root -p dbdiskominfo > dbdiskominfo.sql
Perintah CLI untuk import database
Untuk melakukan impor data dari MySQL dapat menggunakan perintah mysql. Terlebih dahulu pastikan file dump mysql sudah tersedia. Berikut adalah contoh penggunaannya:
mysql -u username -p database_name < nama_file_dump.sql
-u username: Nama user MySQL yang memiliki hak akses ke database yang akan diimpor.-p: Opsi permintaan password.database_name: Nama database di mana Anda ingin mengimpor dump SQL.nama_dump_file.sql: Nama file dump SQL yang berisi struktur dan data yang ingin Anda impor. Lokasinya harus disesuaikan dengan lokasi file tersebut di sistem file Anda.
Contoh:
mysql -u root -p dbdiskominfo < dbdiskominfo_dump.sql
Perintah untuk transfer file dan folder antar server
Perintah ini menggunakan CLI linux yang diketik pada Terminal atau Putty. Sebelum itu pastikan akses SSH sudah tersedia.
Anda dapat menggunakan perintah scp atau secure copy seperti contoh berikut:
scp -r username@hostname:/path/to/directory /path/to/destination
-r: Mengindikasikan bahwascpharus meng-kopi direktori secara rekursif, termasuk semua file dan sub-direktori di dalamnya.username: Nama user pada server tujuan.hostname: Nama atau alamat IP server tujuan./path/to/directory: Lokasi direktori di server tujuan yang ingin Anda download./path/to/destination: Lokasi direktori di mana Anda ingin menyimpan direktori yang didownload di server lokal.
Contoh:
scp -r root@36.67.22.18:/var/www/html/diskominfo_1 /var/www/html/diskominfo_2
root: Nama user pada server tujuan.36.67.22.18: Alamat IP server tujuan./var/www/html/diskominfo_1: Lokasi folder yang ingin didownload pada di server tujuan yaitu folder diskominfo_1./var/www/html/diskominfo_2: Lokasi penempatan folder yang akan diupload pada server lokal yaitu folder diskominfo_2.
jika menggunakan port 2022 maka:
scp -r -P 2022 root@36.67.22.22:/var/www/html/diskominfo_1 /var/www/html/diskominfo_2
Query Menampilan Unit Kerja yang Pegawainya Cuti
Untuk menampilkan Unit Kerja yang Pegawainya cuti kategori 7
SELECT tbl_unit.nm_unit FROM tbl_unit JOIN users ON tbl_unit.id = users.id_unit JOIN tbl_absen ON users.id = tbl_absen.id_user WHERE tbl_absen.id_ket_in = '7' AND tbl_absen.tgl_in BETWEEN '2024-04-01' AND '2024-04-30';
SELECT users.name, tbl_unit.nm_unit FROM tbl_unit JOIN users ON tbl_unit.id = users.id_unit JOIN tbl_absen ON users.id = tbl_absen.id_user WHERE tbl_absen.id_ket_in = '7' AND tbl_absen.tgl_in BETWEEN '2024-04-01' AND '2024-04-30';
Cek Pegawai Status Cuti
SELECT
users.name,
tbl_unit.nm_unit,
tbl_absen.tgl_in
FROM
tbl_absen
JOIN
users ON tbl_absen.id_user = users.id
JOIN
tbl_unit ON users.id_unit = tbl_unit.id
WHERE
tbl_absen.id_user = '475'
AND tbl_absen.id_ket_in = '1'
AND tbl_absen.tgl_in BETWEEN '2024-06-03' AND '2024-06-30';
Query untuk menampilkan hasil database mysql
Contoh untuk menampilkan data tertentu. Dalam hal ini ingin menampilkan Daftar nama pegawai pada unit kerja Inspektorat yang absen dari tanggal 1 Maret 2024 sampai tanggal sekarang.
SELECT
users.name,
users.nip,
tbl_absen.tgl_in,
tbl_absen.jam_in,
tbl_absen.tgl_out,
tbl_absen.jam_out,
tbl_unit.nm_unit
FROM
users
JOIN
tbl_unit ON users.id_unit = tbl_unit.id
JOIN
tbl_absen ON users.id = tbl_absen.id_user
WHERE
tbl_absen.tgl_in BETWEEN '2024-03-01' AND CURDATE()
AND tbl_unit.nm_unit = 'INSPEKTORAT';
Sedangkan untuk mengekspor ke file .csv
SELECT
users.name,
users.nip,
tbl_absen.tgl_in,
tbl_absen.jam_in,
tbl_absen.tgl_out,
tbl_absen.jam_out,
tbl_unit.nm_unit
INTO OUTFILE '/tmp/hasil.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM
users
JOIN
tbl_unit ON users.id_unit = tbl_unit.id
JOIN
tbl_absen ON users.id = tbl_absen.id_user
WHERE
tbl_absen.tgl_in BETWEEN '2024-03-01' AND CURDATE()
AND tbl_unit.nm_unit = 'INSPEKTORAT';
Cara merubah events pada perubahan qrcode presensi per 1 jam:
mysql> set global event_scheduler = ON;
mysql> ALTER EVENT db_presensi.qr_refresh
ON SCHEDULE EVERY 1 HOUR
STARTS '2024-03-03 00:00:00';
karna STARTS bersifat opsional bisa juga langsung dengan:
mysql> ALTER EVENT db_presensi.qr_refresh
ON SCHEDULE EVERY 1 HOUR;
untuk perubahan per 30 menit:
mysql>ALTER EVENT db_presensi.qr_refresh
ON SCHEDULE EVERY 30 MINUTE
STARTS '2024-03-03 00:00:00';
Gagal Update Data Umum pada OpenDK Kecamatan
Gagal!!
Update Data Umum gagal!
Peringatan ini muncul pada saat simpan data umum aplikasi opendk kecamatan. Padahal semua inputan data sudah terisi, koordinat lokasi kantor juga sudah terisi.
Solusinya adalah:
Buat Kolom lat dan lng pada Tabel das_data_umum, dengan tipe data DOUBLE
Query Hapus isi data tabel dalam database menggunakan Terminal
- Masuk ke MySQL melalui terminal
mysql -u root -p
- Pilih database yang ingin digunakan
USE db_presensi_25;
- Hapus isi data dari tabel
DELETE FROM tpp;
Wordpress
Tips Pemanfaatan Wordpres sebagai website Perangkat Daerah
Cara Mengaktifkan FTP pada Wordpress
Sebagai informasi Wordpress yang digunakan sebagai website OPD adalah wordpress yang diinstall pada server Webmin Kabupaten. Sehingga konfigurasi FTP pada server perlu diperhatikan.
Sebelum cara ini diberlakukan, admin OPD diberikan hak akses untuk Webmin dan diberikan akses modul File Manager. Sehingga Admin OPD dapat mengupload file yang diperlukan baik untuk update wordpress, tema dan plugin.
Berikut tahapan cara agar FTP wordpress otomatis dapat melakukan update wordpress, tambah tema dan plugin.
1. Buka file wp-config.php pada root website OPD.
sudo nano /var/www/html/wordpress/wp-config.php
2. Tambahkan baris berikut sebelum baris /* That's all, stop editing! */:
define('FS_METHOD', 'direct');
3. Berikan Permission Folder pada folder wp-content
sudo chown -R www-data:www-data /var/www/html/wordpress/wp-content
Pastikan folder chmod 755 dan file chmod 644
4. Install FTP server
sudo apt install vsftpd -y
5. Buka file vsftpd.conf
sudo nano /etc/vsftpd.conf
6. Konfigurasi berikut pada vsftpd.conf
write_enable=YES
local_umask=022
chroot_local_user=YES
7. Lalu Restart FTP Server
sudo systemctl restart vsftpd
8. Jangan lupa berikan rule NAT pada Mikrotik untuk membukan port 21 agar dapat diakses dari luar
dst-nat chain=dstnat
in-interface=etherWAN
protocol=tcp
dst-port=21
action=dst-nat
to-addresses=<IP_LAN_SERVER>
to-ports=21
9. Jangan lupa juga berikan buka firewall untuk port 21
ufw allow 21
Cara Update Wordpress secara Manual
Berikut tahapan update Wordpress secara manual:
1. Backup File Wordpress dan database.
2. Download File Wordpress terbaru di https://id.wordpress.org/download/
3. Upload File Zip Wordpress terbaru pada root direktori Web
4. Rename Folder Wordpress lama (contoh bpkad.old).
5. Extract pada root direktori.
6. Rename Folder Wordpress hasil Extract tadi sesuai nama Folder Wordpress lama (bpkad).
7. Masuk ke Folder bpkd. lalu Hapus Folder wp-content.
8. Copy Folder wp-content, File .htaccess dan File wp-config.php.
9. Paste pada Folder bpkad.
10. Login admin web wordpress. Update database. Lanjutkan untuk pembaruan database.
11. Selesai