Apache memiliki teknologi Multi-Processing Modules (MPM) yang bertugas untuk mengikat port jaringan pada mesin, menerima permintaan dan mengirimkan permintaan ke anak-anak (children) untuk diproses. MPM yang tersedia sampai tulisan ini dibuat adalah mpm_netware (Netware), mpmt_os2 (OS/2), mpm_winnt (Windows), mpm_prefork(Unix), mpm_worker(Unix), dan mpm_event (Unix).
Daftar Isi
- Migrasi MPM Prefork ke MPM Event
- Pengaturan MPM Event
- |-Apache
- |-PHP (1 Pool Untuk 1 Virtual Host)
- |-PHP (Banyak Pool Untuk Banyak Virtual Host)
- |-Uji Isolasi
- |-Penyelesaian Permasalahan
- SFTP Only
- Mengaktifkan HTTP2
- Mengaktifkan opcache
- Pengujian
- Perlindungan Aplikasi
- Cheat Untuk Server Sendiri
- Windows mod_fcgid (XAMPP)
Migrasi MPM Prefork ke MPM Event
Untuk sebagian besar kasus, MPM Event memberikan waktu proses yang lebih cepat dibandingkan MPM Prefork. Pada MPM Event, Apache menggunakan PHP-FPM untuk memproses PHP yang terpisah dari Apache, sebagaimana yang dilakukan oleh Nginx.
— Move On MPM Prefork ke MPM Event, Sebuah Catatan
|-Area Keamanan
- Aktifkan HTTPS
a2ensite 000-default-ssl
(https://pdsi.unisayogya.ac.id/lebih-baik-apache2-conf-daripada-htaccess/#langkah) - Hanya mengeksekusi skrip PHP yang berada di dalam berkas *.php
<FilesMatch ".php$">…</FilesMatch>
(https://pdsi.unisayogya.ac.id/lebih-baik-apache2-conf-daripada-htaccess/#langkah)/etc/php/7.0/fpm/pool.d
(https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/#server-sendiri) - Tidak mengeksekusi skrip PHP yang berada di dalam folder cegah eksekusi php dari folder (1) upload dan cache di mana di dalamnya tidak ada file php sama sekali, misalnya wp-content/uploads dan wp-content/cache, (2) tema dan plugin meskipun ada file php tapi sifatnya hanya hook
ProxyPassMatch ^(.*((/tmp-php)|(wp-content/uploads/)|(wp-content/cache/)|(wp-content)))(.*\.php(/.*)?)$
(https://pdsi.unisayogya.ac.id/lebih-baik-apache2-conf-daripada-htaccess/#langkah) - Cegah eksekusi skrip
#Prevent script execution: (1) -ExecCGI, (2) folder temporary php dan folder upload di mount dengan mode=1777 dan noexec
#Alias ...."/tmp-php"
<Directory "/tmp-php">
Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .htm .html
</Directory> - Hanya PHP-FPM yang bisa membaca dan mengeksekusi berkas PHP sesuai dengan user masing-masing
addgroup
,adduser
,chown user:guser -R
,chmod 0711
,chmod 0600
,listen.owner
,listen.group
,listen.mode
(https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/#server-sendiri) - Berkas dalam mode hanya baca
chmod 0600
,attr +i
(https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/#server-sendiri) - Isolasi (chroot)
php_admin_value[open_basedir]
(https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/#server-sendiri)ForceCommand internal-sftp -d
ChrootDirectory
(https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/#sftp-only) - Amankan upload
(https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/3/#amankan-upload)
Petunjuk berikut adalah petunjuk yang dilakukan di Ubuntu versi 18.04 yang menggunakan PHP versi 7.0
apt-get install htop
apt install php7.0-fpm
a2enmod proxy_fcgi setenvif
a2enconf php7.0-fpm
a2dismod php7.0
a2dismod mpm_prefork
a2enmod mpm_event
apt-get remove libapache2-mod-php7.0
service apache2 restart
service php7.0-fpm restart
Pengaturan MPM Event
Hitung NilaiMaksWorker dengan rumus:
UkuranRAMNonApachePHP = Total pengaturan RAM untuk selain Apache dan PHP, seperti OpCache, dll.
- Hosting
NilaiMaksWorker = UkuranRAMdalamMb/5.12 * 0.8 = UkuranRAMdalamMb/512 * 80 - Host sendiri
- Server hanya menjalankan Web
NilaiMaksWorker = (UkuranRAMdalamGb – 2 – UkuranRAMNonApachePHP) * 200 - Server menjalankan Web dan servis lain, misalnya database
NilaiMaksWorker = (UkuranRAMdalamGb – 2 – UkuranRAMNonApachePHP) * 150
- Server hanya menjalankan Web
|-Apache
Materi ini terkait dengan: https://pdsi.unisayogya.ac.id/lebih-baik-apache2-conf-daripada-htaccess/. Baca juga Unsecret Tai Chi Techniques on Apache2 and PHP FPM: UNISA Yogyakarta Style.
- Jalankan perintah berikut dan catat jumlah cpu dan ukuran RAM
htop
- Jalankan perintah berikut
nano /etc/apache2/mods-enabled/mpm_event.conf
- Kemudian atur variabel sesuai dengan rumus di bawah ini
ServerLimit NilaiMaksWorker / ThreadsPerChild
StartServers JumlahCPU
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers NilaiMaksWorker
MaxConnectionsPerChild 10000
|-PHP (1 Pool Untuk 1 Virtual Host)
- Jalankan perintah berikut dan catat jumlah cpu dan ukuran RAM
htop
- Jalankan perintah berikut
nano /etc/php/7.0/fpm/pool.d/www.conf
- Kemudian atur variabel sesuai dengan rumus di bawah ini
- Host sendiri dengan server hanya menjalankan Web
pm = dynamic
pm.max_children = 70% NilaiMaksWorker
pm.start_servers = JumlahCPU * 2
pm.min_spare_servers = JumlahCPU * 2
pm.max_spare_servers = JumlahCPU * 4
;pm.max_requests = 0 - Hosting atau Host sendiri dengan server menjalankan Web dan servis lain, misalnya database
pm = dynamic
pm.max_children = 70% NilaiMaksWorker
pm.start_servers = JumlahCPU * 2
pm.min_spare_servers = JumlahCPU * 2
pm.max_spare_servers = JumlahCPU * 3
;pm.max_requests = 0
- Host sendiri dengan server hanya menjalankan Web
Di bawah ini adalah contoh pengaturan PHP-FPM menggunakan Plesk pada website yang di-hosting dengan 1 CPU dan RAM 512 Mb
|-PHP (Banyak Pool Untuk Banyak Virtual Host)
|–Server Sendiri
- Pastikan isolasi untuk subdomain umum untuk http dan https
- Apache2: DocumentRoot folder yang terisolasi, misalnya root:root /var/www/000-default
- PHP-FPM: php_admin_value[open_basedir] diisi dengan folder di dalam DocumentRoot, misalnya /var/www/000-default/5.6:/tmp untuk pool.d/www.conf dengan owner folder tersebut www-data:www-data
- Pastikan bahwa subdomain umum untuk http dan https diberi nama dengan awalan 000,
- misal
000-default.conf
dan000-default-ssl.conf
, karena apache2 akan membaca sites-enabled sesuai urutan abjad. Jalankan perintahls /etc/apache2/sites-available/000-*.conf
- Jika belum menggunakan nama 000 di depannya, misalnya
default.conf
, maka jalankana2dissite default
mv /etc/apache2/sites-available/default.conf /etc/apache2/sites-available/000-default.conf
a2ensite 000-default
service apache2 restart
- misal
- Jalankan perintah berikut dan catat jumlah cpu dan ukuran RAM
htop
- Buat user apabila belum ada
addgroup guser1
adduser --no-create-home --ingroup guser1 user1
mkdir /var/www/vhost1
chown root:root /var/non-www/vhost1
chmod 0755 /var/non-www/vhost1- Campuran PHP dan non-PHP (Khusus untuk berkas PHP harus tetap 0600)
mkdir /var/www/vhost1/virtualhost1
chown user:guser -R /var/non-www/vhost1/virtualhost1
chmod 0711 /var/non-www/vhost1/virtualhost1
find /var/non-www/vhost1/virtualhost1 -type f -exec chmod 0644 {} +
find /var/non-www/vhost1/virtualhost1 -type f -name "*.php" -exec chmod 0600 {} +
find /var/non-www/vhost1/virtualhost1/* -type d -exec chmod 0711 {} + - Untuk folder yang full PHP (tidak ada berkas dengan ekstensi lain sama sekali) dibuat 0711 dan file dibuat 0600. Apabila ada folder yang tidak bisa berfungsi, maka folder tersebut dapat diganti menjadi 0750, kemudian baru 0755. Apabila ada berkas yang tidak dapat diakses, maka berkas tersebut diganti menjadi 0640, kemudian baru 0644. (Khusus untuk berkas PHP harus tetap 0600)
mkdir /var/www/vhost1/virtualhost1
chown user:guser -R /var/non-www/vhost1/virtualhost1
chmod 0711 /var/non-www/vhost1/virtualhost1
find /var/non-www/vhost1/virtualhost1 -type f -exec chmod 0600 {} +
find /var/non-www/vhost1/virtualhost1/* -type d -exec chmod 0711 {} +
- Campuran PHP dan non-PHP (Khusus untuk berkas PHP harus tetap 0600)
- Buka folder upload dengan permisi 0755
chmod 0755 /var/non-www/vhost1/virtualhost1/upload
find /var/non-www/vhost1/virtualhost1/upload/* -type d -exec chmod 0755 {} + - Amankan berkas konfigurasi dengan permisi berkas 0400; serta hilangkan hak akses mengganti isi file dan folder pada berkas, kecuali folder upload dan cache
- WordPress
#amankan konfigurasi dan index
chmod 0400 /var/non-www/vhost1/virtualhost1/wp-config.php && chmod 0400 /var/non-www/vhost1/virtualhost1/index.php
#hilangkan hak akses, kecuali folder tertentu
find /var/non-www/vhost1/virtualhost1 ! \( -path “/var/non-www/virtualhost1/wp-content/uploads” -or -path “/var/non-www/vhost1/virtualhost1/wp-content/uploads/*” -or -path “/var/non-www/virtualhost1/wp-content/cache” -or -path “/var/non-www/vhost1/virtualhost1/wp-content/cache/*” \) -type d -exec chattr +i {} +
chattr +i /var/non-www/vhost1/virtualhost1/*.php - Untuk yang lainnya chmod 0400 juga, tetapi berkas konfigurasinya menyesuaikan
- WordPress
- Jalankan perintah berikut
nano /etc/php/7.0/fpm/pool.d/pool1.conf
- Ketik
[pool1]
user = user1
group = guser1
listen = /run/php/php7.0-fpm-pool1.sock
listen.owner = user1
listen.group = www-data
listen.mode = 0660
php_admin_value[open_basedir] = /var/non-www/vhost1/virtualhost1:/tmp - Kemudian tambahkan variabel sesuai dengan rumus di bawah ini
- Host sendiri dengan server hanya menjalankan Web
pm = dynamic
pm.max_children = 75% NilaiMaksWorker
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = JumlahCPU * 4
;pm.max_requests = 0 - Hosting atau Host sendiri dengan server menjalankan Web dan servis lain, misalnya database
pm = dynamic
pm.max_children = 75% NilaiMaksWorker
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = JumlahCPU * 3
;pm.max_requests = 0
- Host sendiri dengan server hanya menjalankan Web
- Ulangi langkah ke 2 sampai 4 untuk Pool2, Pool3, …, Pool-n
- Jalankan langkah berikut
- Jalankan Tahapan Pengajuan di bawah. Catat nilai jumlah-php-fpm
- Jalankan perintah berikut
nano /etc/php/7.0/fpm/php-fpm.conf
- Kemudian tambahkan variabel sesuai dengan rumus di bawah ini
;pilih salah satu dari alternatif berikut
;ganti ke nilai yang lebih rendah jika suatu saat swap sampai digunakan
;alternatif 1
process.max = jumlah-php-fpm
;alternatif 2
process.max = pm.max_children * pm.max_spare_servers
|–Hosting
Konsep hak akses folder dan berkas sama dengan pengaturan untuk Server sendiri di atas, yaitu
- berkas konfigurasi dan index, misal
wp-config.php
,database.conf.php
danindex.php
harus 0400 - khusus untuk berkas PHP harus tetap 0600
- folder dibuat 0750 dan file non-PHP dibuat 0640
- apabila ada berkas non PHP yang tidak dapat diakses, maka diubah ke 0644
|—Versi 1
Isi php.ini dari masing-masing subdomain dengan open_basedir yang berbeda-beda.
Setelah disimpan maka akan muncul beberapa berkas pengaturan tambahan. Beri hak akses 0444 untuk .htaccess
. Beri hak akses 0400 untuk .user.ini
dan php.ini
.
|—Versi 2
Untuk versi ini biasanya open_basedir tidak perlu diubah
|-Uji Isolasi
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
print_r(scandir('/'));
print_r(scandir('./'));
$filename = "./index.php";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
|-Penyelesaian Permasalahan
- Fatal error: Call to undefined function getallheaders()
Pada index.php, tambahkan baris kodeif ( !function_exists ( 'getallheaders' ) ) {
function getallheaders() {return array();}
}
SFTP Only
Untuk setiap user:
- Jalankan perintah berikut
chown root:root /var/non-www/vhost1
chmod 0755 /var/non-www/vhost1 - Jalankan perintah berikut
nano /etc/ssh/sshd_config
- Tambahkan aturan
Match User user1
PasswordAuthentication yes
ForceCommand internal-sftp -d virtualhost1
ChrootDirectory /var/non-www/vhost1
AllowTCPForwarding no
X11Forwarding no
Mengaktifkan HTTP2
Jalankan perintah di bawah ini:
sudo a2enmod http2
sudo service apache2 restart
sudo echo "<IfModule http2_module>" > /etc/apache2/conf-available/http2.conf
sudo echo "Protocols h2 h2c http/1.1" >> /etc/apache2/conf-available/http2.conf
sudo echo "H2Direct on" >> /etc/apache2/conf-available/http2.conf
sudo echo "</IfModule>" >> /etc/apache2/conf-available/http2.conf
sudo a2enconf http2
sudo apachectl configtest && sudo service apache2 restart
Kemudian tambahkan/sesuaikan pengaturan di bawah ini
- Buat berkas include baru,
nano /etc/apache2/include/ssl.conf
Protocols h2 h2c http/1.1
H2Push on
H2PushPriority * after
H2PushPriority text/css before
H2PushPriority image/jpg after 32
H2PushPriority image/jpeg after 32
H2PushPriority image/png after 32
H2PushPriority application/javascript interleaved
#atur sesuai dengan sertifikatSSLEngine on
SSLCertificateFile /etc/ssl/ssl.crt
SSLCertificateKeyFile /etc/ssl/ssl.key
SSLCertificateChainFile /etc/ssl/ssl.ca-bundle
SSLOptions +StdEnvVars
SSLOptions +StdEnvVars
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown - Tambahkan pada Virtual Host di ssl-vhost file (/etc/apache2/sites-available/000-default-ssl.conf)
<VirtualHost _default_:443>
#...
Include include/ssl.conf
#...
</VirtualHost> - Tambahkan pada Virtual Host (/etc/apache2/apache2.conf), jika ada pengaturan Virtual Host pada file tersebut
Protocols h2 h2c http/1.1
Catatan:
Untuk server menggunakan Apache di Windows, cukup aktifkan opsi LoadModule http2_module modules/mod_http2.so
pada httpd.conf. Jika diperlukan dapat menambahkan opsi Protocols h2 h2c http/1.1
pada <VirtualHost *:443>
6 replies on “Move On MPM Prefork ke MPM Event, Sebuah Catatan”
[…] Materi ini terkait dengan: https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/ […]
[…] Inspirasi: https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/3/#windows-mod-fcgid […]
[…] Inspirasi: https://pdsi.unisayogya.ac.id/mengaktifkan-ssl-https-pada-web-berbasis-apache-dan-open-ssl/2/#feederpddiktihttps://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/ […]
[…] https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/ […]
[…] Cara mengaktifkan HTTP2 (HTTPS) pada Apache2: https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/#mengaktifkan-http2 […]
[…] Move On MPM Prefork ke MPM Event, Sebuah Catatan […]