Ingress Nginx Controller源码分析02-Nginx如何启动

cmd/nginx/main.go

main函数中调用ngx.Start()方法启动

	ngx := controller.NewNGINXController(conf, mc)

	mux := http.NewServeMux()
	registerHealthz(nginx.HealthPath, ngx, mux)
	registerMetrics(reg, mux)

	go startHTTPServer(conf.HealthCheckHost, conf.ListenPorts.Health, mux)
	go ngx.Start()

NewNGINXController中构造出NGINXController,包令命令行command

n := &NGINXController{
   isIPV6Enabled: ing_net.IsIPv6Enabled(),

   resolver:        h,
   cfg:             config,
   syncRateLimiter: flowcontrol.NewTokenBucketRateLimiter(config.SyncRateLimit, 1),

   recorder: eventBroadcaster.NewRecorder(scheme.Scheme, apiv1.EventSource{
      Component: "nginx-ingress-controller",
   }),

   stopCh:   make(chan struct{}),
   updateCh: channels.NewRingChannel(1024),

   ngxErrCh: make(chan error),

   stopLock: &sync.Mutex{},

   runningConfig: new(ingress.Configuration),

   Proxy: &TCPProxy{},

   metricCollector: mc,

   command: NewNginxCommand(),
}
// NginxCommand stores context around a given nginx executable path
type NginxCommand struct {
   Binary string
}

// NewNginxCommand returns a new NginxCommand from which path
// has been detected from environment variable NGINX_BINARY or default
func NewNginxCommand() NginxCommand {
   command := NginxCommand{
      Binary: defBinary,
   }

   binary := os.Getenv("NGINX_BINARY")
   if binary != "" {
      command.Binary = binary
   }

   return command
}

// ExecCommand instanciates an exec.Cmd object to call nginx program
func (nc NginxCommand) ExecCommand(args ...string) *exec.Cmd {
   cmdArgs := []string{}

   cmdArgs = append(cmdArgs, "-c", cfgPath)
   cmdArgs = append(cmdArgs, args...)
   return exec.Command(nc.Binary, cmdArgs...)
}

internal/ingress/controller/nginx.go

NGINXController的Start方法中,取到command,很高行start方法

cmd := n.command.ExecCommand()

// put NGINX in another process group to prevent it
// to receive signals meant for the controller
cmd.SysProcAttr = &syscall.SysProcAttr{
   Setpgid: true,
   Pgid:    0,
}

if n.cfg.EnableSSLPassthrough {
   n.setupSSLProxy()
}

klog.InfoS("Starting NGINX process")
n.start(cmd)

调用cmd的Start()方法

func (n *NGINXController) start(cmd *exec.Cmd) {
   cmd.Stdout = os.Stdout
   cmd.Stderr = os.Stderr
   if err := cmd.Start(); err != nil {
      klog.Fatalf("NGINX error: %v", err)
      n.ngxErrCh <- err
      return
   }

   go func() {
      n.ngxErrCh <- cmd.Wait()
   }()
}
posted @ 2022-02-21 10:33  风中之叶0  阅读(225)  评论(0)    收藏  举报