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

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/

  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 = 7% 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 = 7% 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 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
  2. Jalankan perintah berikut dan catat jumlah cpu dan ukuran RAM
    htop
  3. 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 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 f -name "*.php" -exec chmod 0600 {} +
      find /var/non-www/vhost1/virtualhost1/* -type d -exec chmod 0711 {} +
  4. Amankan berkas konfigurasi dengan permisi berkas 0400; serta hilangkan hak akses mengganti isi file dan folder pada berkas, kecuali folder upload, plugin dan cache
    • WordPress
      #amankan konfigurasi
      chmod 0400 /var/non-www/vhost1/virtualhost1/wp-config.php
      #hilangkan hak akses, kecuali folder tertentu
      find /var/non-www/vhost1/virtualhost1 ! \( -path "/var/non-www/virtualhost1/wp-content" -or -path "/var/non-www/vhost1/virtualhost1/wp-content/*" \) -type d -exec chattr +i {} +
      chattr +i /var/non-www/vhost1/virtualhost1/*.php
    • Untuk yang lainnya chmod 0400 juga, tetapi berkas konfigurasinya menyesuaikan
  5. Jalankan perintah berikut
    nano /etc/php/7.0/fpm/pool.d/pool1.conf
  6. 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
  7. Kemudian tambahkan variabel sesuai dengan rumus di bawah ini
    1. Host sendiri dengan server hanya menjalankan Web
      pm = dynamic
      pm.max_children = 7% 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 = 7% NilaiMaksWorker
      pm.start_servers = 1
      pm.min_spare_servers = 1
      pm.max_spare_servers = JumlahCPU * 3
      ;pm.max_requests = 0
  8. Ulangi langkah ke 2 sampai 4 untuk Pool2, Pool3, …, Pool-n
  9. 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, misal wp-config.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);

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