Nafies Luthfi

Life will always feel wonderful if we always think positively.

Install LEMP Stack pada Ubuntu Server 16.04

Bismillahirrahmanirrahim.

Sekarang kita akan menginstall LEMP Stack web server: Nginx, MariaDB, dan PHP 7.0 pada VPS (atau VM Instance) yang sudah kita punya. Sebenarnya artikel cara install web server pada Ubuntu Server sudah banyak bertebaran di internet, tetapi kali ini kita akan bahas installasi LEMP Stack dengan konfigurasi tambahan yang biasa saya terapkan :

  • Mengubah root directory project pada serverblock nginx.
  • Menambah user baru setara “root” pada MySQL.

Pada artikel ini, saya menggunakan Ubuntu Server 16.04 dari Google Cloud Engine, tetapi ini bisa diterapkan ke VPS dari provider lain, dengan catatan kita tidak menggunakan user “root”, tetapi menggunakan sudoer user.

Baik kita mulai.

Install Nginx 1.10.3

SSH ke VPS atau VM Instance, kemudian:

sudo apt update
sudo apt install nginx

Ketika selesai, bisa kita cek di browser dengan membuka IP Address VPS kita. Misal: http://35.198.238.82 (tampil Welcome to nginx!).

Hallo Nginx

Mengubah directory root nginx

Secara default, nginx melayani project yang berada pada direktori /var/www/html. Tetapi untuk akses dan menjalankan perintah ke direktori itu, kita harus menggunakan sudo (karena kita tidak menggunakan user root).

Agar kita tidak repot menggunakan sudo, kita ubah direktori root nginx dari /var/www/html ke /home/username/www. Di mana username adalah sudoer user di server ini.

Caranya, edit serverblock default nginx.

$ sudo vim /etc/nginx/sites-available/default

Ubah 2 baris berikut ini :

# Ubah sesuai dengan direktori yang akan kita gunakan
root /home/username/www;

# ubah sesuai dengan IP Address Server atau domain
server_name 35.198.238.82;

Simpan, kemudian buat direktori sesuai dengan yang diatur pada serverblock, yaitu /home/username/www.

# Cek direktori saat ini.
$ pwd
/home/username

# Buat direktori sesuai dengan yang diatur pada serverblock.
$ mkdir www

# Test nginx (jika OK, maka serverblock sudah benar).
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

# Reload nginx.
$ sudo service nginx reload

Sekarang kita cek, apakah perubahan yang kita buat berhasil? Buat buat file index.html pada direktori www.

$ vim www/index.html

Isi file index.html, misal :

<h1>Dilayani dari direktori /home/username/www</h1>

Tes via browser http://35.198.238.82, jika tampil tulisan di file index.html tadi, berarti perubahan root directori nginx berhasil.

Update nginx directory root

Sip, selesai install nginx dengan project root pada home directory kita.

Install PHP 7.0

Lanjutkan install PHP 7.0 beserta extensionnya (yang diperlukan oleh Laravel).

$ sudo apt install php-fpm php-mysql php-mbstring zip unzip php7.0-zip gzip php-xml php-gd php-curl

Setting nginx serverblock default agar melayani PHP.

$ sudo vim /etc/nginx/sites-available/default
        # Tambahkan index.php pada baris index
        index index.php index.html index.htm index.nginx-debian.html;

        # Uncomment pada location ~ \.php$ seperti di bawah
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;

        #       # With php7.0-cgi alone:
        #       fastcgi_pass 127.0.0.1:9000;
                # With php7.0-fpm:
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }

        # Uncomment untuk menolak akses .htaccess
        location ~ /\.ht {
                deny all;
        }

Serverblock lengkapnya bisa dilihat pada gist ini.

Simpan, kemudian reload nginx.

# Test nginx (jika OK, maka serverblock sudah benar).
$ sudo nginx -t

# Reload nginx.
$ sudo service nginx reload

Edit php.ini

$ sudo vim /etc/php/7.0/fpm/php.ini

Ubah baris ini cgi.fix_pathinfo menjadi 0, hilangkan # jika ada.

cgi.fix_pathinfo=0

Simpan, kemudian restart PHP-FPM.

$ sudo service php7.0-fpm restart

Setup PHP-FPM untuk nginx sudah beres, sekarang kita tes apakah konfigurasi berhasil.

Uji Coba PHP

Buat file info.php pada direktori www.

$ vim www/info.php

Isi file dengan script phpinfo().

<?php phpinfo();

Simpan, kemudian tes di browser: http://35.198.238.82/info.php. Seharusnya tampil info lengkap PHP pada server kita.

PHP 7.0 info

# Kalau sudah tampil seperti di atas,
# hapus file info.php demi keamanan.
$ rm www/info.php

Selesai install PHP 7.0, kita lanjutkan install MariaDB.

Install MariaDB 10.2

Secara default, pada ubuntu server 16.04 kita mendapatkan MariaDB 10.0. Tetapi kali ini kita akan menginstall MariaDB 10.2.

$ sudo apt-get install software-properties-common
$ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
$ sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mirror.poliwangi.ac.id/mariadb/repo/10.2/ubuntu xenial main'
$ sudo apt update
$ sudo apt install mariadb-server

Cek versi MariaDB :

$ mysql -V
mysql  Ver 15.1 Distrib 10.2.13-MariaDB ...

Sekarang kita konfigurasi keamanannya :

$ sudo mysql_secure_installation

# Ikut langkahnya, dengan menjawab pertanyaan
# 
# Enter current password for root (enter for none): 
# Change the root password? [Y/n] Y
# New password: 
# Re-enter new password: 
# Password updated successfully!
# Remove anonymous users? [Y/n] Y
# Disallow root login remotely? [Y/n] Y
# Remove test database and access to it? [Y/n] Y
#  ... Success!
# 
# Cleaning up...
# 
# All done!  If you've completed all of the above steps, your MariaDB
# installation should now be secure.
# 
# Thanks for using MariaDB!

Sip, selesai install MariaDB 10.2.

Membuat User MySQL dengan root privileges

Setiap installasi MariaDB/MySQL, kita memiliki user root. Sama halnya dengan user root pada Ubuntu, sebaiknya kita tidak menggunakan user ini untuk bekerja. Kita buat user baru dengan hak akses yang sama dengan root.

# Masuk (login) ke MySQL dengan user root.
$ sudo mysql -uroot -p

# Buat user dengan nama 'usernamebaru' dan password 'supersecurepassword'
MariaDB [(none)]> CREATE USER 'usernamebaru'@'localhost' IDENTIFIED BY 'supersecurepassword';

# Grant privilleges untuk user baru
MariaDB [(none)]> GRANT ALL PRIVILEGES ON * . * TO 'usernamebaru'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;

# Untuk melihat semua user yang ada
MariaDB [(none)]> SELECT User,Host FROM mysql.user;

# Selesai, exit MariaDB/MySQL
MariaDB [(none)]> exit;

Sehingga nanti aplikasi PHP yang kita deploy pada server ini dapat menggunakan database dengan username usernamebaru dan password supersecurepassword, tidak perlu menggunakan user root.

Kesimpulan

Dengan installasi dan setup/konfigurasi di atas, maka kita akan memiliki :

  1. Nginx versi 1.10.3 dengan root directory /home/username/www.
    (Tidak perlu sudo untuk menjalankan composer).
  2. PHP versi 7.0.
  3. Database MariaDB versi 10.2.
    Dengan username usernamebaru dan password supersecurepassword.
  4. Database lebih aman karena :
    • Memiliki user mysql baru yang hanya kita yang tahu.
    • Kita blok akses database secara remote untuk user root.

Demikian teman-teman, seperti ini proses installasi LEMP Stack yang biasa saya lakukan untuk VPS Ubuntu Server 16.04. Cara dan proses di atas sebatas sepengetahuan saya yang sangat sedikit dalam hal keamanan server. Mudah-mudahan kedepannya kita bisa bahas tentang keamanan ubuntu server jika sudah ketemu ilmu baru. :D

Terima kasih sudah berkenan membaca.

Sumber Bacaan