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.Out이targetURL.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)
},
}