mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2026-11-13 08:06:06 +00:00
* feat(openresty): add proxy timeout settings to performance tuning Expose proxy_connect_timeout, proxy_send_timeout and proxy_read_timeout at http level, so a slow backend no longer hits the 60s 504 without a way to raise it from the panel. The stock nginx.conf does not set them, so an absent directive is shown with nginx's built-in 60s and only written once changed. Writing it unconditionally would clash with the same directive set at http level by an included file and fail the config test. Time directives now keep their unit suffix like the size directives do. keepalive_timeout previously dropped it, saving 5m back as 5 seconds, and its helper text no longer reads as a generic connection timeout. Refs #13824 * fix(openresty): keep performance settings from overwriting http-level values Reading the http scope used FindDirectives, which descends into server and location blocks, while saving writes the http block. A site-level proxy_read_timeout 2s was shown as the global value and written back over the global 5m when only gzip was changed. Read only the http block's own directives. A directive nginx.conf leaves unset may still be set at the top level of an included file. Report that value with its file, show it read-only, and leave it out of the save, instead of showing nginx's default and writing a duplicate that fails the config test. Durations are now edited as written and only sent when changed, so 1m30s and keepalive_timeout's second value round-trip intact. Input is validated against nginx's duration syntax. Saving is disabled until the current values have loaded, so the form defaults cannot be written over the real configuration.
72 lines
2.0 KiB
Go
72 lines
2.0 KiB
Go
package service
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/1Panel-dev/1Panel/agent/app/dto/response"
|
|
"github.com/1Panel-dev/1Panel/agent/utils/nginx/parser"
|
|
)
|
|
|
|
func TestFindDirectNginxDirectivesSkipsNestedBlocks(t *testing.T) {
|
|
config, err := parser.NewStringParser(`http {
|
|
proxy_read_timeout 5m;
|
|
server {
|
|
proxy_read_timeout 10s;
|
|
location / {
|
|
proxy_read_timeout 2s;
|
|
}
|
|
}
|
|
}
|
|
`).Parse()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
dirs := findDirectNginxDirectives(config.FindHttp(), "proxy_read_timeout")
|
|
if len(dirs) != 1 || !reflect.DeepEqual(dirs[0].GetParameters(), []string{"5m"}) {
|
|
t.Fatalf("expected only the http-level 5m, got %d directives", len(dirs))
|
|
}
|
|
}
|
|
|
|
func TestFillNginxIncludedHTTPParams(t *testing.T) {
|
|
dir := t.TempDir()
|
|
write := func(name, content string) string {
|
|
filePath := filepath.Join(dir, name)
|
|
if err := os.WriteFile(filePath, []byte(content), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return filePath
|
|
}
|
|
site := write("a.example.com.conf", `server {
|
|
listen 80;
|
|
location / {
|
|
proxy_read_timeout 2s;
|
|
proxy_pass http://127.0.0.1:8080;
|
|
}
|
|
}
|
|
`)
|
|
global := write("timeout.conf", "proxy_read_timeout 120s;\nproxy_send_timeout 90s;\n")
|
|
broken := write("broken.conf", "proxy_connect_timeout 5s\n")
|
|
|
|
params := []response.NginxParam{
|
|
{Name: "proxy_connect_timeout", Params: []string{}},
|
|
{Name: "proxy_send_timeout", Params: []string{"30s"}},
|
|
{Name: "proxy_read_timeout", Params: []string{}},
|
|
}
|
|
got := fillNginxIncludedHTTPParams(params, []string{site, broken, global})
|
|
|
|
want := []response.NginxParam{
|
|
// The only candidate fails to parse, so the value stays unknown.
|
|
{Name: "proxy_connect_timeout", Params: []string{}},
|
|
// nginx.conf already sets it; the included value is not consulted.
|
|
{Name: "proxy_send_timeout", Params: []string{"30s"}},
|
|
// The site's location value is skipped, the top-level one is used.
|
|
{Name: "proxy_read_timeout", Params: []string{"120s"}, Source: global},
|
|
}
|
|
if !reflect.DeepEqual(got, want) {
|
|
t.Fatalf("expected %+v, got %+v", want, got)
|
|
}
|
|
}
|