Perbaikan nginx.conf
Perbaikan nginx.conf
Section titled “Perbaikan nginx.conf”Ditambah location ACME, include TLS, dan server block 443.
Berkas: alat/hari-3/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;