mirror of
https://github.com/woodchen-ink/webp_server_go.git
synced 2025-07-18 05:32:02 +08:00
117 lines
3.5 KiB
Go
117 lines
3.5 KiB
Go
package main
|
||
|
||
import (
|
||
"flag"
|
||
"fmt"
|
||
"os"
|
||
"runtime"
|
||
"time"
|
||
"webp_server_go/config"
|
||
"webp_server_go/encoder"
|
||
"webp_server_go/handler"
|
||
schedule "webp_server_go/schedule"
|
||
|
||
"github.com/gofiber/fiber/v2"
|
||
"github.com/gofiber/fiber/v2/middleware/logger"
|
||
"github.com/gofiber/fiber/v2/middleware/recover"
|
||
log "github.com/sirupsen/logrus"
|
||
)
|
||
|
||
// https://docs.gofiber.io/api/fiber
|
||
var app = fiber.New(fiber.Config{
|
||
ServerHeader: "WebP Server Go",
|
||
AppName: "WebP Server Go",
|
||
DisableStartupMessage: true,
|
||
ProxyHeader: "X-Real-IP",
|
||
ReadBufferSize: config.Config.ReadBufferSize, // 用于请求读取的每个连接缓冲区大小。这也限制了最大标头大小。如果您的客户端发送多 KB RequestURI 和/或多 KB 标头(例如,BIG cookies),请增加此缓冲区。
|
||
WriteBufferSize: 1024 * 4,
|
||
Concurrency: config.Config.Concurrency, // 最大并发连接数。
|
||
DisableKeepalive: config.Config.DisableKeepalive, // 禁用保持活动连接,服务器将在向客户端发送第一个响应后关闭传入连接
|
||
})
|
||
|
||
func setupLogger() {
|
||
log.SetOutput(os.Stdout)
|
||
log.SetReportCaller(true)
|
||
formatter := &log.TextFormatter{
|
||
EnvironmentOverrideColors: true,
|
||
FullTimestamp: true,
|
||
TimestampFormat: config.TimeDateFormat,
|
||
CallerPrettyfier: func(f *runtime.Frame) (string, string) {
|
||
return fmt.Sprintf("[%d:%s]", f.Line, f.Function), ""
|
||
},
|
||
}
|
||
log.SetFormatter(formatter)
|
||
log.SetLevel(log.InfoLevel)
|
||
|
||
// fiber logger format
|
||
app.Use(logger.New(logger.Config{
|
||
Format: config.FiberLogFormat,
|
||
TimeFormat: config.TimeDateFormat,
|
||
}))
|
||
app.Use(recover.New(recover.Config{}))
|
||
fmt.Println("Allowed file types as source:", config.Config.AllowedTypes)
|
||
fmt.Println("Convert to WebP Enabled:", config.Config.EnableWebP)
|
||
fmt.Println("Convert to AVIF Enabled:", config.Config.EnableAVIF)
|
||
fmt.Println("Convert to JXL Enabled:", config.Config.EnableJXL)
|
||
}
|
||
|
||
func init() {
|
||
// Our banner
|
||
banner := fmt.Sprintf(`
|
||
▌ ▌ ▌ ▛▀▖ ▞▀▖ ▞▀▖
|
||
▌▖▌▞▀▖▛▀▖▙▄▘ ▚▄ ▞▀▖▙▀▖▌ ▌▞▀▖▙▀▖ ▌▄▖▞▀▖
|
||
▙▚▌▛▀ ▌ ▌▌ ▖ ▌▛▀ ▌ ▐▐ ▛▀ ▌ ▌ ▌▌ ▌
|
||
▘ ▘▝▀▘▀▀ ▘ ▝▀ ▝▀▘▘ ▘ ▝▀▘▘ ▝▀ ▝▀
|
||
|
||
WebP Server Go - v%s
|
||
Developed by WebP Server team. https://github.com/webp-sh`, config.Version)
|
||
// main init is the last one to be called
|
||
flag.Parse()
|
||
// process cli params
|
||
if config.DumpConfig {
|
||
fmt.Println(config.SampleConfig)
|
||
os.Exit(0)
|
||
}
|
||
if config.ShowVersion {
|
||
fmt.Printf("\n %c[1;32m%s%c[0m\n\n", 0x1B, banner+"", 0x1B)
|
||
os.Exit(0)
|
||
}
|
||
config.LoadConfig()
|
||
fmt.Printf("\n %c[1;32m%s%c[0m\n\n", 0x1B, banner, 0x1B)
|
||
setupLogger()
|
||
}
|
||
|
||
func monitorMemoryUsage() {
|
||
ticker := time.NewTicker(1 * time.Minute)
|
||
for range ticker.C {
|
||
var m runtime.MemStats
|
||
runtime.ReadMemStats(&m)
|
||
log.Infof("Alloc = %v MiB, TotalAlloc = %v MiB, Sys = %v MiB, NumGC = %v",
|
||
bToMb(m.Alloc), bToMb(m.TotalAlloc), bToMb(m.Sys), m.NumGC)
|
||
}
|
||
}
|
||
|
||
func bToMb(b uint64) uint64 {
|
||
return b / 1024 / 1024
|
||
}
|
||
|
||
func main() {
|
||
if config.Config.MaxCacheSize != 0 {
|
||
go schedule.CleanCache()
|
||
}
|
||
if config.Prefetch {
|
||
go encoder.PrefetchImages()
|
||
}
|
||
|
||
listenAddress := config.Config.Host + ":" + config.Config.Port
|
||
|
||
app.Get("/healthz", handler.Healthz)
|
||
app.Get("/*", handler.Convert)
|
||
|
||
go monitorMemoryUsage()
|
||
|
||
fmt.Println("WebP Server Go is Running on http://" + listenAddress)
|
||
|
||
_ = app.Listen(listenAddress)
|
||
}
|