Menerapkan SuExec dan mod_fcgid pada Apache di Ubuntu Server

Dapatkan update terbaru Linuxku.com di kanal Telegram https://telegram.me/linuxkudotcom.

Artikel lalu kita telah membahas seputar php Server baik dengan Apache ataupun Nginx. Kali ini penulis coba memberikan tutorial tentang bagaimana menerapkan suExec dan module fcgid pada Apache di Ubuntu Server. Tujuanya adalah memudahkan kita mengetahui user mana yang menyebabkan trafik tinggi. Jika kita membuat satu server dengan banyak pengguna layaknya shared hosting.

Tahap Instalasi dan Konfigurasi

Asumsi penulis, Anda sudah menginstal LAMP (Linux, Apache,
Mariadb/MySQL, PHP). Jika belum Anda bisa baca artikel lalu di sini
yakni (http://www.linuxku.com/2016/06/install-lamp-linux-apache-mysql-dan-php.html).

Langsung saja kita praktek. Pertama-tama install dahulu module suExec dan module fcgid:

$ sudo apt-get install apache2-suexec libapache2-mod-fcgid apache2-mpm-worker apache2-suexec-custom

Sebelumnya kita matikan dahulu module php dari Apache.

$ sudo a2dismod php5

Perhatian jika Anda pengguna php7 yang mana ini sudah menjadi default di Ubuntu 16.04, Anda wajib mengganti php5 diperintah di atas dengan php7.

Kemudian aktifkan module berikut:

$ sudo a2enmod rewrite suexec include fcgid actions alias

Lalu sunting berkas php.ini yang berada dalam direktori /etc/php5/cgi/ dengan perintah berikut:

$ sudo nano /etc/php5/cgi/php.ini

Cari kata cgi.fix_pathinfo dengan CTRL+W di nano. Dan ubah nilainya menjadi satu. cgi.fix_pathinfo = 1.

Keluar dari nano dan save. Lalu kemudian kita sunting kembali berkas module fcgid yang berada di /etc/apache2/mods-available/fcgid.conf.

$ sudo nano /etc/apache2/mods-available/fcgid.conf

Tambahkan PHP_Fix_Pathinfo_Enable 1 seperti gambar berikut:

Keluar dari nano dan save. Dan restart Apache Anda.

$ sudo service apache2 restart

Tahap Implementasi

Penulis asumsikan kita membuat dua macam web dengan virtualhost, yang masing-masing di handle oleh user dan grup masing masing dari web tersebut.
Pertama-tama buat terlebih dahulu user dan dan group nya.

$ sudo grupadd situs1
$ sudo grupadd situs2
$ sudo useradd -s /bin/false -d /var/www/situs1 -m -g situs1 situs1
$ sudo useradd -s /bin/false -d /var/www/situs2 -m -g situs2 situs2
$ sudo chmod 711 /var/www/situs1
$ sudo chmod 711 /var/www/situs2

Kemudian buat direktori public_html, fcgi-bin, cgi-bin di masing-masing direktori virtualhost yang telah kita buat sebelumnya.

$ sudo mkdir -p /var/www/situs1/{public_html,fcgi-bin}
$ sudo mkdir -p /var/www/situs2/{public_html,fcgi-bin}
$ sudo chown situs1:situs1 /var/www/situs1/public_html
$ sudo chown situs2:situs2 /var/www/situs2/public_html

Kemudian copy php.ini pada setiap virtualhost:

$ sudo cp /etc/php5/cli/php.ini /var/www/situs1
$ sudo cp /etc/php5/cli/php.ini /var/www/situs2

Catatan: php.ini terletak pada direktori berbeda disesuaikan dengan versi php yg Anda gunakan, oleh karena itu cek terlebih dahulu letak php.ini dengan cara berikut:

$ php -i | grep php.ini

Jika sudah, sekarang kita ubar permission php.ini tersebut

$ sudo chmod +x /var/www/situs1/php.ini
$ sudo chmod +x /var/www/situs2/php.ini
$ sudo chown situs1:situs1 /var/www/situs1/php.ini
$ sudo chown situs2:situs2 /var/www/situs2/php.ini

Kemudian mari coba kita cek isi dari suExec dengan perintah berikut:

$ sudo /usr/lib/apache2/suexec -V

Anda akan melihat bahwa document root direktori (AP_DOC_ROOT) berada pada /var/www dengan demikian kita tidak akan bisa memanggil PHP binary secara langsung yang mana ia terletak di /usr/lib/cgi-bin/php karena berada di luar document root direktori, juga suExec  tidak mengijinkan symlink. Sehingga, untuk menangani hal tersebut adalah dengan menciptakan skrip wrapper yang akan memanggil PHP binary(/usr/lib/cgi-bin/php) pada setiap situs di direktori /var/www. Dengan catatan, kepemilikan (permission) skrip wraper harus sesuai dengan user dan group yang mengakses.

$ sudo nano /var/www/situs1/fcgi-bin/situs1.fcgi

Dan masukan skrip berikut:

#!/bin/sh
PHPRC=/var/www/situs1/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php5-cgi

Kemudian buat virtualhost nya di /etc/apache2/sites-available dengan cara berikut:

$ sudo nano /etc/apache2/sites-available/situs1.conf

Dan masukan konfigurasinya sebagai berikut:

<VirtualHost *:80>
    DocumentRoot /var/www/situs1/public_html
    ServerName www.situs1.com
    SuexecUserGroup situs1 situs1
    ErrorLog /var/log/apache2/demo1-error_log
    LogLevel debug
    CustomLog /var/log/apache2/demo1-access_log combined
    <Directory />
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
   
    AddHandler php-fcgi .php
    Action php-fcgi /fcgi-bin/situs1.fcgi

    Alias /fcgi-bin/ /var/www/situs1/fcgi-bin/
    <Location /fcgi-bin/>
        SetHandler fcgid-script
        Options +ExecCGI
    </Location>
   
    RewriteEngine On
    RewriteRule ^/fcgi-bin/[^/]*$ / [PT]

</VirtualHost>

Kemudian aktifkan virtualhost tersebut di apache dengan cara berikut:

$ sudo a2ensite situs1.conf
$ sudo service apache2 restart

Untuk mencoba apakah uid/gui sudah benar buat skrip php berikut:

sudo nano /var/www/situs1/public_html/index.php
<?php
  system("id");

Cek jika sudah seperti ini berarti Anda sudah benar:

Karena situs1 semua konfigurasinya sudah benar langkah selanjutnya yakni kita copy semua configurasi dari situs1 dan sedikit modifikasi menyesuaikan dengan direktori situs2.

Berikut ini yang perlu Anda copy dan modifikasi:

sudo cp /var/www/situs1/fcgi-bin/situs1.fcgi /var/www/situs2/fcgi-bin/situs2.fcgi
sudo cp /etc/apache2/sites-available/situs1.conf /etc/apache2/sites-available/situs2.conf
sudo cp /var/www/situs1/public_html/index.php /var/www/situs2/public_html/
sudo chown situs2:situs2 -R /var/www/situs2
sudo a2ensite situs2

Tes kembali pada situs2, jika hasilnya sudah seperti gambar di bawah artinya Anda telah sukses.

Yakin Ngga Mau Diskusi ?

Yuk diskusi cerdas. Gunakan nama asli agar komentar Anda disetujui.