Instalasi & Konfigurasi Laravel dengan php5.6 di CentOS 7 di Cloudmatika

Catata berikut mendokumentasikan proses migrasi infrastruktur myapps dari existing yang berbasis CT (Container) ke server baru yang berbasis VM (KVM).

Nah, karena ada isu koneksi ke repository saat awal-awal melakukan konfigurasi dan perlu menambahkan/mengubah berkas resolv.conf agar mengarah ke DNS server milik cloudmatika. Maka gunakan IP berikut untuk ditambahkan:

[root@myapps-server-vm ~]# cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4

; generated by /usr/sbin/dhclient-script
#nameserver 192.168.0.3
#nameserver 192.168.0.2

IP 192.168.x.y merupakan bawaan instalasi diberi tanda # di depan.

  1. Instalasi paket yang dibutuhkan
yum update
yum install epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum install php56-php-{devel,fpm,fpm,gd,json,mbstring,mcrypt,mysqlnd,odbc,pdo,process,soap,xml,xmlrpc,cli,pear} redis rsync mariadb-server openvpn tmux httpd wget htop vim zip supervisor
php -v

Proses di atas adalah untuk memasang paket-paket yang dibutuhkan. Baris terakhir akan menampilkan error karena path php belum didaftarkan ke sistem.

cat /opt/remi/php56/enable
. /opt/remi/php56/enable
which php
php -v

Perintah-perintah di atas untuk menguji script yang telah disediakan oleh repo remi untuk mengaktifkan path php56. Baris terakhir seharusnya telah menampilkan path php yang berada di /opt/remi/php56/root/usr/bin/php yang artinya php cli telah dapat digunakan. Keluarannya kurang lebih seperti berikut:

PHP 5.6.40 (cli) (built: Apr 28 2021 14:35:32)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

Untuk mendaftarkan secara default kita akan menempatkan script ke dalam direktori /etc/profile.d/ agar dapat dibaca oleh seluruh sistem. Buat file php.sh

vim /etc/profile.d/php.sh

lalu letakkan baris berikut:

. /opt/remi/php56/enable

Coba logout & login lagi, seharusnya sekarang sudah dapat langsung menggunakan php. Untuk melihat path php yang aktif bisa diperiksa dengan perintah:

which php

Untuk membuat user, dapat menggunakan perintah berikut:

adduser -m -U -s /bin/bash myapps
su - myapps

Kembali ke user root, lalu buat konfigurasi php-fpm untuk user myapps

cd /etc/opt/remi/php56/php-fpm.d
cp www.conf myapps.conf

Konten konfigurasinya kurang lebih sebagai berikut:

[myapps]
 
user = myapps
group = myapps

;listen = 127.0.0.1:9000
listen = /run/php56-fpm.sock
 
listen.owner = myapps
listen.group = myapps
;listen.mode = 0660
listen.allowed_clients = 127.0.0.1
 
pm = dynamic
pm.max_children = 200
pm.start_servers = 10
pm.min_spare_servers = 5
 
pm.max_spare_servers = 35
;pm.process_idle_timeout = 10s;
;pm.max_requests = 500
;pm.status_path = /status
;ping.path = /ping
;ping.response = pong

;access.log = log/$pool.access.log
;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
slowlog = /opt/remi/php56/root/var/log/php-fpm/www-slow.log
;request_slowlog_timeout = 0
;request_terminate_timeout = 0
;rlimit_files = 1024
;rlimit_core = 0
;chroot =
;chdir = /var/www
;catch_workers_output = yes
;clear_env = no
;security.limit_extensions = .php .php3 .php4 .php5
;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
;php_flag[display_errors] = off
php_admin_value[error_log] = /opt/remi/php56/root/var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 128M
php_value[session.save_handler] = files
php_value[session.save_path]    = /opt/remi/php56/root/var/lib/php/session
php_value[soap.wsdl_cache_dir]  = /opt/remi/php56/root/var/lib/php/wsdlcache

Beberapa penyesuaian antara lain terkait user & path listen file.

systemctl status php56-php-fpm
cat /usr/lib/systemd/system/php56-php-fpm.service

Aktifkan service php-fpm-nya dengan perintah-perintah berikut:

systemctl enable php56-php-fpm
systemctl start php56-php-fpm
systemctl status php56-php-fpm

Agar dapat menggunakan composer, kita perlu memasangnya terlebih dahulu. Nah, di sini kita kan meletakkan di direktori bin dari php56 yang telah kita pasang sebelumnya. Cari tau dulu path-nya ada di mana, lalu kita akan berpindah ke sana:

which php
cd /opt/remi/php56/root/usr/bin/

Selanjutnya download binary composer, beri akses execute, dan buat symlink menjadi composer:

wget https://github.com/composer/composer/releases/download/1.10.21/composer.phar
chmod +x composer.phar
ln -s composer.phar composer

Sampe di sini composer telah dapat digunakan.

Yang tak kalah penting adalah konfigurasi httpd. Kita cek apakah service httpd sudah jalan atau belum, lalu coba aktifkan.

ss -tulpn
systemctl start httpd
systemctl enable httpd
systemctl status httpd

Untuk mencoba langsung dari cli bisa dicoba dengan curl:

curl localhost

bagian konfigurasi, kita hapus konfigurasi default berupa welcome.conf lalu kita buat file baru myapps.conf

cd /etc/httpd/conf.d/
rm welcome.conf
vim myapps.conf

konten file tersebut kurang lebih sebagai berikut:

<VirtualHost *:80 >
    ServerName "myapps.co.id"
    ServerAlias "www.myapps.co.id"
    ServerAlias "apps.myapps.co.id"
    UseCanonicalName Off
 
    DocumentRoot "/home/myapps/httpdocs"
    CustomLog /home/myapps/logs/access_log combined
    ErrorLog /home/myapps/logs/error_log
 
    <IfModule mod_suexec.c>
        SuexecUserGroup "myapps" "myapps"
    </IfModule>
 
 
        <FilesMatch \.php$>
            SetHandler "proxy:unix:/run/php56-fpm.sock|fcgi://localhost/"
        </FilesMatch>
 
 
    TimeOut 120
    <Directory /home/myapps/httpdocs>
 
            #Options +Indexes +FollowSymLinks +MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
            Require all granted
 
    </Directory>
 
 
    #<IfModule mod_rewrite.c>
    #   RewriteEngine On
    #   RewriteCond %{HTTP_HOST} ^myapps.co.id$ [NC]
    #   RewriteRule ^(.*)$ http://www.myapps.co.id$1 [L,R=301]
    #</IfModule>
 
</VirtualHost>

Tentunya, lakukan modifikasi lebih lanjut jika diperlukan. Pastikan konfig httpd-nya tidak ada yang error dengan mengetikkan:

apachectl configtest

kalau hasilnya muncul Syntax OK berarti sudah benar konfigurasinya. Restart service httpd:

systemctl restart httpd
systemctl status httpd

Jalankan perintah berikut untuk pertama kalinya untuk memberi password pada akun root pada mariadb:

mysql_secure_installation

Simpan credential user root di home directory-nya user root:

vim /root/.my.cnf

kontennya sebagai berikut:

[client]
user=root
password=mysecurepassword
Catatan: Ganti mysecurepassword dengan password yang aman, misalnya random karakter.

Oiya, kalo ternyata belum aktif ya diaktifkan dulu:

systemctl enable mariadb
systemctl status mariadb
systemctl start mariadb

Buat database untuk prod:

MariaDB [(none)]> create database myapps_production;
MariaDB [(none)]> grant all privileges on myapps_production.* to 'myapps'@'localhost' identified by 'myrandompassword';
MariaDB [(none)]> flush privileges;

Impor database dari file backup:

cd /home/myapps/migrasi/
zcat myapps_production.sql.gz | mysql -u root myapps_production
Catatan: file backup telah disediakan.

Jadi begini cara install-nya:

yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
yum install ffmpeg ffmpeg-devel

Sudah, itu aja.

Supervisor dibutuhkan oleh myapps:

cd /etc/supervisord.d/
vim myapps.conf

Isi konten konfigurasinya kurang lebih begini:

[program:myapps]
command=/opt/remi/php56/root/usr/bin/php artisan queue:work --sleep=1 --tries=3
directory=/home/myapps/httpdocs
autostart=true
autorestart=true
user=myapps
startsecs=10
startretries=10
log_stdout=true
log_stderr=true
logfile=/home/myapps/logs/supervisor/myapps.log
logfile_maxbytes=2MB
logfile_backups=7

Kalo ternyata ada yang kurang kompatibel, disesuaikan lagi aja ya. Karena khusus yang ini belum dites.

Sebelumnya kita buat dulu file dhparam.pem dengan perintah berikut:

openssl dhparam -C -2 -out /etc/ssl/certs/dhparam.pem 4096

Selanjutnya tambahkan konfig pada file myapps.conf

cd /etc/httpd/conf.d/
vim myapps.conf

tambahkan di bawahnya sebagai berikut:

<VirtualHost *:443 >
    ServerName "myapps.co.id"
    ServerAlias "www.myapps.co.id"
    ServerAlias "apps.myapps.co.id"
    UseCanonicalName Off
 
    SSLEngine on
    DocumentRoot "/home/myapps/httpdocs"
    CustomLog /home/myapps/logs/access_log combined
    ErrorLog /home/myapps/logs/error_log
    DirectoryIndex index.html index.php
 
    <IfModule mod_suexec.c>
        SuexecUserGroup "myapps" "myapps"
    </IfModule>
 
 
        <FilesMatch \.php$>
            SetHandler "proxy:unix:/run/php56-fpm.sock|fcgi://localhost/"
        </FilesMatch>
 
 
    TimeOut 120
    <Directory /home/myapps/httpdocs>
 
            #Options +Indexes +FollowSymLinks +MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
            Require all granted
 
    </Directory>
 
 
    #<IfModule mod_rewrite.c>
    #   RewriteEngine On
    #   RewriteCond %{HTTP_HOST} ^myapps.co.id$ [NC]
    #   RewriteRule ^(.*)$ http://www.myapps.co.id$1 [L,R=301]
    #</IfModule>
 
    Include "/etc/httpd/include/myapps_ssl.conf"
 
</VirtualHost>

Nah, di situ ada juga file myapps_ssl.conf kita buat juga file-nya:

mkdir -p /etc/httpd/include
vim /etc/httpd/include/myapps_ssl.conf

Isinya kurang lebih seperti berikut:

SSLCertificateFile /etc/ssl/myapps/www-myapps-co-id.crt
SSLCertificateKeyFile /etc/ssl/myapps/www-myapps-co-id.key
SSLCertificateChainFile /etc/ssl/myapps/CA-fullchain.pem
 
SSLProtocol TLSv1.2
SSLCompression off
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSUite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH EDH+aRSA !CAMELLIA !SEED !3DES !RC4 !aNULL !eNULL !LOW !MD5 !EXP !PSK !SRP !DSS"
#SSLOpenSSLConfCmd Curves secp384r1
#SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"
 
<FilesMatch "\.(ttf|ttc|otf|eot|woff|woff2|font.css|css|js)$">
        Header always set Access-Control-Allow-Origin "*"
</FilesMatch>

Tentunya, berkas yang ada di /etc/ssl/myapps/* perlu dipersiapkan terlebih dahulu, yaitu file SSL yang telah disediakan dari klien.

Buat sebuah file security.conf secara terpisah:

cd /etc/httpd/include
vim security.conf

Isinya kurang lebih seperti berikut:

ServerTokens Prod
ServerSignature Off
TraceEnable Off
 
Header set X-Frame-Options: "SAMEORIGIN"
Header set X-Content-Type-Options: "nosniff"
Header set X-XSS-Protection: "1; mode=block"
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
# sesuaikan bagian ini
Header always set Content-Security-Policy "default-src 'self' https://*.piwik.pro www.google-analytics.com stats.g.doubleclick.net dialogflow.cloud.google.com; font-src 'self' data: https://fonts.gstatic.com; img-src 'self' data: https://www.google-analytics.com https://s
tats.g.doubleclick.net *.myapps.co.id https://*.piwik.pro https://*.google.com https://*.google.co.id *.googleusercontent.com; script-src * https://www.googletagmanager.com www.google-analytics.com https://*.piwik.pro 'unsafe-inline' 'unsafe-eval'; style-src * 'unsafe-inli
ne'; frame-src https://*.youtube.com https://app.midtrans.com https://app.sandbox.midtrans.com https://bid.g.doubleclick.net *.qiscus.com; connect-src 'self' *.myapps.co.id *.qiscus.com *.google-analytics.com *.doubleclick.net dialogflow.cloud.google.com;"
Header always set Referrer-Policy "strict-origin"
Header always set Feature-Policy: "vibrate 'none'"

Lalu sertakan berkas tersebut ke dalam konfigurasi httpd yang utama, yaitu di httpd.conf:

vim /etc/httpd/conf/httpd.conf

Tambahkan teks berikut di akhir baris:

Include "/etc/httpd/include/security.conf"

Simpan, lalu cek untuk memastikan tidak ada konfigurasi yang error dengan perintah:

apachectl configtest

Jika muncul keluaran Syntax OK, maka bisa dilanjut untuk restart service httpd-nya.

systemctl restart httpd
systemctl status httpd

Sekian catatan kali ini.