2.5 Pembangunan Aplikasi SPBE
- Tips Pengelolaan Aplikasi Server
- Buat User Root di Ubuntu
- Ekstensi PHP yang perlu diinstall
- 700 Koneksi Pengguna Bersamaan
- 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
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
700 Koneksi Pengguna Bersamaan
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 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 700
MaxConnectionsPerChild 0
ServerLimit 28
</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.2-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 175
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 25
pm.process_idle_timeout = 10s
pm.max_requests = 500
request_terminate_timeout = 300s
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
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 melihat ip yang sudah diblok
sudo iptables -L INPUT -n
sudo iptables -L -n
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 bahwascp
harus 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