Installasi WordPress dengan Nginx sebagai Load Balancer

June 14, 2022

Sebelumnya saya mencoba untuk membuat web wordpress menggunakan topologi load balancer, kira-kira topologinya seperti gambar berikut.

Topologi

Name Service IP Address OS Type
LB Nginx 192.168.7.1 Ubuntu 20.04
DB MariaDB 192.168.7.5 Ubuntu 20.04
Web 01 Nginx 192.168.7.6 Ubuntu 20.04
Web 02 Nginx 192.168.7.7 Ubuntu 20.04
NFS NFS 192.168.7.8 Ubuntu 20.04

Silakan disimak langkah-langkah installasi-nya.

Install service yang dibutuhkan.

Install nginx pada server LB
apt update -y
apt install nginx -y
Install nginx, php dan nfs client pada server Web01 dan Web02.
apt update -y
apt install nginx -y
apt install php php-imagick php-fpm php-mbstring php-bcmath php-xml php-mysql php-common php-gd php-json php-cli php-curl php-zip -y
systemctl disable apache2
apt install nfs-common -y
Install MySQL atau MariaDB pada server DB.
apt update -y
apt install mariadb -y
Install nfs server pada server NFS.
apt update -y
apt install nfs-kernel-server

Konfigurasi

Pertama kita konfigurasi dulu untuk NFS nya.

Pada server NFS, buat directory untuk meletakan file wordpress.

mkdir data
cd data
wget https://wordpress.org/latest.tar.gz
apt install unzip -y
unzip latest.zip
chown -R nobody:nogroup wordpress/

Setup NFS sharing dengan cara ubah file /etc/exports, dan masukan file baris konfigurasi berikut:

/root/data/wordpress 192.168.7.6(rw,sync,no_root_squash,no_subtree_check)
/root/data/wordpress 192.168.7.7(rw,sync,no_root_squash,no_subtree_check)

Ganti ip address diatas dengan ip address kalian

Restart service nfs server

systemctl restart nfs-kernel-server
Kedua kita konfigurasi Web01 dan Web02

Mount nfs server pada kedua VM Web.

mkdir -p /var/www/wordpress
mount 192.168.7.8:/root/data/wordpress /var/www/wordpress

Cek dengan df -Th untuk melihat apakah sudah berhasil di mount dengan benar.

Masukan baris berikut pada /etc/fstab agar mounting otomatis apabila server mengalami restart.

192.168.7.8:/root/data/wordpress /var/www/wordpress nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0

Ubah owner dan permission dari docroot wordpress.

chown -R www-data:www-data /var/www/wordpress
cd /var/www/wordpress
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

Buat konfigurasi nginx pada /etc/nginx/conf.d/wordpress.conf

vim /etc/nginx/conf.d/wordpress.conf

Masukan konfigurasi berikut dan sesuaikan.

server {
 listen 80;
 server_name domain.com;
 root /var/www/wordpress/;
 index index.php index.html index.htm index.nginx-debian.html;

 location / {
  try_files $uri $uri/ /index.php;
 }

 location ~ ^/wp-json/ {
  rewrite ^/wp-json/(.*?)$ /?rest_route=/$1 last;
 }

 location ~* /wp-sitemap.*\.xml {
  try_files $uri $uri/ /index.php$is_args$args;
 }

 error_page 404 /404.html;
 error_page 500 502 503 504 /50x.html;

 client_max_body_size 20M;

 location = /50x.html {
  root /usr/share/nginx/html;
 }

 location ~ \.php$ {
  fastcgi_pass unix:/run/php/php7.4-fpm.sock;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include fastcgi_params;
  include snippets/fastcgi-php.conf;
 }

 gzip on;
 gzip_vary on;
 gzip_min_length 1000;
 gzip_comp_level 5;
 gzip_types application/json text/css application/x-javascript application/javascript image/svg+xml;
 gzip_proxied any;

 location ~* \.(jpg|jpeg|gif|png|webp|svg|woff|woff2|ttf|css|js|ico|xml)$ {
    access_log        off;
    log_not_found     off;
    expires           360d;
 }

 location ~ /\.ht {
   access_log off;
   log_not_found off;
   deny all;
 }

 access_log /var/log/nginx/wp-access.log combined;
 error_log /var/log/nginx/wp-error.log;
}

Cek konfigurasi nginx

root@web01:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Start nginx dan php-fpm

systemctl restart nginx
systemctl restart php7.4-fpm
systemctl enable nginx
systemctl enable php7.4-fpm

Selesai untuk Web01 dan Web02

Ketiga konfigurasi Database

Masuk ke console mysql dan create database serta grant user.

systemctl start mariadb
mysql
MariaDB [(none)]> create database wp_lb;
MariaDB [(none)]> CREATE USER 'wp_user_lb'@'192.168.7.6' IDENTIFIED BY 'Password12345@@@@';
MariaDB [(none)]> CREATE USER 'wp_user_lb'@'192.168.7.7' IDENTIFIED BY 'Password12345@@@@';
MariaDB [(none)]> GRANT ALL ON wp_lb.* to 'wp_user_lb'@'192.168.7.6';
MariaDB [(none)]> GRANT ALL ON wp_lb.* to 'wp_user_lb'@'192.168.7.7';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> quit;
Keempat konfigurasi nginx Load balancer

Buat konfigurasi /etc/nginx/conf.d/wordpress.conf.

vim /etc/nginx/conf.d/wordpress.conf

Masukan konfigurasi berikut:

upstream wp_backend {
  least_conn;
  server 192.168.7.6:80;
  server 192.168.7.7:80;
}

server {
 listen 80;
 server_name domain.com;

 location / {
  proxy_pass http://wp_backend;
  proxy_set_header X-Real-IP  $remote_addr;
  proxy_set_header X-Forwarded-For $remote_addr;
  proxy_set_header Host $host;
 }

 access_log /var/log/nginx/wp-access.log combined;
 error_log /var/log/nginx/wp-error.log;
}

Cek konfigurasi menggunakan nginx -t, jika sudah silakan start nginx.

nginx -t
systemctl restart nginx

Konfigurasi WordPress

Setelah semuanya selesai, silakan akses wordpress melalui browser dan konfigurasi mulai dari input database sampai konfigurasi user-nya.

Selesai.