Menyiapkan Go Lang Reverse Proxy dengan FreeBSD
Proksi terbalik (reverse proxy) adalah jenis server proksi yang menerima permintaan dari klien, lalu mengalihkannya ke satu atau beberapa server, dan kemudian meneruskan responsnya kembali. Ketika klien mengirimkan permintaan ke server proksi, proksi terbalik menerimanya dan kemudian mengalihkannya ke server yang sesuai dengan permintaan klien. Hal ini memungkinkan proksi untuk memproses permintaan dari beberapa klien sekaligus dan mendistribusikannya ke berbagai server dalam jaringan untuk pemrosesan yang lebih efisien.
Proksi terbalik juga dapat menjalankan fungsi lain, seperti membatasi akses berdasarkan alamat IP atau URL, mengonversi protokol, menyimpan data dalam cache, mengompresi data, dan sebagainya. Hal ini menjadikannya alat serbaguna untuk memproses data dalam jumlah besar dan memastikan keandalan serta keamanan jaringan.
Karakteristik proksi terbalik adalah proksi digunakan sebagai titik input untuk menghubungkan pengguna ke server yang terhubung ke proksi itu sendiri melalui logika bisnis. Proksi akan menentukan server mana yang akan menerima permintaan klien. Logika membangun jaringan di balik proksi tetap tersembunyi dari pengguna.
Dalam jaringan komputer skala besar maupun kecil, proksi terbalik adalah aplikasi yang berada di depan aplikasi back-end dan meneruskan permintaan klien, misalnya peramban Google Chrome, ke aplikasi tersebut. Memiliki proksi terbalik dapat membantu meningkatkan skalabilitas, kinerja, ketahanan, dan keamanan jaringan. Sumber daya yang dikembalikan ke klien tampak seolah-olah berasal dari server web itu sendiri.
Dalam artikel ini, kami akan menjelaskan cara membangun proksi terbalik dengan server FreeBSD. Meskipun artikel ini berjalan di FreeBSD, Anda dapat menerapkannya di Linux, Windows, atau MacOS.
1. Setup Reverse Proxy Go Lang
Sebagai langkah pertama dalam menjalankan proxy terbalik, pastikan aplikasi GO telah terinstal di server FreeBSD Anda. Jika GO belum terinstal, jangan berharap dapat menjalankan proxy terbalik.
Baca artikel kami sebelumnya tentang cara menginstal GO di server FreeBSD.
Fitur utama dari reverse proxy yang akan kita buat adalah:
-
Reverse Proxying
a. Load Balancing b. Active Healthchecks
-
File Server
a. Browsing Directories
b. Serving Static Sites
- HTTP Response Header Modification.
-
Authentication
a. Basic HTTP Auth
b. Key Auth
- Optional TLS Support.
- URL Rewrites.
Skema proxy terbalik ini adalah sebagai berikut: untuk backend, kami menggunakan Aplikasi Web Node.js dengan IP 127.0.0.1 Port 3000, dan untuk proxy terbalik, kami menggunakan server Go Lang dengan IP 192.168.5.2 Port 8585.
Setelah membuat skema proxy terbalik, buat direktori kerja untuk menyimpan semua data proxy terbalik Anda.
root@ns7:~ # cd /usr/local/etc
root@ns7:/usr/local/etc # mkdir -p Go-ReverseProxy-FreeBSD
root@ns7:/usr/local/etc # cd Go-ReverseProxy-FreeBSD
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD #
Setelah itu, buat file "gargoyle.go", sebagai file konfigurasi untuk proxy terbalik.
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # touch gargoyle.go
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # chmod +x gargoyle.go
Pada file "/usr/local/etc/gargoyle.go", masukkan skrip di bawah ini.
package main
import (
"os"
"github.com/unixwinbsd/Go-ReversePRoxy-FreeBSD/internal/server"
)
func main() {
var configFile string
if len(os.Args) > 1 {
configFile = os.Args[1]
}
if configFile == "" {
configFile = "./config.json"
}
server.Start(configFile)
}
Kita lanjutkan dengan membuat direktori internal, yang berisi direktori konfigurasi, penyeimbang beban, proksi terbalik, dan server.
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # mkdir -p internal/config
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # mkdir -p internal/loadbalancer
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # mkdir -p internal/reverseproxy
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # mkdir -p internal/server
Kita lanjutkan dengan membuat direktori bin, untuk menyimpan berkas konfigurasi JSON. Pada direktori bin, kita buat berkas bernama "config.json".
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # mkdir -p bin
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # cd bin
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD/bin # touch config.json
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD/bin # chmod +x config.json
Isi skrip dari file "/usr/local/etc/go-reverse-proxy/bin/config.json" dapat anda lihat seperti contoh di bawah ini.
[
{
"source": "192.168.5.2:8585",
"reverse_proxy": {
"targets": ["http://127.0.0.1:3000"]
}
}
]
[
{
"source": "192.168.5.2:8585",
"reverse_proxy": {
"targets": [
"http://127.0.0.1:3000"
],
"lb_algorithm": "round-robin",
"health_check": {
"enabled": true,
// relative path for healthcheck requests, default: ""
"path": "/health",
// time after which each healthcheck starts, required, unit: seconds
"interval": 10,
// HTTP request timeout for requests to target servers, default: 5, unit: seconds
"timeout": 15
}
}
}
]
[
{
"source": "192.168.5.2:8585",
"fs": {
"path": "/root/.cache/pypoetry/index/reverseproxy/gargoyle/bin"
}
}
]
[
{
"header": {
// map of HTTP headers to add
"add": {
"Access-Control-Max-Age": "86400"
},
// list of HTTP headers to remove
"remove": ["Served-By"]
}
}
]
Supported Methods: `basic_auth`, `key_auth`
[
{
"auth": {
// map of username, hashes
"basic_auth": {
"tinfoil": "JDJhJDEwJHB3YWI3YTJPVmxPTG1pTjlaSG5VaU9NM2tUZWZWaTFrSGR4bFg3VXVXTGVpcWkydVA2L2VX",
"knight": "JDJhJDEwJFB1ZVRaL2dFL1RDS1RxbFc5dTdBYWVEc245OTVuS3FPdGJjeGpXQ3Q5T0RJSjRnT2dEU3lp"
}
}
}
]
[
{
"auth": {
"key_auth": {
// HTTP header to get the key from, default: X-Api-Key
"header": "X-Auth-Key",
"key": "some-secret-key"
}
}
}
]
Perhatikan skrip di atas. IP dan port menjelaskan server backend dan reverse proxy, seperti yang telah dijelaskan pada gambar di atas.
Kemudian, di folder internal, kita membuat file di setiap folder. Anda dapat melihat isi kode skrip dari file ini di repositori Github kami.
File berikutnya yang kita buat adalah "Makefile", file ini digunakan untuk membangun proyek proxy terbalik Anda.
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD/bin # cd ..
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # touch Makefile
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # chmod +x Makefile
Isi skrip dari file "/usr/local/etc/go-reverse-proxy/Makefile" seharusnya terlihat seperti ini.
GOROOT = $(shell go env GOROOT)
build:
@echo "> Building binary"
go build -o bin/unixwinbsd .
build-docker:
@echo "> Building Docker image"
docker build -t unixwinbsd .
gencert:
@echo "> Generating TLS cert"
mkdir -p .unixwinbsd
cd .unixwinbsd; go run "$(GOROOT)/src/crypto/tls/generate_cert.go" --rsa-bits=2048 --host=localhost
run:
@echo "> Starting unixwinbsd"
go run unixwinbsd.go
test:
@echo "> Running tests"
go test -v -race ./...
format:
@echo "> Formatting the source"
gofmt -d -e
clean:
@echo "> Cleaning up"
go clean -testcache
rm -rf tmp bin
.PHONY: build run format
2. Jalankan Proses Build Reverse Proxy
Sebelum kita menjalankan GO reverse proxy, lakukan perintah "make build" terlebih dahulu.
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # go mod init github.com/unixwinbsd/Go-ReversePRoxy-FreeBSD
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # go mod tidy
Lanjutkan dengan perintah berikut.
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # go get golang.org/x/crypto/bcrypt
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # go get github.com/unixwinbsd/Go-ReversePRoxy-FreeBSD/internal/reverseproxy
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # go get github.com/unixwinbsd/Go-ReversePRoxy-FreeBSD
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # go get github.com/unixwinbsd/Go-ReversePRoxy-FreeBSD/internal/server
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # go get github.com/unixwinbsd/Go-ReversePRoxy-FreeBSD/internal/config
Langkah terakhir adalah menjalankan perintah "make build" untuk membuat berkas bin proxy terbalik.
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # make build
Perintah di atas akan membuat berkas eksekusi bernama "unixwinbsd", yang terletak di direktori "/usr/local/etc/Go-ReverseProxy-FreeBSD/bin".
Sekarang kita jalankan proksi terbalik.
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD # cd bin
root@ns7:/usr/local/etc/Go-ReverseProxy-FreeBSD/bin # ./unixwinbsd
2024/01/07 19:10:12 INFO: Starting reverse proxy on 192.168.5.2:8585
Sebelum menjalankan perintah "/", pastikan server Aplikasi Web Node.js Anda sudah berjalan. Untuk melihat hasilnya, buka Google Chrome dan ketik perintah 192.168.5.2:8585. Lihat hasilnya.
Ini hanyalah beberapa contoh penggunaan proxy terbalik dengan bahasa Go. Kemampuan proxy-nya sangat handal dan stabil, jadi tidak ada salahnya menjalankannya di server FreeBSD anda.
