Lewati ke konten utama
  1. Server/

Cara Setup Nginx + SSL Certbot untuk Website

Penulis
GezyTech
Menulis tentang AI, Linux, Server, Docker, dan teknologi lainnya.

TLDR
#

Nginx adalah web server ringan dan cepat yang digunakan oleh 30% website di dunia. Certbot adalah tool gratis dari Let’s Encrypt untuk memasang SSL/HTTPS otomatis. Artikel ini akan memandumu dari nol: instalasi Nginx, konfigurasi server block, pasang SSL gratis, hingga optimasi keamanan — semuanya dalam satu panduan.


Pendahuluan
#

Pernah membuka website dan melihat tulisan “Not Secure” di browser? Atau ingin website-mu menggunakan HTTPS tapi bingung caranya?

Nginx + Certbot adalah solusi yang paling banyak digunakan. Nginx menangani permintaan HTTP dengan cepat dan efisien, sementara Certbot menyediakan SSL certificate gratis dari Let’s Encrypt yang otomatis diperpanjang.

Kabar baiknya: semua gratis. Kamu hanya perlu domain dan VPS (atau server lokal) — sisanya bisa diikuti langkah demi langkah.

Panduan ini berdasarkan pengalaman langsung setup blog GezyTech di info.gezytech.web.id.


Konten Utama
#

1. Apa Itu Nginx?
#

Nginx (dibaca “engine-x”) adalah web server open-source yang dirancang untuk performa tinggi dan penggunaan memori rendah. Berbeda dengan Apache yang membuat koneksi baru per request, Nginx menggunakan arsitektur event-driven asynchronous yang bisa menangani ribuan koneksi simultan dengan satu thread.

Perbandingan Nginx vs Apache:

Fitur Nginx Apache
Arsitektur Event-driven Process-driven
Memori per koneksi Sangat rendah (~2.5 KB) Tinggi (~8-10 KB)
Static file serving Sangat cepat Cepat
Konfigurasi Sederhana Kompleks (.htaccess)
Load balancing ✅ Bawaan ❌ Perlu modul
Popularitas ~30% website ~25% website

2. Instalasi Nginx
#

Di Ubuntu/Debian
#

sudo apt update
sudo apt install nginx -y

# Cek status
sudo systemctl status nginx
# Seharusnya: active (running)

# Cek versi
nginx -v

Setelah instalasi, buka http://IP-VPS-mu di browser. Jika muncul halaman “Welcome to nginx”, instalasi berhasil.

Firewall (UFW)
#

sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status

3. Struktur Dasar Nginx
#

Path Fungsi
/etc/nginx/nginx.conf Konfigurasi utama
/etc/nginx/sites-available/ Tempat file konfigurasi website (virtual host)
/etc/nginx/sites-enabled/ Symlink ke sites-available yang aktif
/var/www/html/ Root folder default
/var/log/nginx/access.log Log akses
/var/log/nginx/error.log Log error

4. Membuat Server Block (Virtual Host)
#

Server block di Nginx setara dengan VirtualHost di Apache. Untuk setiap website, buat file konfigurasi terpisah.

Step 1: Buat folder website
#

sudo mkdir -p /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/example.com/html

Step 2: Buat file index.html
#

echo '<h1>Website Saya!</h1>' > /var/www/example.com/html/index.html

Step 3: Buat konfigurasi server block
#

sudo nano /etc/nginx/sites-available/example.com

Isi dengan:

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location /robots.txt {
        add_header Cache-Control "no-cache";
    }

    location ~* \.(css|js|png|jpg|jpeg|svg|gif|ico|woff2?)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    error_page 404 /404.html;
}

Step 4: Aktifkan site
#

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

# Test konfigurasi
sudo nginx -t

# Reload Nginx
sudo systemctl reload nginx

Step 5: Test
#

Buka http://example.com di browser. Seharusnya muncul “Website Saya!” 🎉

5. Reverse Proxy untuk Aplikasi
#

Jika website-mu adalah aplikasi (Node.js, Python, dll.) yang berjalan di port tertentu, gunakan reverse proxy.

Contoh untuk aplikasi Bun/Hono di port 3000:

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Batasi ukuran upload (jika perlu)
    client_max_body_size 10M;
}

6. Instalasi Certbot untuk SSL Gratis
#

Certbot otomatis mendapatkan dan menginstall SSL certificate dari Let’s Encrypt.

Instalasi Certbot
#

# Untuk Ubuntu 20.04+
sudo apt install certbot python3-certbot-nginx -y

Dapatkan SSL Certificate
#

sudo certbot --nginx -d example.com -d www.example.com

Certbot akan:

  1. Memverifikasi kepemilikan domain
  2. Mendapatkan sertifikat dari Let’s Encrypt
  3. Mengupdate konfigurasi Nginx secara otomatis
  4. Mengatur redirect HTTP → HTTPS

Hasilnya, file konfigurasi Nginx akan berubah menjadi:

server {
    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    if ($host = example.com) {
        return 301 https://$host$request_uri;
    }

    listen 80;
    server_name example.com www.example.com;
    return 404;
}

Auto-renewal
#

Let’s Encrypt sertifikat berlaku 90 hari. Certbot otomatis mengatur cron job untuk renew.

# Test renewal
sudo certbot renew --dry-run

Cek cron job:

systemctl list-timers | grep certbot
# Atau
sudo crontab -l

7. Optimasi Keamanan SSL
#

Tambah konfigurasi keamanan di /etc/nginx/nginx.conf di dalam blok http { }:

# Keamanan SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;

# HTTP Strict Transport Security (HSTS)
add_header Strict-Transport-Security "max-age=63072000" always;

8. Konfigurasi untuk Static Site (Hugo)
#

Untuk blog Hugo, konfigurasi server block yang digunakan di GezyTech:

server {
    server_name info.gezytech.web.id;

    root /var/www/info.gezytech.web.id;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location = /robots.txt {
        add_header Cache-Control "no-cache";
    }

    location ~* \.(css|js|png|jpg|jpeg|svg|gif|ico|woff2?)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    error_page 404 /404.html;

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/info.gezytech.web.id/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/info.gezytech.web.id/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

9. Multiple Website dalam Satu Server
#

Kamu bisa menjalankan banyak website dalam satu VPS. Cukup buat file server block terpisah:

# Website 1
sudo nano /etc/nginx/sites-available/situs1.com
# Website 2
sudo nano /etc/nginx/sites-available/situs2.com

# Aktifkan keduanya
sudo ln -s /etc/nginx/sites-available/situs1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/situs2.com /etc/nginx/sites-enabled/

# Test dan reload
sudo nginx -t && sudo systemctl reload nginx

Semua website mendapat SSL masing-masing:

sudo certbot --nginx -d situs1.com -d www.situs1.com
sudo certbot --nginx -d situs2.com -d www.situs2.com

10. Troubleshooting Umum
#

Masalah Solusi
Nginx tidak start sudo nginx -t untuk cek error konfigurasi. Cek sudo journalctl -xeu nginx
Domain tidak muncul Pastikan DNS sudah mengarah ke IP VPS. Cek dengan dig example.com
SSL error sudo certbot renew --dry-run. Pastikan port 443 terbuka di firewall
403 Forbidden Cek permission folder: sudo chown -R www-data:www-data /var/www/example.com
Redirect loop Pastikan tidak ada double redirect. Cek konfigurasi Nginx tidak kontradiktif
Certbot tidak bisa verify Pastikan port 80 terbuka dari internet. Cek dengan nc -zv domain.com 80
SSL tidak auto-renew Cek sudo systemctl status certbot.timer

11. Perintah Nginx yang Sering Dipakai
#

# Service management
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx   # reload tanpa downtime
sudo systemctl status nginx

# Test konfigurasi
sudo nginx -t

# Lihat log
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

# Enable/disable site
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/example.com

Kesimpulan
#

Nginx + Certbot adalah kombinasi terbaik untuk website modern:

  • Nginx — web server cepat, ringan, dan stabil untuk production
  • Certbot — SSL gratis dari Let’s Encrypt dengan auto-renewal
  • Semua gratis — tidak perlu bayar untuk web server atau SSL

Yang sudah kamu pelajari:

  • Instalasi Nginx dan konfigurasi server block
  • Setup reverse proxy untuk aplikasi
  • Pasang SSL gratis dengan Certbot
  • Optimasi keamanan HTTPS
  • Multiple website dalam satu server
  • Troubleshooting umum

Langkah selanjutnya:

  1. Install Nginx di VPS-mu
  2. Buat server block untuk domainmu
  3. Pasang SSL dengan Certbot
  4. Deploy website atau aplikasi

Website GezyTech sendiri (info.gezytech.web.id) menggunakan setup persis seperti di artikel ini. Jadi kalau ada yang bingung, tinggal tanya! 🚀


Artikel ini ditulis berdasarkan pengalaman langsung setup GezyTech. Ditulis dengan bantuan AI dan telah diedit oleh tim GezyTech.