Lewati ke konten

Perbaikan nginx.conf

Ditambah location ACME, include TLS, dan server block 443.

Berkas: alat/hari-3/Praktik 11/perbaikan/nginx.conf

Praktik 11/perbaikan/nginx.conf
# =====================================================================
# Praktik 11 bagian 3 - nginx.conf yang mendukung HTTPS
#
# Versi modul (file latihan/nginx.conf) hanya punya `listen 80`. Akibatnya
# tiga tahap di Praktik 11 bagian 3 tidak bisa berhasil:
#
# Tahap 8 periksa jalur ACME -> 404 diharapkan, tetapi location-nya
# tidak ada sehingga permintaan
# diteruskan ke Next.js
# Tahap 9 certbot --webroot -> GAGAL: challenge tidak pernah sampai
# ke /opt/webgis/app/certbot-webroot
# Tahap 10 tulis tls/aktifkan.conf, lalu `nginx -s reload`
# -> berkas tidak pernah dibaca karena
# nginx.conf tidak meng-include apa pun
#
# Berkas ini menambahkan tiga hal itu: location ACME, include untuk berkas
# TLS, dan header X-Forwarded-Proto yang benar di jalur HTTPS.
#
# Perubahan pada docker-compose.yml yang menyertainya:
# nginx:
# ports:
# - "80:80"
# - "443:443" # <-- WAJIB, kalau tidak HTTPS tak terjangkau
# volumes:
# - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
# - ./certbot-webroot:/var/www/certbot:ro # <-- webroot ACME
# - ./tls:/etc/nginx/tls:ro # <-- berkas aktifkan.conf
# - /etc/letsencrypt:/etc/letsencrypt:ro # <-- sertifikat Let's Encrypt
# =====================================================================
server {
listen 80;
server_name _;
# ------------------------------------------------------------------
# ACME challenge HARUS ditangani sebelum location / mana pun.
# Certbot menulis berkas ke webroot ini, lalu Let's Encrypt mengambilnya
# lewat http://<domain>/.well-known/acme-challenge/<token>.
# Cocokkan direktori webroot di sini dengan -w pada perintah certbot.
# ------------------------------------------------------------------
location ^~ /.well-known/acme-challenge/ {
root /var/www/certbot;
default_type "text/plain";
try_files $uri =404;
}
location = / {
return 302 /portal;
}
# Diarahkan langsung ke bentuk kanonik tanpa slash, karena GeoServer
# mengalihkan /geoserver/web/ ke /geoserver/web.
location = /geoserver {
return 302 /geoserver/web;
}
# Nama service di-resolve saat ada permintaan, bukan saat Nginx start.
# Tanpa pola ini, Nginx menolak start dengan "host not found in upstream"
# selama container nextjs belum ada. Padahal geoserver dan nginx sengaja
# dinyalakan lebih dahulu, sebelum image nextjs dibangun.
location /geoserver/ {
resolver 127.0.0.11 valid=10s ipv6=off;
set $geoserver_upstream http://geoserver:8080;
rewrite ^/geoserver/(.*)$ /geoserver/$1 break;
proxy_pass $geoserver_upstream;
proxy_set_header Host $http_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;
proxy_set_header X-Forwarded-Host $http_host;
proxy_buffers 16 16k;
proxy_buffer_size 32k;
}
location / {
resolver 127.0.0.11 valid=10s ipv6=off;
set $nextjs_upstream http://nextjs:3000;
proxy_pass $nextjs_upstream;
proxy_http_version 1.1;
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;
}
}
# ---------------------------------------------------------------------
# Blok HTTPS.
#
# Semua konfigurasi 443 dikumpulkan di /etc/nginx/tls/aktifkan.conf dan
# di-include dari sini. Tahap 10 Praktik 11 bagian 3 sudah menulis berkas
# itu, jadi dengan include ini tahap tersebut langsung berfungsi.
#
# Berkas tersebut berisi:
# listen 443 ssl;
# ssl_certificate /etc/letsencrypt/live/<subdomain>/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/<subdomain>/privkey.pem;
#
# Nginx akan gagal start bila berkas sertifikat belum ada, sehingga blok ini
# baru boleh disertakan SETELAH certbot berhasil (Tahap 9 selesai).
# Karena itu include ditulis dengan wildcard: sebelum sertifikat terbit,
# direktori tls/ kosong dan tidak ada berkas yang di-include.
#
# PENTING: konfigurasi di bawah ini adalah server block terpisah, bukan
# sekadar menambah baris di blok atas. Kalau hanya menulis "listen 443 ssl"
# di dalam blok yang sama, Nginx akan melayani 443 dengan konfigurasi yang
# sama tetapi tanpa parameter SSL yang benar.
#
# Cara pakai yang disarankan: biarkan berkas ini apa adanya, dan pastikan
# berkas tls/aktifkan.conf memuat SELURUH server block 443, bukan hanya
# dua baris listen dan ssl_certificate seperti pada modul. Contoh isi yang
# benar ada di perbaikan/aktifkan.conf.contoh.
# ---------------------------------------------------------------------
include /etc/nginx/tls/*.conf;