Nginx를 여러 Unix 소켓에 대한 프록시로 사용
9513 단어 gonginxunixsocket
경우에 따라 단일 시스템에서 많은 (인스턴스) 응용 프로그램을 실행하려고 할 수 있습니다. 각 인스턴스는 제한된 HTTP를 통해 내부 정보(예: Prometheus
/metrics
, 프로파일링/디버그 처리기)를 제공해야 할 수 있습니다.인스턴스 수가 증가하면 충돌 없이 청취 포트를 프로비저닝하는 것이 부담이 됩니다. 대조적으로 Unix 소켓을 사용하면 더 많은 투명성(읽을 수 있는 파일 이름)과 확장성(고유한 이름을 쉽게 만들 수 있음)이 가능합니다.
다음은 Unix 소켓으로 사소한 HTTP 서비스를 제공하는 Go로 작성된 작은 데모 프로그램입니다.
package main
import (
"context"
"flag"
"io/fs"
"log"
"net"
"net/http"
"os"
"os/signal"
)
func main() {
var socketPath string
flag.StringVar(&socketPath, "socket", "./soc1", "Path to unix socket.")
flag.Parse()
if socketPath == "" {
flag.Usage()
return
}
listener, err := net.Listen("unix", socketPath)
if err != nil {
log.Println(err.Error())
return
}
// By default, unix socket would only be available to same user.
// If we want access it from Nginx, we need to loosen permissions.
err = os.Chmod(socketPath, fs.ModePerm)
if err != nil {
log.Println(err)
return
}
httpServer := http.Server{
Handler: http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
log.Println(request.URL.String())
if _, err := writer.Write([]byte(request.URL.String())); err != nil {
log.Println(err.Error())
}
}),
}
// Setting up graceful shutdown to clean up Unix socket.
go func() {
sigint := make(chan os.Signal, 1)
signal.Notify(sigint, os.Interrupt)
<-sigint
if err := httpServer.Shutdown(context.Background()); err != nil {
log.Printf("HTTP Server Shutdown Error: %v", err)
}
}()
log.Printf("Service is listening on socket file %s", socketPath)
err = httpServer.Serve(listener)
if err != nil {
log.Println(err.Error())
return
}
}
이제 별도의 셸에서 몇 가지 인스턴스를 실행해 보겠습니다.
./soc -socket /home/ubuntu/soc1
./soc -socket /home/ubuntu/soc2
다음은 URL 접두사가 있는 인스턴스를 제공하는 최소 Nginx 구성입니다.
http://my-host/soc1/foo/bar
, 스트립 경로 접두어 /soc1
를 수신하고 /foo/bar
를 soc1
로 전달합니다.server {
listen 80 default;
location /soc1/ {
proxy_pass http://soc1/;
}
location /soc2/ {
proxy_pass http://soc2/;
}
}
upstream soc1 {
server unix:/home/ubuntu/soc1;
}
upstream soc2 {
server unix:/home/ubuntu/soc2;
}
모든 Unix 소켓은
upstream
로 정의되며 /location
에 server
문이 있습니다.다음과 같이
/location
에서 직접 Unix 소켓을 사용할 수도 있습니다. location /soc1/ {
proxy_pass http://unix:/home/ubuntu/soc1;
}
그러나 후행
/
을 proxy_pass
에 추가할 수 없다는 원치 않는 제한이 있습니다. 이는 URL이 있는 그대로 전달됨을 의미합니다. soc1
는 /soc1/foo
대신 /foo
를 수신합니다.이러한 제한을 피하기 위해 명명된 업스트림을 사용하고 후행
/
을 proxy_pass
에 추가할 수 있습니다. location /soc1/ {
proxy_pass http://soc1/; # Mind trailing "/".
}
Reference
이 문제에 관하여(Nginx를 여러 Unix 소켓에 대한 프록시로 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/vearutop/using-nginx-as-a-proxy-to-multiple-unix-sockets-3c7a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)