Categories
Tutorial, Manual, Tips dan Trik

Move On MPM Prefork ke MPM Event, Sebuah Catatan

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

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
https://pdsi.unisayogya.ac.id/move-on-mpm-prefork-ke-mpm-event-sebuah-catatan/ 2021-07-06 12:36:56

|-Area Keamanan

  1. Aktifkan HTTPS
    a2ensite 000-default-ssl
    (https://pdsi.unisayogya.ac.id/lebih-baik-apache2-conf-daripada-htaccess/#langkah)
  2. 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)
  3. 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 ^((.*((wp-content/uploads/)|(wp-content/cache/)|(wp-content)))(.*\.php(/.*)?))$
    (https://pdsi.unisayogya.ac.id/lebih-baik-apache2-conf-daripada-htaccess/#langkah)
  4. 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)
  5. 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)
  6. 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)
  7. 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.

  1. Hosting
    NilaiMaksWorker = UkuranRAMdalamMb/5.12 * 0.8 = UkuranRAMdalamMb/512 * 80
  2. Host sendiri
    1. Server hanya menjalankan Web
      NilaiMaksWorker = (UkuranRAMdalamGb – 2 – UkuranRAMNonApachePHP) * 200
    2. Server menjalankan Web dan servis lain, misalnya database
      NilaiMaksWorker = (UkuranRAMdalamGb – 2 – UkuranRAMNonApachePHP) * 150

|-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.

  1. Jalankan perintah berikut dan catat jumlah cpu dan ukuran RAM
    htop
  2. Jalankan perintah berikut
    nano /etc/apache2/mods-enabled/mpm_event.conf
  3. 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)

  1. Jalankan perintah berikut dan catat jumlah cpu dan ukuran RAM
    htop
  2. Jalankan perintah berikut
    nano /etc/php/7.0/fpm/pool.d/www.conf
  3. Kemudian atur variabel sesuai dengan rumus di bawah ini
    1. 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
    2. 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

Di bawah ini adalah contoh pengaturan PHP-FPM menggunakan Plesk pada website yang di-hosting dengan 1 CPU dan RAM 512 Mb

Pengaturan PHP-FPM pada server yang di-hosting
Pengaturan PHP-FPM pada server yang di-hosting

|-PHP (Banyak Pool Untuk Banyak Virtual Host)

|–Server Sendiri

Ilustrasi php-fpm dengan banyak pool
Ilustrasi php-fpm dengan banyak pool
Gambaran hak akses file dan folder
  1. 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
  2. Pastikan bahwa subdomain umum untuk http dan https diberi nama dengan awalan 000,
    • misal 000-default.conf dan 000-default-ssl.conf, karena apache2 akan membaca sites-enabled sesuai urutan abjad. Jalankan perintah
      ls /etc/apache2/sites-available/000-*.conf
    • Jika belum menggunakan nama 000 di depannya, misalnya default.conf, maka jalankan
      a2dissite default
      mv /etc/apache2/sites-available/default.conf /etc/apache2/sites-available/000-default.conf
      a2ensite 000-default
      service apache2 restart
  3. Jalankan perintah berikut dan catat jumlah cpu dan ukuran RAM
    htop
  4. 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 {} +
  5. 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 {} +
  6. 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
  7. Jalankan perintah berikut
    nano /etc/php/7.0/fpm/pool.d/pool1.conf
  8. 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
  9. Kemudian tambahkan variabel sesuai dengan rumus di bawah ini
    1. 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
    2. 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
  10. Ulangi langkah ke 2 sampai 4 untuk Pool2, Pool3, …, Pool-n
  11. 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 dan index.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.

Pengaturan MultiPHP INI

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.

Autogenerate Berkas Pengaturan
|—Versi 2

Untuk versi ini biasanya open_basedir tidak perlu diubah

Pengaturan PHP

|-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

  1. Fatal error: Call to undefined function getallheaders()
    Pada index.php, tambahkan baris kode
    if ( !function_exists ( 'getallheaders' ) ) {
    function getallheaders() {return array();}
    }

SFTP Only

Untuk setiap user:

  1. Jalankan perintah berikut
    chown root:root /var/non-www/vhost1
    chmod 0755 /var/non-www/vhost1
  2. Jalankan perintah berikut
    nano /etc/ssh/sshd_config
  3. 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

  1. 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 sertifikat

    SSLEngine 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
  2. Tambahkan pada Virtual Host di ssl-vhost file (/etc/apache2/sites-available/000-default-ssl.conf)
    <VirtualHost _default_:443>
    #...
    Include include/ssl.conf
    #...
    </VirtualHost>
  3. 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>

By basit

Biro Pengembangan Teknologi Dan Sistem Informasi

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.