in internal/server/server.go [186:254]
func Run() {
ttl := getConfCacheTTL()
if ttl == 0 {
log.Fatalf("A valid conf cache ttl should be set via environment variable %s",
ConfCacheTTLEnv)
}
log.Warnf("conf cache ttl is %v", ttl)
plugin.InitConfCache(ttl)
sockAddr := getSockAddr()
if sockAddr == "" {
log.Fatalf("A valid socket address should be set via environment variable %s", SockAddrEnv)
}
log.Warnf("listening to %s", sockAddr)
// clean up sock file created by others
if err := os.RemoveAll(sockAddr); err != nil {
log.Fatalf("remove file %s: %s", sockAddr, err)
}
// clean up sock file created by me
defer func() {
if err := os.RemoveAll(sockAddr); err != nil {
log.Errorf("remove file %s: %s", sockAddr, err)
}
}()
l, err := net.Listen("unix", sockAddr)
if err != nil {
log.Fatalf("listen %s: %s", sockAddr, err)
}
defer l.Close()
// the default socket permission is 0755, which prevents the 'nobody' worker process
// from writing to it if the APISIX is run under root.
err = os.Chmod(sockAddr, 0766)
if err != nil {
log.Fatalf("can't change mod for file %s: %s", sockAddr, err)
}
done := make(chan struct{})
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
go func() {
for {
conn, err := l.Accept()
select {
case <-done:
// don't report the "use of closed network connection" error when the server
// is exiting.
return
default:
}
if err != nil {
log.Errorf("accept: %s", err)
continue
}
go handleConn(conn)
}
}()
sig := <-quit
log.Warnf("server receive %s and exit", sig.String())
close(done)
}