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 © 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.