본문으로 건너뛰기

HTTP Reverse Proxy 설정 가이드

httputil.ReverseProxy

import (
"net/http"
"net/http/httputil"
)

Director or Rewrite 설정

경고

Director와 Rewrite 중 하나만 설정해야 합니다.

&httputil.ReverseProxy{
Director: func(r *http.Request) {
// target으로 갈 수 있도록 요청 수정
},
}
&httputil.ReverseProxy{
Rewrite: func(pr *httputil.ProxyRequest) {
// target으로 갈 수 있도록 요청 수정
},
}
  • pr.SetURL(targetURL)을 사용하면 pr.OuttargetURL.Scheme://targetURL.Host/targetURL.Path/pr.In.Path?target.RawQuery&pr.In.RawQuery로 설정됩니다.
  • pr.SetXForwarded()

httputil.NewSingleHostReverseProxy

// rp := &httputil.ReverseProxy{
// Rewrite: func(pr *httputil.ProxyRequest) {
// pr.SetURL(targetURL)
// pr.Out.Host = pr.In.Host
// },
// }
rp := httputil.NewSingleHostReverseProxy(targetURL)

OpenTelemetry Transport

import (
"net/http"

"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
)

&httputil.ReverseProxy{
Transport: otelhttp.NewTransport(
http.DefaultTransport,
otelhttp.WithFilter(func(r *http.Request) bool {
spanContext := trace.SpanContextFromContext(r.Context())
return spanContext.IsValid() && spanContext.IsSampled()
}),
),
}

ErrorHandler

&httputil.ReverseProxy{
ErrorHandler: func(w http.ResponseWriter, r *http.Request, err error) {
switch {
case errors.Is(err, syscall.ECONNREFUSED):
// ...
default:
// ...
}

http.Error(w, "service is unavailable", http.StatusServiceUnavailable)
},
}