Migrasi WordPress dari VPS lama ke VPS baru DENGAN DOMAIN BARU

Kali ini saya akan migrasi wordpress dari VPS lama ke VPS baru yang menggunakan web server Apache PHP7.4 dan database MariaDB, selain itu saya juga akan mengubah domain wordpress lama menggunakan domain baru di VPS baru

Dari VPS lama

Stop terlebih dahulu layanan apache agar proses backup tidak terganggu

sudo systemctl stop apache2

Backup

Copy atau kompress direktori tempat anda menginstall wordpress

zip -rv /home/fariz/wordpress-backup/wordpress.zip /var/www/html/wordpress/

Backup database wordpress

mysqldump -u username -pPassword wordpress > wordpress.sql

Setelah itu akan menghasilkan file wordpress.sql

Konfigurasi DNS

Arahkan A Record domain ke IP server baru dan masukkan alias www

Contohnya seperti ini:

contoh dns management

Di VPS baru

Instalasi

apt update
apt upgrade

Install Apache

apt install apache2

(preview) yang terinstall

apache2-bin/focal-updates,focal-security,now 2.4.41-4ubuntu3.1 amd64 [installed,automatic]
apache2-data/focal-updates,focal-security,now 2.4.41-4ubuntu3.1 all [installed,automatic]
apache2-utils/focal-updates,focal-security,now 2.4.41-4ubuntu3.1 amd64 [installed,automatic]
apache2/focal-updates,focal-security,now 2.4.41-4ubuntu3.1 amd64 [installed]
libapache2-mod-php7.4/focal-updates,focal-security,now 7.4.3-4ubuntu2.4 amd64 [installed,automatic]
libapache2-mod-php/focal,now 2:7.4+75 all [installed]

Install PHP

sudo apt install php

Atau jika ingin menggunakan php 7.4

sudo apt -y install php7.4

(preview) yang terinstall

libapache2-mod-php7.4/focal-updates,focal-security,now 7.4.3-4ubuntu2.4 amd64 [installed,automatic]
libapache2-mod-php/focal,now 2:7.4+75 all [installed]
php-common/focal,now 2:75 all [installed,automatic]
php-mysql/focal,now 2:7.4+75 all [installed]
php7.4-cli/focal-updates,focal-security,now 7.4.3-4ubuntu2.4 amd64 [installed,automatic]
php7.4-common/focal-updates,focal-security,now 7.4.3-4ubuntu2.4 amd64 [installed,automatic]
php7.4-json/focal-updates,focal-security,now 7.4.3-4ubuntu2.4 amd64 [installed,automatic]
php7.4-mysql/focal-updates,focal-security,now 7.4.3-4ubuntu2.4 amd64 [installed,automatic]
php7.4-opcache/focal-updates,focal-security,now 7.4.3-4ubuntu2.4 amd64 [installed,automatic]
php7.4-readline/focal-updates,focal-security,now 7.4.3-4ubuntu2.4 amd64 [installed,automatic]
php7.4/focal-updates,focal-security,now 7.4.3-4ubuntu2.4 all [installed,automatic]
php/focal,now 2:7.4+75 all [installed]

Install extension/module

sudo apt -y install php-common php-mysql php-xml php-xmlrpc php-curl php-gd php-imagick php-cli php-dev php-imap php-mbstring php-opcache php-soap php-zip php-cli php-intl imagemagick git unzip zip libgd-dev libapache2-mod-php libphp-adodb

Atau jika ingin menginstall module php 7.4

sudo apt -y install php7.4-common php7.4-mysql php7.4-xml php7.4-xmlrpc php7.4-curl php7.4-gd php7.4-imagick php7.4-cli php7.4-dev php7.4-imap php7.4-mbstring php7.4-opcache php7.4-soap php7.4-zip php7.4-cli php7.4-intl imagemagick git unzip zip libgd-dev libapache2-mod-php libphp-adodb

Pengujian web server dan php

Buat sebuah file php untuk melihat informasi versi php yang dipakai

nano /var/www/html/info.php

Masukkan ini kedalamnya

<?php phpinfo( ); ?>

Lalu akses nama domain yang sudah di arahkan atau IP server menggunakan web browser

IPADDRESSatauDOMAIN
IPADDRESSatauDOMAIN/info.php

Hasil yang keluar kurang lebih seperti ini:

Halaman default apache
Halaman info.php

Konfigurasi

Konfigurasi directory default apache (WAJIB)

Ini agar permalink berfungsi dengan baik

Edit file 000-default.conf

sudo nano /etc/apache2/sites-available/000-default.conf

Tambahkan baris ini dibawah baris DocumentRoot /var/www/html

<Directory /var/www/namadomain.com>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>

Sehingga menjadi seperti berikut :

<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        <Directory /var/www/html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Membuat virtual host (optional jika tidak ingin menginstall di direktori default apache)

*Pastikan DNS sudah diarahkan ke IP server tujuan

Membuat direktori untuk virtual host (Host block)

mkdir /var/www/namadomain.com

Membuat file konfigurasi virtual host

cd /etc/apache2/sites-available/
nano namadomain.com.conf

Masukkan ini kedalamnya

<VirtualHost *:80>
    ServerName namadomain.com
    ServerAlias www.namadomain.com
    ServerAdmin [email protected]
    DocumentRoot /var/www/namadomain.com

    <Directory /var/www/namadomain.com>
        Options -Indexes +FollowSymLinks
        AllowOverride All
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/namadomain.com-error.log
    CustomLog ${APACHE_LOG_DIR}/namadomain.com-access.log combined
</VirtualHost>

Atau, yang lebih ringkas

<VirtualHost *:80>
    ServerName namamdomain.com    
    DocumentRoot /var/www/namadomain.com

    <Directory /var/www/namadomain.com>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    
    ErrorLog /var/log/apache2/namadomain.com_error.log
    CustomLog /var/log/apache2/namadomain.com_access.log combined
</VirtualHost>

Mengaktifkan konfigurasi virtualhost

sudo a2ensite namadomain.com.conf

Mengaktifkan modul rewrite (untuk permalink)

a2enmod rewrite

Cek syntax, apakah ada error/kesalahan penulisan

sudo apachectl configtest

Pastikan output yang keluar: Syntax OK

Restart apache

systemctl restart apache2

Memastikan didalam direktori /etc/apache2/sites-enabled/ sudah terdapat file konfigurasi namadomain.com.conf

ls /etc/apache2/sites-enabled/

Jika belum ada, buat symlink (symbolic link) file /etc/apache2/sites-available/namadomain.com.conf ke /etc/apache2/sites-enabled/

ln -s /etc/apache2/sites-available/namadomain.com.conf /etc/apache2/sites-enabled/
Pengujian virtual host

Buat sebuah file html lalu simpan didalam direktori virtual host

nano /var/www/namadomain.com/test.html

Masukkan ini kedalamnya

Selamat virtual host namadomain.com berhasil dibuat

Buat sebuah file php untuk melihat informasi versi php yang dipakai

nano /var/www/html/info.php

Masukkan ini kedalamnya

<?php phpinfo( ); ?>

Lalu akses menggunakan web browser

namadomain.com/test.hml
namadomain.com/info.php

Hasil yang keluar kurang lebih seperti ini:

tes.html
info.php

Memasang SSL (Optional)

Install Let’s Encrypt Certbot

apt install python3-certbot-apache -y	

Atau jika anda ingin menginstall certbot melalui snap (tidak disarankan)

snap install --classic certbot

Buat symbolic link (tidak perlu dilakukan jika memasang certbot melalui apt phython3 di atas)

ln -s /snap/bin/certbot /usr/bin/certbot

Pasang SSL (HTTPS)

certbot --apache

Lalu pilih situs yang akan dipasang SSL dengan memasukan nomor pilihan. Jika ada 2 situs yang ingin dipasangkan SSL pisahkan dengan <spasi>

contoh:

Saving debug log to /var/log/letsencrypt/letsencrypt.log

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: namadomain.com
2: blog.namadomain.com
3: www.blog.namadomain.com
4: www.namadomain.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1 4

Untuk letsencrypt terbaru tidak terdapat List domain dengan pilihan nomor, jadi kita harus mengetikkan domain secara manual, Dan jika ingin menambahkan lebih dari 1 domain maka harus dipisahkan menggunakan spasi. Contoh:

Please enter the domain name(s) you would like on your certificate (comma and/or
space separated) (Enter 'c' to cancel): farizanwar.my.id www.farizanwar.my.id

Atau dengan perintah berikut

certbot --apache -d namadomain.com -d www.namadomain.com

Jika muncul pertanyaan

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel):

Masukkan email untuk mendapatkan notifikasi jika masa berlaku sertifikat akan berakhir/kadaluwarsa

Jika muncul pertanyaan

Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

Jawab Y

Jika muncul pertanyaan

Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N

Jawab saja N

Untuk letsencrypt terbaru jika kita menginstal wordpress di default root document/directory apache muncul pertanyaan berikut:

We were unable to find a vhost with a ServerName or Address of www.farizanwar.my.id.
Which virtual host would you like to choose?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: 000-default.conf               |                       |       | Enabled
2: 000-default-le-ssl.conf        | farizanwar.my.id      | HTTPS | Enabled
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Dan kita pilih pilihan yang terdapat tulisan HTTPS, contoh diatas HTTPS terdapat pada nomor 2 maka kita pilih nomor 2

Restore wordpress

Ekstrak file zip hasil compress dari VPS lama

unzip wordpress.zip

Pindahkan sekaligus ubah nama direktori hasil eksrak kedalam direktori virtual host

mv wordpress /var/www/namadomain.com/

Ubah kepemilikan dan izin

chown -R www-data:www-data /var/www/namadomain.com/wordpress/
chmod -R 775 /var/www/namadomain.com/wordpress/

Instalasi, konfigurasi dan restore database

Instalasi MariaDB

sudo apt install mariadb-server

Konfigurasi

mysql_secure_installation

Jika muncul pertanyaan

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):

Tekan enter

Jika muncul pertanyaan

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y

Jawab Y enter, lalu masukkan password root mysql baru

Jika muncul pertanyaan

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y

Jawab Y

Jika muncul pertanyaan

Remove anonymous users? [Y/n] y

Jawab Y

Jika muncul pertanyaan

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y

Jawab Y

Jika muncul pertanyaan

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y

Jawab Y

Jika muncul pertanyaan

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y

Jawab Y

Membuat database untuk wordpress

Masuk/login kedalam mysql

mysql -u root -pkatasandi

Membuat database wordpress

create database namadbwordpress;

Membuat user untuk mengelola database wordpress

CREATE USER 'namauser'@'localhost' IDENTIFIED BY 'katasandi';

Mengizinkan user untuk mengelola database wordpress

GRANT ALL PRIVILEGES ON namadbwordpress.* TO 'namauser'@'localhost';
FLUSH PRIVILEGES;

Restore database

Pastikan sudah berada di direktori tempat menyimpan file .sql hasil backup dari vps lama, atau hafal full path direktori tempat menyimpan file .sql

mysql -u username -pPassword namadbwordpress < wordpress.sql

Konfigurasi wp-config.php

Edit file wp-config.php yang ada didalam direktori instalasi wordpress

nano /var/www/namadomain.com/wordpress/wp-config.php

Sesuaikan

define( 'DB_NAME', 'namadbwordpress' ); = dengan namadbwordpress yang baru dibuat tadi
define( 'DB_USER', 'namauser' ); = dengan nama user yang baru dibuat tadi
define( 'DB_PASSWORD', 'katasandi' ); = dengan kata sandi yang dibuat saat membuat user database tadi

Jika nama database nama user dan password database sama abaikan tahap diatas ini !!

Mengganti URL/Domain

Mengganti URL/Domain

Prasyarat

  • Pastikan mengetahui prefix tabel databse wordpress

Untuk mengetahui table_prefix lihat isi file wp-config.php yang terletak di direktori instalasi wordpress. Lihat pada baris $table_prefix =

Login kedalam mysql

mysql -u username -pkatasandi

Pilih database wordpress yang akan diganti domain/URL nya.

use namadbwordpress

Melihat table database

show tables;

Lihat nama domain ‘home’ saat ini

SELECT * FROM namaprefixwordpress_options WHERE option_name = 'home';

Ganti nilai option_value diatas dengan nama domain baru

UPDATE namaprefixwordpress_options SET option_value="http://domainbaru.com" WHERE option_name = "home";

Lihat nama domain ‘siteurl’ saat ini

SELECT * FROM namaprefixwordpress_options WHERE option_name = 'siteurl';

Ganti nilai option_value diatas dengan nama domain baru

UPDATE namaprefixwordpress_options SET option_value="http://domainbaru.com" WHERE option_name = "siteurl";

Mengganti/mengupadate link media/gambar

Pada saat kita migrasi dari vps lama ke vps baru link url (IP) media masih menggunakan url vps lama.

Contoh link url media yang rusak/menggunakn url vps lama

Gambar url media rusak

Untuk mengubah url media ketikkan perintah berikut di mysql/mariadb

Pilih database

use namadatabase;
UPDATE prefixwp_posts SET post_content = (REPLACE (post_content, 'urllama', 'urlbaru'));

Contoh

UPDATE namaprefixwp_posts SET post_content = (REPLACE (post_content, 'https://blog.warscloud.com', 'https://blog.warscloud.com'));

Atau

UPDATE namaprefixwp_posts SET post_content = (REPLACE (post_content, 'domainlama.com', 'domainbaru.com'));

Jika sebelumnya wordpress anda terletak dibawah root (/blog) dan ingin memindahkan nya ke root domain/ip dan mengubah wordpressnya menjadi https syntax nya sebagai berikut

UPDATE wpblogfariz_posts SET post_content = (REPLACE (post_content, 'https://blog.warscloud.com', 'https://farizanwar.my.id'));

Catatan:

Jika wordpress anda terletak dibawah (/) atau 10.5.1.1/blog atau namadomain.com/blog Maka tulis saja url awalnya 10.5.1.1 atau namadomain.com tanpa menuliskan /blog

Perhatikan juga perbedaan pada http:// dan https://

Mengaktifkan modul rewrite

modul rewrite berfungsi untuk permalink

a2enmod rewrite
systemctl restart apache2

Lalu coba akses menggunakan web browser, selesai

Keterangan artikel :

Tested on: Ubuntu server 20.04