Membangun Sebuah Web Server Menggunakan Raspberry Pi

Sejak dirilis pertama kali pada tanggal 24 February 2012, Raspberry Pi sudah digunakan untuk berbagai keperluan. Salah satunya adalah digunakan sebagai web server. Tulisan ini berisi tutorial tentang Membangun Sebuah Web Server Menggunakan Raspberry Pi. Ini mengikuti permintaan teman-teman sekalian yang meminta segera di post kesini, jadinya kemudian saya percepat.

Alat dan perlengkapan :

  • Raspberry Pi 3 (Disini saya menggunakan Raspberry Pi 3 Model B yang sudah terinstall Rasbian)
  • Public IP (Menggunakan public IP dari indihome)
  • Sebuah domain atau subdomain (Untuk artikel ini saya akan menggunakan subdomain dari bukancoder.co)
  • Koneksi internet (Disini saya menggunakan indihome 40 Mbps/s
  • Nginx
  • PHP 7
  • MySQL
  • SSL by Lets Encrypt

Penampakan untuk Raspberry yang akan kita gunakan untuk tutorial ini :

Pengaturan Port Forwarding

Karena disini kita menggunakan Raspberry sebagai server, maka kita membutuhkan sebuah public IP dan juga port yang dibutuhkan sudah dalam keadaan sudah dibuka. Pertama kita cari tahu dulu primary IP dan Public IP Raspberry yang sudah terkoneksi ke internet.

ip a | grep glo | awk '{print $2}' | head -1 | cut -f1 -d/;wget -q -O - http://icanhazip.com/ | tail

Akan muncul output seperti ini :

Lalu kemudian kita login ke modem admin panel untuk konfigurasi port forwarding. Berikut port yang akan kita gunakan :

  • Port 22 (Untuk SSH)
  • Port 80 (Untuk HTTP)
  • Port 443 (Untuk SSL/HTTPS)

Untuk pengguna indihome silahkan login melalui http://192.168.1.1/ setelah login langsung ke Application -> Port Forwarding.

Pengaturannya kira-kira akan seperti itu untuk membuka port 22. Setelah itu dilanjutkan untuk membuka port 80 dan juga 443. Maka hasil akhirnya akan seperti ini :

Remote SSH Raspberry

Dari terminal raspberry. Ketikkan command berikut untuk konfigurasi password Raspberry :

sudo raspi-config

Setelah itu tekan enter.

Tekan enter lagi. Lalu setup password yang akan digunakan.

Setelah itu silahkan langsung dicoba untuk koneksi melalui SSH dari local ataupun outside local network.

ssh pi@PublicIPKamu 22

Silahkan replace @PublicIPkamu dengan IP public sesuai dengan punya kita masing-masing dan login menggunakan password yang sudah kita set tadi. Jika berhasil maka tampilannya akan seperti ini :

Mengarahkan domain ke Raspberry

Selanjutnya yang perlu kita lakukan adalah mengarahkan domain atau subdomain yang akan kita gunakan ke public IP yang telah kita dapatkan tadi. Buatlah A record yang kemudian diarahkan ke public IP kita tadi :

Install Nginx

Disini kita akan menggunakan Nginx sebagai web server. Berikut untuk step by step konfigurasi Nginx

sudo apt-get update
sudo apt-get install nginx

Setelah berhasil kemudian jalankan Nginx :

sudo service nginx start

Install PHP

sudo apt-get install php-fpm php-mysql
sudo service php-fpm start

Install MySQL

sudo apt-get install mysql-server
mysql_secure_installation

Konfigurasi Virtual Host Nginx

Sebelumnya domain sudah kita arahkan ke public ip Raspberry kita tadi. Maka yang perlu kita lakukan selanjutnya adalah membuat virtual host Nginx untuk domain kita tadi. Untuk tutorial ini kita akan menggunakan subdomain raspi.bukancoder.co.

sudo nano /etc/nginx/sites-available/raspi.bukancoder.co.conf

Kemudian replace dengan file conf berikut ini :

        server {
        listen 443 http2 ssl;
        listen 80;

        server_name raspi.bukancoder.co;
        
        if ($scheme = http) {
        return 301 https://$server_name$request_uri;
        }

        ssl_certificate /etc/letsencrypt/live/raspi.bukancoder.co/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/raspi.bukancoder.co/privkey.pem;

        ########################################################################
        # from https://cipherli.st/                                            #
        # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html #
        ########################################################################

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
        ssl_ecdh_curve secp384r1;
        ssl_session_cache shared:SSL:10m;
        ssl_session_tickets off;
        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.8.8 8.8.4.4 valid=300s;
        resolver_timeout 5s;
        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;
        add_header Hacktivity-Hint 0000-10000;
        ##################################
        # END https://cipherli.st/ BLOCK #
        ##################################

        ssl_dhparam /etc/ssl/certs/dhparam.pem;

        location ~ /.well-known {
                allow all;
        }
                          
    error_log /var/www/html/error.log;
    access_log /var/www/html/access.log;
    root /var/www/html;

    location / {
	      index index.php index.html index.htm;
    }

    location ~ .php$ {
	      include snippets/fastcgi-php.conf;
	      fastcgi_pass unix:/run/php/php7.0-fpm.sock;
	      fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;

    }
    }

Silahkan diganti untuk setiap line yang ada raspi.bukancoder.co dengan domain yang kamu gunakan. Setelah itu buat symbolic link antara sites-available dan sites-enabled.

sudo ln -s /etc/nginx/sites-available/raspi.bukancoder.co.conf /etc/nginx/sites-enabled/raspi.bukancoder.co.conf

Install dan Konfigurasi Let’s Encrypt

Agar website kita ketika diakses otomatis menggunakan SSL atau HTTPS, kita bisa menggunakan SSL gratis dari Let’s Encrypt

sudo apt-get install git
git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
cd /opt/letsencrypt
service nginx stop
install python-virtualenv python-pip
sudo -H ./letsencrypt-auto certonly --standalone -d raspi.bukancoder.co

Jika proses issue SSL telah berhasil, maka akan muncul output seperti ini :

Lalu jalankan kembali Nginx :

sudo service nginx start

Kemudian berpindah ke dir /var/www/html dan buatlah file index.php

cd /var/www/html
sudo nano index.php

Dan gunakan script berikut ini :

<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">
<title>Bukan Coder - Raspberry Projects</title>
<meta name="description" content="Raspberry projects by HackSys" />
<meta property="og:image" content="https://raspi.hacksys.id/thumb.jpg" />
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
<link rel="shortcut icon" href="https://hacksys.id/wp-content/uploads/2014/01/hacksys-logo.png"><link rel="apple-touch-icon" href="https://hacksys.id/wp-content/uploads/2014/01/hacksys-logo.png"><link rel="apple-touch-icon" sizes="120x120" href="https://hacksys.id/wp-content/uploads/2014/01/hacksys-logo.png"><link rel="apple-touch-icon" sizes="76x76" href="https://hacksys.id/wp-content/uploads/2014/01/hacksys-logo.png"><link rel="apple-touch-icon" sizes="152x152" href="https://hacksys.id/wp-content/uploads/2014/01/hacksys-logo.png">
<style type='text/css'>
body {
background-color:#2f3238; 
color:#CCCCCC; 
font-family: 'Courier New', Courier, monospace; 
font-size: 10pt; 
padding:5px;
}
		
		
	
a {
  color: #1abc89;
}

@media screen and (max-width:1000px) {
  
/*   body {
    background-color:#ddf;
  } */
  
  .item {
    width:33.3%;
  }

}


@media screen and (max-width:800px) {
  
/*   body {
    background-color:#cdd;
  } */
  
  .item {
    width:50%;
  }
  
  .item p {
  font-size:.8em;
  }

}

@media screen and (max-width:400px) {
  
/*   body {
    background-color:#ded;
  } */
  
  .item {
    width:100%;
  }

}

		</style>
	</head>
	<body>
	<center><pre>
  ___ ___                __      _________             
 /   |   \_____    ____ |  | __ /   _____/__.__. ______
/    ~    \__  \ _/ ___\|  |/ / \_____  <   |  |/  ___/
\    Y    // __ \\  \___|    <  /        \___  |\___ \ 
 \___|_  /(____  /\___  >__|_ \/_______  / ____/____  >
       \/      \/     \/     \/        \/\/         \/ 


,d88b.d88b,
88888888888
`Y8888888Y'
  `Y888Y'  
    `Y'    

__________                      ___.                               
\______   \_____    ____________\_ |__   __________________ ___.__.
 |       _/\__  \  /  ___/\____ \| __ \_/ __ \_  __ \_  __ <   |  |
 |    |   \ / __ \_\___ \ |  |_> > \_\ \  ___/|  | \/|  | \/\___  |
 |____|_  /(____  /____  >|   __/|___  /\___  >__|   |__|   / ____|
        \/      \/     \/ |__|       \/     \/              \/     


Halo, this website is for Raspberry Projects by HackSys
</pre>
<br></br>
<center> <pre><br>Copyright &copy 2018 <a href="https://hacksys.id">HackSys</a> | Made with <span class="fa fa-heart pulse2"></span> by <a href="https://teguh.co">Teguh Aprianto</a> </pre></center>

</html>

Sekarang silahkan coba akses subdomain atau domain yang kita gunakan tadi

Sekarang web kita berhasil diakses tanpa gangguan dan otomatis sudah menggunakan HTTPS/SSL.

Sedikit penjelasan jadi disini kita menggunakan Raspberry sebagai server untuk menampung seluruh proses dan juga file kita. Jika Raspberry masih dalam keadaan hidup dan seluruh proses Nginx dan PHP masih berjalan normal, maka website kita masih terus dapat diakses. Tapi jika Raspberry dalam keadaan mati, makan website kita tersebut tidak akan bisa diakes.

Sekian dari saya dan semoga tutorial Membangun Sebuah Web Server Menggunakan Raspberry Pi bermanfaat.