Add config to enable keepalive/persistent connections

This commit is contained in:
Justin Li 2018-09-09 09:01:53 -04:00
parent 21f500c93e
commit 20edf7a136
3 changed files with 32 additions and 2 deletions

View file

@ -53,6 +53,12 @@ config:
# Disabling this should increase performance/decrease load. # Disabling this should increase performance/decrease load.
enable_request_timing: false enable_request_timing: false
# When true, persistent connections will be allowed. Generally this is not
# useful for a public tracker, but helps performance in some cases (use of
# a reverse proxy, or when there are few clients issuing many requests).
enable_keepalive: false
idle_timeout: 30s
# Whether to listen on /announce.php and /scrape.php in addition to their # Whether to listen on /announce.php and /scrape.php in addition to their
# non-.php counterparts. # non-.php counterparts.
# This is an option for compatibility with (very) old clients or otherwise # This is an option for compatibility with (very) old clients or otherwise

View file

@ -36,6 +36,12 @@ chihaya:
read_timeout: 5s read_timeout: 5s
write_timeout: 5s write_timeout: 5s
# When true, persistent connections will be allowed. Generally this is not
# useful for a public tracker, but helps performance in some cases (use of
# a reverse proxy, or when there are few clients issuing many requests).
enable_keepalive: false
idle_timeout: 30s
# Whether to time requests. # Whether to time requests.
# Disabling this should increase performance/decrease load. # Disabling this should increase performance/decrease load.
enable_request_timing: false enable_request_timing: false

View file

@ -22,6 +22,8 @@ type Config struct {
Addr string `yaml:"addr"` Addr string `yaml:"addr"`
ReadTimeout time.Duration `yaml:"read_timeout"` ReadTimeout time.Duration `yaml:"read_timeout"`
WriteTimeout time.Duration `yaml:"write_timeout"` WriteTimeout time.Duration `yaml:"write_timeout"`
IdleTimeout time.Duration `yaml:"idle_timeout"`
EnableKeepAlive bool `yaml:"enable_keepalive"`
TLSCertPath string `yaml:"tls_cert_path"` TLSCertPath string `yaml:"tls_cert_path"`
TLSKeyPath string `yaml:"tls_key_path"` TLSKeyPath string `yaml:"tls_key_path"`
EnableLegacyPHPURLs bool `yaml:"enable_legacy_php_urls"` EnableLegacyPHPURLs bool `yaml:"enable_legacy_php_urls"`
@ -35,6 +37,8 @@ func (cfg Config) LogFields() log.Fields {
"addr": cfg.Addr, "addr": cfg.Addr,
"readTimeout": cfg.ReadTimeout, "readTimeout": cfg.ReadTimeout,
"writeTimeout": cfg.WriteTimeout, "writeTimeout": cfg.WriteTimeout,
"idleTimeout": cfg.IdleTimeout,
"enableKeepAlive": cfg.EnableKeepAlive,
"tlsCertPath": cfg.TLSCertPath, "tlsCertPath": cfg.TLSCertPath,
"tlsKeyPath": cfg.TLSKeyPath, "tlsKeyPath": cfg.TLSKeyPath,
"enableLegacyPHPURLs": cfg.EnableLegacyPHPURLs, "enableLegacyPHPURLs": cfg.EnableLegacyPHPURLs,
@ -51,6 +55,7 @@ func (cfg Config) LogFields() log.Fields {
const ( const (
defaultReadTimeout = 2 * time.Second defaultReadTimeout = 2 * time.Second
defaultWriteTimeout = 2 * time.Second defaultWriteTimeout = 2 * time.Second
defaultIdleTimeout = 30 * time.Second
) )
// Validate sanity checks values set in a config and returns a new config with // Validate sanity checks values set in a config and returns a new config with
@ -78,6 +83,19 @@ func (cfg Config) Validate() Config {
}) })
} }
if cfg.IdleTimeout <= 0 {
validcfg.IdleTimeout = defaultIdleTimeout
if cfg.EnableKeepAlive {
// If keepalive is disabled, this configuration isn't used anyway.
log.Warn("falling back to default configuration", log.Fields{
"name": "http.IdleTimeout",
"provided": cfg.IdleTimeout,
"default": validcfg.IdleTimeout,
})
}
}
return validcfg return validcfg
} }
@ -158,10 +176,10 @@ func (f *Frontend) listenAndServe() error {
Handler: f.handler(), Handler: f.handler(),
ReadTimeout: f.ReadTimeout, ReadTimeout: f.ReadTimeout,
WriteTimeout: f.WriteTimeout, WriteTimeout: f.WriteTimeout,
IdleTimeout: f.IdleTimeout,
} }
// Disable KeepAlives. f.srv.SetKeepAlivesEnabled(f.EnableKeepAlive)
f.srv.SetKeepAlivesEnabled(false)
// Start the HTTP server. // Start the HTTP server.
if f.tlsCfg != nil { if f.tlsCfg != nil {