RECORDS.CONFIG(5)
๐ records.config(5) ๐ โ Apache Traffic Server, but make it cute ๐
โจ NAME โจ
okay so records.config is the config file, by default located in /usr/local/etc/trafficserver/. It's literally a list of configurable variables used by the Traffic Server software. Many of the variables in records.config are set automatically when you set configuration options with traffic_ctl config set. After you modify records.config, run the command traffic_ctl config reload to apply the changes. periodt.
Note: The configuration directory, containing theSYSCONFDIRvalue specified at build time relative to the installation prefix, contains Traffic Server configuration files. The$TS_ROOTenvironment variable can be used alter the installation prefix at run time. The directory must allow read/write access for configuration reloads.
๐ FORMAT ๐
Each variable has the following format:
CONFIG variable_name DATATYPE variable_value
Data Type
A variable's type is defined by the DATATYPE and must be one of:
FLOATโ Floating point, expressed as a decimal number without units or exponents.INTโ Integers, expressed with or without unit prefixes (as described below).STRINGโ String of characters up to the first newline. No quoting necessary.
Values
The variable_value must conform to the variable's type. For STRING, this is simply any character data until the first newline.
For integer (INT) variables, values are expressed as any normal integer, e.g. 32768. They can also be expressed using more human readable values using standard unit prefixes, e.g. 32K. The following prefixes are supported for all INT type configurations:
Kโ Kilobytes โ equivalent to1,024bytesMโ Megabytes โ equivalent to1,048,576bytes (10242)Gโ Gigabytes โ equivalent to1,073,741,824bytes (10243)Tโ Terabytes โ equivalent to1,099,511,627,776bytes (10244)
Floating point variables (FLOAT) must be expressed as a regular decimal number. Unit prefixes are not supported, nor are alternate notations (scientific, exponent, etc.).
Additional Attributes
Deprecated
A variable marked as Deprecated is still functional but should be avoided as it may be removed in a future release without warning.
Reloadable
A variable marked as Reloadable can be updated via the command:
traffic_ctl config reload
This updates configuration parameters without restarting Traffic Server or interrupting the processing of requests.
Overridable
A variable marked as Overridable can be changed on a per-remap basis using plugins (like the Configuration Remap Plugin), affecting operations within the current transaction only.
๐ EXAMPLES ๐
In the following example, the variable proxy.config.proxy_name is a STRING datatype with the value my_server. This means that the name of the Traffic Server proxy is my_server.
CONFIG proxy.config.proxy_name STRING my_server
If the server name should be that_server the line would be
CONFIG proxy.config.proxy_name STRING that_server
In the following example, the variable proxy.config.arm.enabled is a yes/no flag. A value of 0 (zero) disables the option; a value of 1 enables the option.
CONFIG proxy.config.arm.enabled INT 0
In the following example, the variable sets the time to wait for a DNS response to 10 seconds.
CONFIG proxy.config.hostdb.lookup_timeout INT 10
The last examples configures a 64GB RAM cache, using a human readable prefix.
CONFIG proxy.config.cache.ram_cache.size INT 64G
๐ ENVIRONMENT OVERRIDES ๐
Every records.config configuration variable can be overridden by a corresponding environment variable. This can be useful in situations where you need a static records.config but still want to tweak one or two settings. The override variable is formed by converting the records.config variable name to upper case, and replacing any dot separators with an underscore.
Overriding a variable from the environment is permanent and will not be affected by future configuration changes made in records.config or applied with traffic_ctl.
For example, we could override the proxy.config.product_company variable like this:
$ PROXY_CONFIG_PRODUCT_COMPANY=example traffic_manager &
$ traffic_ctl config get proxy.config.product_company
๐ CONFIGURATION VARIABLES ๐
The following list describes the configuration variables available in the records.config file.
System Variables
proxy.config.product_company- Scope:
CONFIG - Type:
STRING - Default:
Apache Software Foundation - The name of the organization developing Traffic Server.
- Scope:
proxy.config.product_vendor- Scope:
CONFIG - Type:
STRING - Default:
Apache - The name of the vendor providing Traffic Server.
- Scope:
proxy.config.product_name- Scope:
CONFIG - Type:
STRING - Default:
|TS| - The name of the product.
- Scope:
proxy.config.proxy_name- Scope:
CONFIG - Type:
STRING - Default:
build_machine - Reloadable: Yes
- The name of the Traffic Server node.
- Scope:
proxy.config.bin_path- Scope:
CONFIG - Type:
STRING - Default:
bin - The location of the Traffic Server
bindirectory.
- Scope:
proxy.config.proxy_binary- Scope:
CONFIG - Type:
STRING - Default:
traffic_server - The name of the executable that runs the
traffic_serverprocess.
- Scope:
If you want to set Environment Variables for traffic_server process, use a wrapper script like below.
CONFIG proxy.config.proxy_binary STRING start_traffic_server.sh
#!/bin/sh
export ASAN_OPTIONS=detect_leaks=1
/opt/ats/bin/traffic_server "$@"
proxy.config.proxy_binary_opts- Scope:
CONFIG - Type:
STRING - Default:
-M - The command-line options for starting Traffic Server.
- Scope:
proxy.config.manager_binary- Scope:
CONFIG - Type:
STRING - Default:
traffic_manager - The name of the executable that runs the
traffic_managerprocess.
- Scope:
proxy.config.memory.max_usage- Scope:
CONFIG - Type:
INT - Default:
0 - Units:
bytes - Throttle incoming connections if resident memory usage exceeds this value. Setting the option to
0disables the feature.
- Scope:
proxy.config.env_prep- Scope:
CONFIG - Type:
STRING - Default:
*NONE* - The script executed before the
traffic_managerprocess spawns thetraffic_serverprocess.
- Scope:
proxy.config.syslog_facility- Scope:
CONFIG - Type:
STRING - Default:
LOG_DAEMON - The facility used to record system log files. Refer to Understanding Traffic Server Logs for more in-depth discussion of the contents and interpretations of log files.
- Scope:
proxy.config.output.logfile- Scope:
CONFIG - Type:
STRING - Default:
traffic.out - This is used for log rolling configuration so Traffic Server knows the path of the output file that should be rolled. This configuration takes the name of the file receiving
traffic_serverandtraffic_managerprocess output that is set via the--bind_stdoutand--bind_stderrcommand-line options.proxy.config.output.logfileis used only to identify the name of the output file for log rolling purposes and does not override the values set via--bind_stdoutand--bind_stderr.
- Scope:
If a filename is passed to this option, then it will be interpreted relative to proxy.config.log.logfile_dir. If a different location is desired, then pass an absolute path to this configuration.
proxy.config.output.logfile_perm
Okay bestie, next up on the config tour: the log file permission joint. ๐
Scope CONFIG. Type STRING. Default rw-r--r--.
This one is the log file permissions for the file that's catching Traffic Server output โ and the path of that file is set with the --bind_stdout and --bind_stderr command-line options. It uses the standard UNIX file permissions (owner, group, other). Here's what you're allowed to put in:
-โ no permissions, nada, zero, nothing.rโ read permission.wโ write permission.xโ execute permission.
Heads up: permissions are subject to theumasksettings for the Traffic Server process. So like, aumasksetting of002will not allow write permission for others, even if you specified it in the configuration file. And permissions for existing log files are not changed when the config is modified. So don't come crying to me, it literally says so. ๐ญ
proxy.config.output.logfile.rolling_enabledโ ScopeCONFIG. TypeINT. Default0. Reloadable Yes.
Specifies how the output log is rolled. The values you can give it:
0โ Disables output log rolling. Nope, not today.1โ Enables output log rolling at specific intervals (specified with theproxy.config.output.logfile.rolling_interval_secvariable). The clock starts ticking on Traffic Server boot. โฐ2โ Enables output log rolling when the output log reaches a specific size (specified withproxy.config.output.logfile.rolling_size_mb).3โ Enables output log rolling at specific intervals or when the output log reaches a specific size, whichever occurs first. Iconic overachiever behaviour, honestly. ๐proxy.config.output.logfile.rolling_interval_secโ ScopeCONFIG. TypeINT. Default3600. Units seconds. Reloadable Yes.
Specifies how often the output log is rolled, in seconds. The timer starts on Traffic Server startup.
proxy.config.output.logfile.rolling_size_mbโ ScopeCONFIG. TypeINT. Default100. Units megabytes. Reloadable Yes.
Specifies at what size to roll the output log at.
proxy.config.output.logfile.rolling_min_countโ ScopeCONFIG. TypeINT. Default0. Reloadable Yes.
Specifies the minimum count of rolled output logs to keep. This value gets used to decide the order of auto-deletion (if it's enabled). A default value of 0 means auto-deletion will try to keep output logs as much as possible. See Log Rotation and Retention for guidance, bestie. ๐
๐งต Thread Variables ๐งต
proxy.config.exec_thread.autoconfigโ ScopeCONFIG. TypeINT. Default1.
When it's enabled (and yes, the default is 1), Traffic Server scales threads according to the available CPU cores. See the config option below. ๐
proxy.config.exec_thread.autoconfig.scaleโ ScopeCONFIG. TypeFLOAT. Default1.0.
Factor by which Traffic Server scales the number of threads. The multiplier is usually the number of available CPU cores. By default this scaling factor is 1.0. (Yes, the original says "this is scaling factor" โ the vibes are chaotic but the number is real. ๐)
proxy.config.exec_thread.limitโ ScopeCONFIG. TypeINT. Default2.
The number of threads Traffic Server will create if proxy.config.exec_thread.autoconfig is set to 0. Otherwise? This option is just ignored. Ghosted. ๐
proxy.config.exec_thread.listenโ ScopeCONFIG. TypeINT. Default0.
If enabled (1), all the exec_threads listen for incoming connections. And psst โ proxy.config.accept_threads should be disabled to enable this variable. They're a package deal, iykyk.
proxy.config.accept_threadsโ ScopeCONFIG. TypeINT. Default1.
The number of accept threads. If disabled (0), then accepts will be done in each of the worker threads. Here's the whole crossover episode:
accept_threads0,exec_thread.listen0โ All worker threads accept new connections and share listen fd.accept_threads1,exec_thread.listen0โ New connections are accepted on a dedicated accept thread and distributed to worker threads in round robin fashion. ๐accept_threads0,exec_thread.listen1โ All worker threads listen on the same port usingSO_REUSEPORT. Each thread has its own listen fd and new connections are accepted on all the threads.
By default, proxy.config.accept_threads is set to 1 and proxy.config.exec_thread.listen is set to 0. Periodt.
proxy.config.thread.default.stacksizeโ ScopeCONFIG. TypeINT. Default1048576.
Default thread stack size, in bytes, for all threads (that default is 1 MB, bestie). ๐ธ
proxy.config.exec_thread.affinityโ ScopeCONFIG. TypeINT. Default1.
Bind threads to specific processing units. The menu:
0โ Assign threads to machine.1โ Assign threads to NUMA nodes [default].2โ Assign threads to sockets.3โ Assign threads to cores.4โ Assign threads to processing units.
NOTE: This option only has an affect when Traffic Server has been compiled with --enable-hwloc. (Yes, "affect". We are nothing if not faithful to the source. ๐)
proxy.config.system.file_max_pctโ and this one is about to get its whole moment, so stay tunedโฆ ๐ฆ
Set the maximum number of file handles for the traffic_server process as a percentage of the fs.file-max proc value in Linux. The default is 90%. So like, ninety percent of whatever Linux says you're allowed, bestie. ๐
proxy.config.crash_log_helper
- Scope:
CONFIG - Type:
STRING - Default:
traffic_crashlog
This one tells traffic_server to spawn a crash log helper at startup. The value should be the path to an executable program. If that path is not absolute, it gets located relative to the configured bin directory. Any user-provided program you put here has to behave in a fashion compatible with traffic_crashlog โ specifically, it must implement the traffic_crashlog --wait behavior. No cap. ๐
This setting is not reloadable, because the helper must be spawned beforetraffic_serverdrops privilege. If this variable is set toNULL, no helper will be spawned. ๐
proxy.config.restart.active_client_threshold
- Scope:
CONFIG - Type:
INT - Default:
0 - Reloadable: Yes
Specifies the number of active client connections for use by traffic_ctl server restart --drain. That's the whole vibe. โจ
proxy.config.restart.stop_listening
- Scope:
CONFIG - Type:
INT - Default:
0 - Reloadable: Yes
This option says whether Traffic Server should close listening sockets while shutting down gracefully. The tea:
0โ Listening sockets will be kept open.1โ Listening sockets will be closed when Traffic Server starts shutting down.
proxy.config.stop.shutdown_timeout
- Scope:
CONFIG - Type:
INT - Default:
0 - Reloadable: Yes
The shutdown timeout (in seconds) to apply when stopping Traffic Server, in which ATS can initiate graceful shutdowns. To actually effect graceful shutdown, the value you specify should be greater than 0. A value of 0 will not effect an abrupt shutdown. Abrupt shutdowns can be achieved without specifying --drain โ that's traffic_ctl server stop / restart. "Stopping Traffic Server" here means sending traffic_server a signal, either via bin/trafficserver stop or kill. ๐
proxy.config.thread.max_heartbeat_mseconds
- Scope:
CONFIG - Type:
INT - Default:
60 - Units: milliseconds
Set the maximum heartbeat in milliseconds for threads โ ranges from 0 to 1000. ๐ซถ
This controls the maximum amount of time the event loop will wait for I/O activity. On a system that is not busy, this option can be set to a higher value to decrease the spin around overhead. If you're experiencing unexpected delays, setting a lower value should improve the situation.
Note that this setting should only be used by expert system tuners, and will not be beneficial with random fiddling. Like, do not just poke it for fun, bestie. ๐
NETWORK ๐
proxy.config.net.additional_accepts
- Scope:
CONFIG - Type:
INT - Default:
-1 - Reloadable: Yes
This config addresses an issue that can sometimes happen if threads are caught in a net accept while loop, become busy exclusively accepting connections, and are prevented from doing other work. That causes an increase in latency and average event loop time. ๐ญ
Here's the breakdown:
- When set to
0, a thread accepts only1connection per event loop. - When set to any other positive integer
x, a thread will accept up tox+1connections per event loop. - When set to
-1(the default), a thread will accept connections as long as there are connections waiting in its listening queue โ that's equivalent to "accept all", and setting to0is equivalent to "accept one".
proxy.config.net.connections_throttle
- Scope:
CONFIG - Type:
INT - Default:
30000
The total number of client and origin server connections that the server can handle simultaneously. Fr fr, this is the max number of file descriptors that the traffic_server process can have open at any given time. Roughly 10% of these connections are reserved for origin server connections โ so from the default, only ~27,000 client connections can be handled. Tune this according to your memory size and expected work load.
If this is set to 0, the throttling logic is disabled. ๐
proxy.config.net.max_connections_in
- Scope:
CONFIG - Type:
INT - Default:
30000
The total number of client requests that Traffic Server can handle simultaneously. Tune it according to your memory size and expected work load (network, cpu etc). This limit includes both idle (keep alive) connections and active requests that Traffic Server can handle at any given instant. The delta between proxy.config.net.max_connections_in and proxy.config.net.max_requests_in is the amount of maximum idle (keepalive) connections Traffic Server will maintain. Math is math. ๐ง
proxy.config.net.max_requests_in
- Scope:
CONFIG - Type:
INT - Default:
0
The total number of concurrent requests or active client connections that the Traffic Server can handle simultaneously. Tune according to your memory size, and expected work load (network, cpu etc).
When set to 0, active request tracking is disabled and max requests has no separate limit โ the total connections follow proxy.config.net.connections_throttle. ๐
proxy.config.net.default_inactivity_timeout
- Scope:
CONFIG - Type:
INT - Default:
86400 - Reloadable: Yes
The connection inactivity timeout (in seconds) to apply when Traffic Server detects that no inactivity timeout has been applied by the HTTP state machine. When this timeout is applied, the proxy.process.net.default_inactivity_timeout_applied metric is incremented. โจ
See Timeout Settings for more discussion on Traffic Server timeouts.
proxy.config.net.inactivity_check_frequency
- Scope:
CONFIG - Type:
INT - Default:
1
How frequent (in seconds) to check for inactive connections. If you deal with a lot of concurrent connections, increasing this setting can reduce pressure on the system. Lowkey a lifesaver. ๐
proxy.local.incoming_ip_to_bind
- Scope:
LOCAL - Type:
STRING - Default:
0.0.0.0 [::]
Controls the global default IP addresses to which to bind proxy server ports. The value is a space separated list of IP addresses, one per supported IP address family (currently IPv4 and IPv6). ๐
Unless explicitly specified in proxy.config.http.server_ports, the server port will be bound to one of these addresses, selected by IP address family. The built in default is any address. This is used if no address for a family is specified. This setting is useful if most or all server ports should be bound to the same address.
NOTE: This is ignored for inbound transparent server ports because they must be able to accept connections on arbitrary IP addresses. No exceptions, bestie. ๐
Example
Set the global default for IPv4 to 192.168.101.18 and leave the global default for IPv6 as any address:
LOCAL proxy.local.incoming_ip_to_bind STRING 192.168.101.18
Example
Set the global default for IPv4 to 191.68.101.18 and the global default for IPv6 to fc07:192:168:101::17:
LOCAL proxy.local.incoming_ip_to_bind STRING 192.168.101.18 [fc07:192:168:101::17]
proxy.local.outgoing_ip_to_bind
- Scope:
LOCAL - Type:
STRING - Default:
0.0.0.0 [::]
This controls the global default for the local IP address for outbound connections to origin servers. The value is a list of space separated IP addresses, one per supported IP address family (currently IPv4 and IPv6). ๐ฆ
Unless explicitly specified in proxy.config.http.server_ports, one of these addresses โ selected by IP address family โ will be used as the local address for outbound connections. This setting is useful if most or all of the server ports should use the same outbound IP addresses.
NOTE: This is ignored for outbound transparent ports, as the local outbound address will be the same as the client local address. Periodt. ๐
Example
Set the default local outbound IP address for IPv4 connections to 192.168.101.18.:
LOCAL proxy.local.outgoing_ip_to_bind STRING 192.168.101.18
Example
Set the default local outbound IP address to 192.168.101.17 for IPv4 and fc07:192:168:101::17 for IPv6.:
LOCAL proxy.local.outgoing_ip_to_bind STRING 192.168.101.17 [fc07:192:168:101::17]
proxy.config.net.event_period
- Scope:
CONFIG - Type:
INT - Default:
10
How often, in milli-seconds, to schedule IO event processing. This is unlikely to be necessary to tune, and we discourage setting it to a value smaller than 10ms (on Linux). Like, just leave it alone. ๐
proxy.config.net.accept_period
- Scope:
CONFIG - Type:
INT - Default:
10
How often, in milli-seconds, to schedule accept() processing. This is unlikely to be necessary to tune, and we discourage setting it to a value smaller than 10ms (on Linux). ๐
proxy.config.net.retry_delay
- Scope:
CONFIG - Type:
INT - Default:
10 - Reloadable: Yes
How long to wait until we retry various events that would otherwise block the network processing threads (e.g. locks). We discourage setting this to a value smaller than 10ms (on Linux). โญ
proxy.config.net.throttle_delay
- Scope:
CONFIG - Type:
INT - Default:
50 - Reloadable: Yes
When we trigger a throttling scenario, this is how long our accept() are delayed. That's it, that's the whole thing. ๐
๐ LOCAL MANAGER ๐
proxy.node.config.manager_log_filenameโ scopeCONFIG, typeSTRING, defaultmanager.log.
This is the name of the file where all the traffic_manager logs get dropped. ๐
And if you set it to stdout or stderr? Then literally all traffic_manager logging goes to that stream instead. iykyk. โจ
proxy.config.admin.user_idโ scopeCONFIG, typeSTRING, defaultnobody.
This picks the non-privileged account that the traffic_server process runs as, which also lowkey sets the ownership of your config files and log files. two birds, one stone, iconic. ๐ซถ
If the user_id starts with a pound character (#), then everything after it is treated as a numeric user identifier. And if the value is #-1, Traffic Server will not change the user during startup at all.
IMPORTANT: Trying to set this option torootor#0is now forbidden, bestie โ it's a whole security measure. Doing it causes a fatal failure upon startup intraffic_server. But ๐ญ there are two ways to bypass this restriction: - Specify-DBIG_SECURITY_HOLEinCXXFLAGSduring compilation. - Set theuser_id=#-1and starttrafficserveras root.
proxy.config.admin.api.restrictedโ scopeCONFIG, typeINT, default0.
This one says whether the management API should be restricted to root processes only. Set it to 0 and, on platforms that support passing process credentials, non-root processes get to make read-only management API calls. Any management API call that actually modifies server state (like setting a configuration variable, bestie) is still restricted to root processes. no exceptions. ๐
This setting is not reloadable, since it must be applied when traffic_manager initializes.
proxy.config.track_config_filesโ scopeCONFIG, typeINT, default1.
Enables (1) or disables (0) tracking of configuration file updates. It's enabled by default, meaning your config files get monitored for changes. Having tracking on is a dependency for traffic_ctl config status to function, so likeโฆ that's the tradeoff. ๐
BUT. The tracking is implemented via a frequent call to stat(), which may be problematic in some deployments. If that stat() call on configuration files is causing you problems, you can avoid it by setting this value to 0 โ at the cost of disabling the config status feature for traffic_ctl.
This setting is not reloadable, since it must be applied when traffic_manager initializes.
proxy.node.config.manager_exponential_sleep_ceilingโ scopeCONFIG, typeINT, default60.
So if traffic_manager can't start traffic_server, this sets the maximum number of seconds the traffic_manager process should wait before it tries again to restart traffic_server. When it fails to start traffic_server, it retries exponentially until it hits the ceiling time. ๐
proxy.node.config.manager_retry_capโ scopeCONFIG, typeINT, default5.
This is how many times traffic_manager will retry restarting traffic_server once that maximum ceiling time is reached. ๐
NOTE: If set to 0, no cap will take place.
๐จ ALARM CONFIGURATION ๐จ
proxy.config.alarm.abs_pathโ scopeCONFIG, typeSTRING, defaultNULL, reloadable Yes.
The absolute path to the directory holding the alarm script. If you don't set it, the script gets located relative to proxy.config.bin_path. ๐
proxy.config.alarm.script_runtimeโ scopeCONFIG, typeINT, default5, reloadable Yes.
How many seconds Traffic Server lets the alarm script run before it just aborts it. โฐ bye.
๐ HTTP ENGINE ๐
proxy.config.http.server_portsโ scopeCONFIG, typeSTRING, default8080 8080:ipv6.
These are the ports used for proxying HTTP traffic. ๐ฐ๏ธ
It's a list โ separated by space or comma โ of port descriptors. Each descriptor is a sequence of keywords and values separated by colons. Not all keywords have values, and the ones that do are specifically noted. Keywords with values can have an optional = character separating the keyword and the value. The case of keywords is ignored. The order of keywords is irrelevant, but unspecified results may occur if incompatible options are used (noted below ๐). Options without values are idempotent. Options with values use the last (right most) value specified, except for ip-out, as detailed later.
Quick reference chart, but make it a list because we're cute like that: โจ
numberโ Required โ The local port.blindโ Blind (CONNECT) port.compressโ Not Implemented โ Compressed.ipv4โ Default โ Bind to IPv4 address family.ipv6โ Bind to IPv6 address family.ip-inโ Value โ Local inbound IP address.ip-outโ Value โ Local outbound IP address.ip-resolveโ Value โ IP address resolution style.protoโ Value โ List of supported session protocols.ppโ Enable Proxy Protocol.sslโ SSL terminated.quicโ QUIC terminated.tr-fullโ Fully transparent (inbound and outbound)tr-inโ Inbound transparent.tr-outโ Outbound transparent.tr-passโ Pass through enabled.mptcpโ Multipath TCP.
Now the receipts on each one: ๐งพ
numberโ the local IP port to bind. This is the port your ATS clients are gonna connect to. ๐blindโ accept only theCONNECTmethod on this port.
Not compatible with: tr-in, ssl and quic. ๐ซ
compressโ compress the connection. Retained only by inertia, so it should be considered "not implemented". ๐ipv4โ use IPv4. This is the default and it's included primarily for completeness. It's forced if theip-inoption is used with an IPv4 address.ipv6โ use IPv6. It's forced if theip-inoption is used with an IPv6 address. ๐ฆsslโ require SSL termination for inbound connections, periodt. SSL has to be configured for this option to give you a functional server port, no cap.
Not compatible with: blind and quic. ๐
โโ๏ธ
quicโ require QUIC termination for inbound connections. Again, SSL must be configured or the port won't actually work. THIS IS EXPERIMENTAL SUPPORT AND NOT READY FOR PRODUCTION USE. bestie I am BEGGING you, not in prod. ๐ญ
Not compatible with: blind and ssl.
protoโ specify the session level protocols supported. Separate them with semi-colons. For TLS proxy ports the default value is all available protocols. For non-TLS proxy ports the default is HTTP only. HTTP/3 is only available on QUIC ports. ๐ppโ enables Proxy Protocol on the port. If Proxy Protocol is enabled on the port, all incoming requests must be prefaced with thePROXYheader. See Proxy Protocol for more details on how to configure this option properly. โจtr-fullโ fully transparent. This is a convenience option and is identical to specifying bothtr-inandtr-out. ๐ช
Not compatible with: any option not compatible with tr-in or tr-out.
tr-inโ inbound transparent. The proxy port will accept connections to any IP address on the port. To have IPv6 inbound transparent you must use this and theipv6option. This overridesproxy.local.incoming_ip_to_bindfor this port.
Not compatible with: ip-in, blind.
tr-outโ outbound transparent. If ATS connects to an origin server for a transaction on this port, it will use the client's address as its local address. This overridesproxy.local.outgoing_ip_to_bindfor this port.
Not compatible with: ip-out, ip-resolve.
tr-passโ transparent pass through. This option is useful only for inbound transparent proxy ports. If the parsing of the expected HTTP header fails, then the transaction is switched to a blind tunnel instead of generating an error response to the client. It effectively enablesproxy.config.http.use_client_target_addrfor the transaction as there is no other place to obtain the origin server address. ๐ซถip-inโ set the local IP address for the port. This is the address to which clients will connect. This forces the IP address family for the port. Theipv4oripv6can be used but it is optional and it is an error for it to disagree with the IP address family of this value. An IPv6 address must be enclosed in square brackets. If this option is omittedproxy.local.incoming_ip_to_bindis used.
Not compatible with: tr-in.
ip-outโ set the local IP address for outbound connections. This is the address used by ATS locally when it connects to an origin server for transactions on this port. If this is omittedproxy.local.outgoing_ip_to_bindis used.
This option can be used multiple times, once for each IP address family. The address used is selected by the IP address family of the origin server address. ๐ฆ
Not compatible with: tr-out.
ip-resolveโ set the host resolution style for transactions on this proxy port.
Not compatible with: tr-out โ this option requires a value of client;none which is forced and should not be explicitly specified.
mptcpโ enable Multipath TCP on this proxy port. ๐ง
Requires custom Linux kernel available at โ https://multipath-tcp.org.
Example ๐ธ
Listen on port 80 on any address for IPv4 and IPv6.:
80 80:ipv6
Example ๐ธ
Listen transparently on any IPv4 address on port 8080, and transparently on port 8080 on local address fc01:10:10:1::1 (which implies ipv6).:
IPv4:tr-FULL:8080 TR-full:IP-in=[fc02:10:10:1::1]:8080
Example ๐ธ
Listen on port 8080 for IPv6, fully transparent. Set up an SSL port on 443. These ports will use the IP address from proxy.local.incoming_ip_to_bind. Listen on IP address 192.168.17.1, port 80, IPv4, and connect to origin servers using the local address 10.10.10.1 for IPv4 and fc01:10:10:1::1 for IPv6.:
8080:ipv6:tr-full 443:ssl ip-in=192.168.17.1:80:ip-out=[fc01:10:10:1::1]:ip-out=10.10.10.1
Example ๐ธ
Listen on port 9090 for TLS enabled HTTP/2 or HTTP connections, accept no other session protocols.:
9090:proto=http2;http:ssl
Example ๐ธ
Listen on port 9090 for TLS disabled HTTP/2 and enabled HTTP connections, accept no other session protocols.:
9090:proto=http:ssl
Example ๐ธ
Listen on port 4433 for QUIC connections.:
4433:quic
proxy.config.http.connect_ports
Scope: CONFIG ยท Type: STRING ยท Default: 443
The range of origin server ports that can be used for tunneling via CONNECT. ๐
Traffic Server allows tunnels only to the specified ports. Supports both wildcards (*) and ranges (e.g. 0-1023).
NOTE: these are the ports on the origin server, not Traffic Server proxy ports. Don't get it twisted. ๐
proxy.config.http.forward_connect_method
Scope: CONFIG ยท Type: INT ยท Default: 0 ยท Reloadable: Yes ยท Overridable: Yes
The default, Traffic Server behavior for handling a CONNECT method request is to establish a tunnel to the requested destination. This configuration alters the behavior so that Traffic Server forwards the CONNECT method to the next hop, and establishes the tunnel after receiving a positive response. This behavior is useful in a proxy hierarchy, and is equivalent to setting proxy.local.http.parent_proxy.disable_connect_tunneling to 0 when parent proxying is enabled. โจ
proxy.config.http.insert_request_via_str
Scope: CONFIG ยท Type: INT ยท Default: 1 ยท Reloadable: Yes ยท Overridable: Yes
Set how the Via field is handled on a request to the origin server. ๐
- Value
0โ do not modify or set thisViaheader. - Value
1โ add the basic protocol and proxy identifier. - Value
2โ add basic transaction codes. - Value
3โ add detailed transaction codes. - Value
4โ add full user agent connection protocol tags.
NOTE: the Via transaction codes can be decoded with the Via Decoder Ring.
proxy.config.http.request_via_str
Scope: CONFIG ยท Type: STRING ยท Default: ApacheTrafficServer/${PACKAGE_VERSION} ยท Reloadable: Yes ยท Overridable: Yes
Set the server and version string in the Via request header to the origin server which is inserted when the value of proxy.config.http.insert_request_via_str is not 0. ๐
Note that the actual default value is defined with "ApacheTrafficServer/" PACKAGE_VERSION in a C++ source code, and you must write such as ApacheTrafficServer/6.0.0 if you really set a value with the version in records.config file. If you want to hide the version, you can set this value to ApacheTrafficServer. ๐ต๏ธโโ๏ธ
proxy.config.http.insert_response_via_str
Scope: CONFIG ยท Type: INT ยท Default: 0 ยท Reloadable: Yes ยท Overridable: Yes
Set how the Via field is handled on the response to the client. ๐
- Value
0โ do not modify or set thisViaheader. - Value
1โ add the basic protocol and proxy identifier. - Value
2โ add basic transaction codes. - Value
3โ add detailed transaction codes. - Value
4โ add full upstream connection protocol tags.
NOTE: the Via transaction code can be decoded with the Via Decoder Ring.
proxy.config.http.response_via_str
Okay so this next one is the Via header string bestie, and the way it's set up is:
- Scope:
CONFIG - Type:
STRING - Default:
ApacheTrafficServer/${PACKAGE_VERSION} - Reloadable: Yes
- Overridable: Yes
It sets the server-and-version string that goes in the Via response header sent to the client โ the one that gets slipped in when proxy.config.http.insert_response_via_str is not 0. ๐
Heads up: the actual default value is defined as"ApacheTrafficServer/" PACKAGE_VERSIONin a C++ source file, so if you actually want to set a value that includes the version inrecords.config, you have to literally write something likeApacheTrafficServer/6.0.0yourself. And if you're in your hide-the-version era, just set this toApacheTrafficServer. ๐ซฃ
proxy.config.http.send_100_continue_response
- Scope:
CONFIG - Type:
INT - Default:
0 - Reloadable: Yes
You can specify one of these, bestie:
0โ Traffic Server will buffer the request until the post body has been received and then send the request to the origin server.1โ Immediately return a100 Continuefrom Traffic Server without waiting for the post body.
proxy.config.http.response_server_enabled
- Scope:
CONFIG - Type:
INT - Default:
1 - Reloadable: Yes
- Overridable: Yes
You can specify one of these:
0โ NoServerheader is added to the response.1โ TheServerheader is added according toproxy.config.http.response_server_str.2โ TheServerheader is added only if the response from origin does not have one already.
proxy.config.http.response_server_str
- Scope:
CONFIG - Type:
STRING - Default:
ATS/${PACKAGE_VERSION} - Reloadable: Yes
- Overridable: Yes
This is the Server string Traffic Server will insert in a response header (if requested, see above ๐). And fr fr, same lil caveat as before: the actual default value is defined as "ATS/" PACKAGE_VERSION in the C++ source, so you must write something like ATS/6.0.0 if you really want to set a value with the version in records.config. Want to hide the version? Set it to ATS. ๐
proxy.config.http.insert_age_in_response
- Scope:
CONFIG - Type:
INT - Default:
1 - Reloadable: Yes
- Overridable: Yes
This option says whether Traffic Server should insert an Age header in the response. The value is the cache's estimate of the amount of time since the response was generated or revalidated by the origin server. โฐ
0โ NoAgeheader is added.1โAgeheader is added.
proxy.config.http.chunking_enabled
- Scope:
CONFIG - Type:
INT - Default:
1 - Reloadable: Yes
- Overridable: Yes
Specifies whether Traffic Server can generate a chunked response:
0โ Never respond with chunked encoding.1โ Always respond with chunked encoding.2โ Generate a chunked response if the origin server has previously returnedHTTP/1.1.3โ Generate a chunked response if the client request isHTTP/1.1and the origin server has previously returnedHTTP/1.1.
proxy.config.http.chunking.size
- Scope:
CONFIG - Type:
INT - Default:
4096 - Overridable: Yes
If chunked transfer encoding is enabled with proxy.config.http.chunking_enabled, and the conditions specified by that option's setting are met by the current request, this option decides the size of the chunks, in bytes, to use when sending content to an HTTP/1.1 client. ๐ฆ
proxy.config.http.drop_chunked_trailers
- Scope:
CONFIG - Type:
INT - Default:
0 - Reloadable: Yes
- Overridable: Yes
Specifies whether Traffic Server should drop chunked trailers. If enabled (1), Traffic Server will drop any chunked trailers in a Transfer-Encoded: chunked request or response body. If disabled (0), Traffic Server will pass the chunked trailers unmodified to the receiving peer. See RFC 9112, section 7.1.2 for the details about chunked trailers. By default, this option is disabled, so Traffic Server will not drop chunked trailers. ๐ฆ
proxy.config.http.send_http11_requests
- Scope:
CONFIG - Type:
INT - Default:
1 - Reloadable: Yes
- Overridable: Yes
Specifies when and how Traffic Server uses HTTP/1.1 to talk to the origin server:
0โ Never useHTTP/1.1.1โ Always useHTTP/1.1.2โ UseHTTP/1.1with origin connections only if the server has previously returnedHTTP/1.1.3โ If the client request isHTTP/1.1and the origin server has previously returnedHTTP/1.1, then useHTTP/1.1for origin server connections.
NOTE: Ifproxy.config.http.use_client_target_addris set to1, then options2and3for this configuration variable cause the proxy to use the client HTTP version for upstream requests. ๐
proxy.config.http.auth_server_session_private
- Scope:
CONFIG - Type:
INT - Default:
1 - Overridable: Yes
If enabled (1), anytime a request contains a Authorization, Proxy-Authorization, or Www-Authenticate header, the connection will be closed and not reused. This marks the connection as private. ๐ When disabled (0), the connection will be available for reuse.
proxy.config.http.server_session_sharing.match
proxy.config.http.server_session_sharing.match
Scope: CONFIG ยท Type: STRING ยท Default: both ยท Overridable: Yes
okay so this one is the vibe check for re-using server connections across client connections ๐ you can pass more than one value if you separate them with commas and no white spaces (fr fr, the spaces will ruin it). Here's the whole menu of valid values:
noneโ do not match and do not re-use server sessions. Just... no. Nothing. Zero.ipโ re-use server sessions, checking only that the IP address and port of the origin server matches.hostโ re-use server sessions, checking that the fully qualified domain name matches. Plus, if the session uses TLS, it also checks that the current transaction's host header value matches the session's SNI. multitasking queen โจbothโ equivalent tohost,ip.hostonlyโ check that the fully qualified domain name matches. That's it, that's the whole job.sniโ check that the SNI of the session matches the SNI that would be used to create a new session. Only applicable for TLS sessions, bestie.certโ check that the certificate file name used for the server session matches the certificate file name that would be used for the new server session. Also only applicable for TLS sessions.
Your setting has to contain at least one of ip, host, hostonly or both for session reuse to actually operate. The other values are there so you can get extra fine-grained control with TLS session reuse. ๐
NOTE: server sessions to different upstream ports never match even if the FQDN and IP address match. like, never ever.
NOTE: upstream session tracking uses a similar set of options for matching sessions, but it's set independently from session sharing. two separate sliders, two separate vibes.
proxy.config.http.server_session_sharing.pool
Scope: CONFIG ยท Type: STRING ยท Default: thread
This controls the scope of server session re-use, but only if it's already enabled by proxy.config.http.server_session_sharing.match. Valid values:
globalโ re-use sessions from a global pool of all server sessions.threadโ re-use sessions from a per-thread pool.hybridโ try to work as a global pool, but release server sessions to the per-thread pool if there is lock contention on the global pool. the "why not both" option ๐
Setting proxy.config.http.server_session_sharing.pool to global can reduce the number of connections to origin for some traffic loads. However โ and this is the part where you go "oh" โ if many execute threads are active, the thread contention on the global pool can reduce the lifetime of connections to origin and reduce effective origin connection reuse. sad but true ๐ญ
For a hybrid pool, the operation starts as the global pool, but sessions are returned to the local thread pool if the global pool lock is not acquired, rather than just closing the origin connection like it does in standard global mode. it's giving "best of both worlds" ๐ฆ
proxy.config.http.attach_server_session_to_client
Scope: CONFIG ยท Type: INT ยท Default: 0 ยท Overridable: Yes
This one controls the re-use of a server session by a user agent (client) session. Currently it only applies to user agents using HTTP/1.0 or HTTP/1.1. For other HTTP versions, the origin connection is always returned to the session sharing pool or closed โ no exceptions, no negotiating.
So if a user agent performs more than one HTTP transaction on its connection to Traffic Server, a server session must be obtained for the second (and subsequent) transaction just like for the first. This setting decides how that server session gets picked. ๐
If this setting is 0, then after the first transaction the server session for that transaction is released to the server pool (if any). When a server session is needed for subsequent transactions, one is selected from the server pool or created if there is no suitable server session in the pool. very chill, very detached.
If this setting is not 0, then the current server session for the user agent session is "sticky". It will be preferred over any other server session (either from the pool or newly created). The server session only gets detached from the user agent session if it cannot be used for the transaction. And how do we know if it can be used? That's determined by the proxy.config.http.server_session_sharing.match value. If the server session matches the next transaction according to that setting, it gets used; otherwise it's released to the pool and a different session is selected or created. main character session energy, honestly ๐
proxy.config.http.max_proxy_cycles
Scope: CONFIG ยท Type: INT ยท Default: 0 ยท Overridable: Yes
Controls the proxy cycle detection function, and it does it like this:
If this setting is 0, then next hop is self IP address and port detection is active.
In addition, the proxy cycle detection using the Via string will declare a cycle if the current cache appears one or more times in the Via string, i.e, > 0.
If this setting is 1 or more (N), then next hop is self IP address and port detection is inactive.
In addition, the proxy cycle detection using the Via string will declare a cycle if the current cache appears more than N times in the Via string, i.e., > N.
Examples, because this is the part where everyone squints:
If the setting is 0, then the second time a request enters a cache it will have its own machine identifier in the Via string once, so a cycle will be detected. So no cycles are allowed.
If the setting is 1, then the third time a request enters a cache it will have its own machine identifier in the Via string twice, so a cycle will be detected. So one cycle is allowed. The first cycle with two visits to the cache and one instance in the Via string is allowed. The second cycle with three visits to the cache and two instances in the Via string is not allowed. โจ math! โจ
This setting allows an edge cache peering arrangement where an edge cache may forward a request to a peer edge cache (possibly itself) a limited number of times (usually once). Infinite loops are still detected when the cycle allowance is exceeded. so you can loop a little, as a treat, but not forever ๐
proxy.config.http.use_client_target_addr
Scope: CONFIG ยท Type: INT ยท Default: 0
For fully transparent ports, use the same origin server address as the client.
This option causes Traffic Server to avoid, where possible, doing DNS lookups in forward transparent proxy mode. But it only works if all three of these conditions are true:
- Traffic Server is in forward proxy mode.
- The proxy port is inbound transparent.
- The target URL has not been modified by either remapping or a plugin.
If any of these conditions are not true, then normal DNS processing is done for the connection. no shortcuts, no skipping, just DNS doing its thing ๐ซถ
So bestie, there are literally three valid values here, and you gotta pick one ๐
0โ Disables the feature. Bye. โจ1โ Enables the feature with address verification. The proxy does the regular DNS processing. If the client-specified origin address is not in the set of addresses found by the proxy, the request continues to the client specified address, but the result is not cached.2โ Enables the feature with no address verification. No DNS processing is performed. The result is cached (if allowed otherwise).
๐จ ok this is the scary one: option2is vulnerable to cache poisoning if an incorrectHostheader is specified, so this option should be used with extreme caution if HTTP caching is enabled. See bugTS-2954for details. Not me being dramatic, that's literally in the docs ๐ญ
If all of these conditions are met, then the origin server IP address is retrieved from the original client connection, rather than through HostDB or DNS lookup. In effect, client DNS resolution is used instead of Traffic Server DNS. ๐ฆ
This can be used to be a little more efficient (looking up the target once by the client rather than by both the client and Traffic Server) but the primary use is when client DNS resolution can differ from that of Traffic Server. Two known uses cases are:
- Embedded IP addresses in a protocol with DNS load sharing. In this case, even though Traffic Server and the client both make the same request to the same DNS resolver chain, they may get different origin server addresses. If the address is embedded in the protocol then the overall exchange will fail. One current example is Microsoft Windows update, which presumably embeds the address as a security measure. ๐
- The client has access to local DNS zone information which is not available to Traffic Server. There are corporate nets with local DNS information for internal servers which, by design, is not propagated outside the core corporate network. Depending a network topology it can be the case that Traffic Server can access the servers by IP address but cannot resolve such addresses by name. In such as case the client supplied target address must be used. ๐ข
This solution must be considered interim. In the longer term, it should be possible to arrange for much finer grained control of DNS lookup so that wildcard domain can be set to use Traffic Server or client resolution. In both known use cases, marking specific domains as client determined (rather than a single global switch) would suffice. It is possible to do this crudely with this flag by enabling it and then use identity URL mappings to re-disable it for specific domains. ๐ง
proxy.config.http.keep_alive_enabled_in
- Scope:
CONFIG - Type:
INT - Default:
1 - Overridable: Yes
Enables (1) or disables (0) incoming keep-alive connections. ๐ซถ
proxy.config.http.keep_alive_enabled_out
- Scope:
CONFIG - Type:
INT - Default:
1 - Overridable: Yes
Enables (1) or disables (0) outgoing keep-alive connections.
NOTE: Enabling keep-alive does not automatically enable purging of keep-alive requests when nearing the connection limit, that is controlled by proxy.config.http.server_max_connections. ๐ like, two separate things, don't get it twisted
proxy.config.http.keep_alive_post_out
- Scope:
CONFIG - Type:
INT - Default:
1 - Overridable: Yes
Controls whether new POST requests re-use keep-alive sessions (1) or create new connections per request (0). ๐ฅ
proxy.config.http.disallow_post_100_continue
- Scope:
CONFIG - Type:
INT - Default:
0
Allows you to return a 405 Method Not Supported with Posts also containing an Expect: 100-continue. ๐
When a Post w/ Expect: 100-continue is blocked the stat proxy.process.http.disallowed_post_100_continue will be incremented. Counters go brrr ๐
proxy.config.http.default_buffer_size
- Scope:
CONFIG - Type:
INT - Default:
8 - Reloadable: Yes
- Overridable: Yes
Configures the default buffer size, in bytes, to allocate for incoming request bodies which lack a Content-length header. ๐ธ
proxy.config.http.default_buffer_water_mark
- Scope:
CONFIG - Type:
INT - Default:
32768 - Reloadable: Yes
- Overridable: Yes
Number of bytes Traffic Server is allowed to read ahead of the client from the origin. Note that when Read While Write settings are in place, this setting will apply to the first client to request the object, regardless if subsequent, simultaneous clients of that object can read faster. The buffered bytes will consume memory while waiting for the client to consume them. ๐ง
While this setting is reloadable, dramatic changes can cause bigger memory usage than expected and is thus not recommended. Lowkey leave it alone bestie ๐
proxy.config.http.request_buffer_enabled
- Scope:
CONFIG - Type:
INT - Default:
0 - Overridable: Yes
This enables buffering the content for incoming POST requests. If enabled no outbound connection is made until the entire POST request has been buffered. If enabled, proxy.config.http.post_copy_size needs to be set to the maximum of the post body size allowed, otherwise, the post would fail. ๐ญ set both or it's giving broken
proxy.config.http.request_line_max_size
- Scope:
CONFIG - Type:
INT - Default:
65535 - Reloadable: Yes
Controls the maximum size, in bytes, of an HTTP Request Line in requests. Requests with a request line exceeding this size will be treated as invalid and rejected by the proxy. ๐ซ Note that the HTTP request line typically includes HTTP method, request target and HTTP version string except when the request is made using absolute URI in which case the request line may also include the request scheme and domain name.
proxy.config.http.header_field_max_size
- Scope:
CONFIG - Type:
INT - Default:
131070 - Reloadable: Yes
Controls the maximum size, in bytes, of an HTTP header field in requests. Headers in a request with the sum of their name and value that exceed this size will cause the entire request to be treated as invalid and rejected by the proxy. ๐
proxy.config.http.request_header_max_size
- Scope:
CONFIG - Type:
INT - Default:
131072 - Reloadable: Yes
- Overridable: Yes
Controls the maximum size, in bytes, of an HTTP header in requests. Headers in a request which exceed this size will cause the entire request to be treated as invalid and rejected by the proxy. ๐
proxy.config.http.response_header_max_size
- Scope:
CONFIG - Type:
INT - Default:
131072 - Reloadable: Yes
- Overridable: Yes
Controls the maximum size, in bytes, of headers in HTTP responses from the proxy. Any responses with a header exceeding this limit will be treated as invalid and a client error will be returned instead. ๐ตโ๐ซ
proxy.config.http.global_user_agent_header
- Scope:
CONFIG - Type:
STRING - Default:
null - Overridable: Yes
An arbitrary string value that, if set, will be used to replace any request User-Agent header. โจ main character energy, every request gets the same fit
proxy.config.http.strict_uri_parsing
- Scope:
CONFIG - Type:
INT - Default:
2
Takes a value between 0 and 2. ๐
0โ disablesstrict_uri_parsing. Any character can appears in the URI. (fr, anything goes)1โ causes Traffic Server to return400 Bad Requestif client's request URI includes character which is not RFC 3986 compliant. ๐2โ directs Traffic Server to reject the clients request if it contains whitespace or non-printable characters. ๐งผ
proxy.config.http.errors.log_error_pages
- Scope:
CONFIG - Type:
INT - Default:
1 - Reloadable: Yes
Enables (1) or disables (0) the logging of responses to bad requests to the error logging destination. Disabling this option prevents error responses (such as 403s) from appearing in the error logs. Any HTTP response status codes equal to, or higher, than the minimum code defined by TS_HTTP_STATUS_BAD_REQUEST are affected by this setting. ๐
โจ PARENT PROXY CONFIGURATION โจ
Okay bestie, parent proxy vibes. Let's get into it. ๐
proxy.config.http.parent_proxy.retry_timeโ Scope:CONFIG, Type:INT, Default:300, Reloadable:Yes, Overridable:Yes. The amount of time allowed between connection retries to a parent cache that is unavailable. โณproxy.config.http.parent_proxy.max_trans_retriesโ Scope:CONFIG, Type:INT, Default:2. Limits the number of simultaneous transactions that may retry a parent once the parents retry_time has expired. ๐proxy.config.http.parent_proxy.fail_thresholdโ Scope:CONFIG, Type:INT, Default:10, Reloadable:Yes, Overridable:Yes. The number of times the connection to the parent cache can fail before Traffic Server considers the parent unavailable. ๐proxy.config.http.parent_proxy.total_connect_attemptsโ Scope:CONFIG, Type:INT, Default:4, Reloadable:Yes, Overridable:Yes. The total number of connection attempts for a specific transaction allowed to a parent cache before Traffic Server bypasses the parent or fails the request (depending on thego_directoption in theparent.configfile). The number of parents tried isproxy.config.http.parent_proxy.fail_threshold/proxy.config.http.parent_proxy.total_connect_attempts. ๐งฎproxy.config.http.parent_proxy.per_parent_connect_attemptsโ Scope:CONFIG, Type:INT, Default:2, Reloadable:Yes, Overridable:Yes. The total number of connection attempts allowed per parent for a specific transaction, if multiple parents are used. ๐ฏproxy.config.http.parent_proxy.connect_attempts_timeoutโ Scope:CONFIG, Type:INT, Default:30, Reloadable:Yes, Overridable:Yes. The timeout value (in seconds) for parent cache connection attempts. โฒ๏ธ
For more discussion on Traffic Server timeouts, see Timeout Settings.
proxy.config.http.parent_proxy.mark_down_hostdbโ Scope:CONFIG, Type:INT, Default:0, Reloadable:Yes, Overridable:Yes. Enables (1) or disables (0) marking parent proxies down in hostdb when a connection error is detected. Normally parent selection manages parent proxies and will mark them as unavailable as needed. But when parents are defined in dns with multiple ip addresses, it may be useful to mark the failing ip down in hostdb. In this case you would enable these updates. ๐ฉproxy.config.http.forward.proxy_auth_to_parentโ Scope:CONFIG, Type:INT, Default:0, Reloadable:Yes, Overridable:Yes. Configures Traffic Server to send proxy authentication headers on to the parent cache. ๐proxy.config.http.no_dns_just_forward_to_parentโ Scope:CONFIG, Type:INT, Default:0, Reloadable:Yes. Don't try to resolve DNS, forward all DNS requests to the parent. This is off (0) by default. ๐ซ๐proxy.local.http.parent_proxy.disable_connect_tunnelingโ Scope:CONFIG, Type:INT, Default:0. No description given, she's mysterious. ๐ต๏ธโ๏ธproxy.config.http.parent_proxy.self_detectโ Scope:CONFIG, Type:INT, Default:2. For each host that has been specified in a parent or secondary_parent list in theparent.configfile, determine if the host is the same as the current host. Obvious examples include localhost and127.0.0.1. If a match is found, take an action depending upon the value below. ๐0โ Disables the feature by not checking for matches.1โ Remove the matching host from the list.2โ Mark the host down. This is the default.
proxy.config.http.parent_proxy.enable_parent_timeout_markdownsโ Scope:CONFIG, Type:INT, Default:0, Reloadable:Yes, Overridable:Yes. Enables (1) or disables (0) parent proxy mark downs due to inactivity timeouts. By default parent proxies are not marked down due to inactivity timeouts, the transaction will retry using another parent instead. The default for this configuration keeps this behavior and is disabled (0). This setting is overridable using one of the two pluginsheader_rewriteorconf_remapto enable inactivity timeout markdowns and should be done so rather than enabling this globally. This setting should not be used in conjunction withproxy.config.http.parent_proxy.disable_parent_markdowns. โฐ๐ซproxy.config.http.parent_proxy.disable_parent_markdownsโ Scope:CONFIG, Type:INT, Default:0, Reloadable:Yes, Overridable:Yes. Enables (1) or disables (0) parent proxy markdowns. This is useful if parent entries in aparent.configline are VIP's and one doesn't wish to mark down a VIP which may have several origin or parent proxies behind the load balancer. This setting is overridable using one of theheader_rewriteor theconf_remapplugins to override the default setting and this method should be used rather than disabling markdowns globally. This setting should not be used in conjunction withproxy.config.http.parent_proxy.enable_parent_timeout_markdowns. ๐
โฐ HTTP CONNECTION TIMEOUTS โฐ
Timeout tea, let's sip. โ
proxy.config.http.keep_alive_no_activity_timeout_inโ Scope:CONFIG, Type:INT, Default:120, Reloadable:Yes, Overridable:Yes. Specifies how long Traffic Server keeps connections to clients open for a subsequent request after a transaction ends. A value of0will setproxy.config.net.default_inactivity_timeoutas the timeout. ๐ค
For more discussion on Traffic Server timeouts, see Timeout Settings.
proxy.config.http.keep_alive_no_activity_timeout_outโ Scope:CONFIG, Type:INT, Default:120, Reloadable:Yes, Overridable:Yes. Specifies how long Traffic Server keeps connections to origin servers open for a subsequent transfer of data after a transaction ends. A value of0will setproxy.config.net.default_inactivity_timeoutas the timeout. ๐ค
For more discussion on Traffic Server timeouts, see Timeout Settings.
proxy.config.http.transaction_no_activity_timeout_inโ Scope:CONFIG, Type:INT, Default:30, Reloadable:Yes, Overridable:Yes. Specifies how long Traffic Server keeps connections to clients open if a transaction stalls. ๐
For more discussion on Traffic Server timeouts, see Timeout Settings.
proxy.config.http.transaction_no_activity_timeout_outโ Scope:CONFIG, Type:INT, Default:30, Reloadable:Yes, Overridable:Yes. Specifies how long Traffic Server keeps connections to origin servers open if the transaction stalls. ๐
For more discussion on Traffic Server timeouts, see Timeout Settings.
proxy.config.websocket.no_activity_timeoutโ Scope:CONFIG, Type:INT, Default:600, Reloadable:Yes, Overridable:Yes. Specifies how long Traffic Server keeps connections open if a websocket stalls. ๐ธ๏ธ
For more discussion on Traffic Server timeouts, see Timeout Settings.
proxy.config.websocket.active_timeoutโ Scope:CONFIG, Type:INT, Default:3600, Reloadable:Yes, Overridable:Yes. The maximum amount of time Traffic Server keeps websocket connections open. โณ
For more discussion on Traffic Server timeouts, see Timeout Settings.
proxy.config.http.transaction_active_timeout_inโ Scope:CONFIG, Type:INT, Default:900, Reloadable:Yes, Overridable:Yes. The maximum amount of time Traffic Server can remain connected to a client. If the transfer to the client is not complete before this timeout expires, then Traffic Server closes the connection. โฐ
The value of 0 specifies that there is no timeout.
For more discussion on Traffic Server timeouts, see Timeout Settings.
proxy.config.http.transaction_active_timeout_outโ Scope:CONFIG, Type:INT, Default:0, Reloadable:Yes, Overridable:Yes. The maximum amount of time Traffic Server waits for fulfillment of a connection request to an origin server. If Traffic Server does not complete the transfer to the origin server before this timeout expires, then Traffic Server terminates the connection request. โณ
The default value of 0 specifies that there is no timeout.
For more discussion on Traffic Server timeouts, see Timeout Settings.
proxy.config.http.accept_no_activity_timeoutโ Scope:CONFIG, Type:INT, Default:120, Reloadable:Yes. The timeout interval in seconds before Traffic Server closes a connection that has no activity. ๐ค
For more discussion on Traffic Server timeouts, see Timeout Settings.
proxy.config.http.background_fill_active_timeoutโ Scope:CONFIG, Type:INT, Default:0, Reloadable:Yes, Overridable:Yes. Specifies how long Traffic Server continues a background fill before giving up and dropping the origin server connection. ๐จ
For more discussion on Traffic Server timeouts, see Timeout Settings.
proxy.config.http.background_fill_completed_thresholdโ Scope:CONFIG, Type:FLOAT, Default:0.0, Reloadable:Yes, Overridable:Yes. The proportion of total document size already transferred when a client aborts at which the proxy continues fetching the document from the origin server to get it into the cache (a background fill). ๐ฆ
๐ HTTP REDIRECTION ๐
Redirect follow girlies, this section is for YOU ๐ every knob about 3XX responses, host headers, and who's allowed to get redirected lives right here.
โจ proxy.config.http.number_of_redirections
- Scope โ
CONFIG - Type โ
INT - Default โ
0 - Reloadable โ
Yes - Overridable โ
Yes
okay so this one sets the max number of times Trafficserver is gonna do a redirect follow location when it gets a 3XX Redirect response for a given client request. that's the whole vibe bestie ๐ฆ
NOTE: when proxy.config.http.number_of_redirections is set to a positive value and Traffic Server has already cached a 3XX Redirect response, that cached response will keep getting refreshed and returned until the response is no longer in the cache. no cap, it just stays living there ๐
NOTE: in previous versions,proxy.config.http.redirection_enabledhad to be set to1before this setting was even evaluated. but now? settingproxy.config.http.number_of_redirectionsto a value greater than zero is sufficient to make Traffic Server follow redirects. glow up fr fr โจ
๐ proxy.config.http.redirect_host_no_port
- Scope โ
CONFIG - Type โ
INT - Default โ
1 - Reloadable โ
Yes
this one lets Trafficserver not include the port in the Host header on the redirect follow request, but only for default/standard ports (like 80 for HTTP and 443 for HTTPS, iykyk). heads up tho โ the port is still included in the Host header if it's non-default. so like, the special-case ports still show up ๐
๐ฆ proxy.config.http.redirect_use_orig_cache_key
- Scope โ
CONFIG - Type โ
INT - Default โ
0 - Reloadable โ
Yes - Overridable โ
Yes
this enables Trafficserver to allow using the original request cache key (for example, one set using a TS API) during a 3xx redirect follow. the default behavior (0) is to use the URL specified by the Location header in the 3xx response as the cache key. so default = Location header URL, periodt ๐
๐ธ proxy.config.http.post_copy_size
- Scope โ
CONFIG - Type โ
INT - Default โ
2048 - Reloadable โ
Yes
this setting determines the max size in bytes of uploaded content to be buffered for HTTP methods such as POST and PUT. so basically how much of that upload we're holding onto before doing the thing ๐ซถ
๐ proxy.config.http.redirect.actions
- Scope โ
CONFIG - Type โ
STRING - Default โ
routable:follow - Reloadable โ
Yes
this setting determines how redirects should be handled. it's a comma-separated list of key-value pairs, where the keys are named IP address ranges and the values are actions. let's get into it โญ
the valid keys are:
selfโ Addresses of the host's interfacesloopbackโ IPv4127.0.0.0/8and IPv6::1privateโ IPv410.0.0.0/8,100.64.0.0/10,172.16.0.0/12,192.168.0.0/16and IPv6fc00::/7multicastโ IPv4224.0.0.0/4and IPv6ff00::/8linklocalโ IPv4169.254.0.0/16and IPv6fe80::/10routableโ All publicly routable addressesdefaultโ All address ranges not configured specifically
the valid values are:
returnโ Do not process the redirect, send it as the proxy response.rejectโ Do not process the redirect, send a403as the proxy response.followโ Internally follow the redirect up toproxy.config.http.number_of_redirections. Use this setting with caution! ๐ญ
WARNING: Following a redirect to other than routable addresses can be dangerous, as it allows the controller of an origin to arrange a probe the Traffic Server host. Enabling these redirects makes Traffic Server open to third party attacks and probing and therefore should be considered only in known safe environments. this is the real deal bestie, don't be reckless with it ๐
for example, a setting of loopback:reject,private:reject,routable:follow,default:return would send 403 as the proxy response to loopback and private addresses, routable addresses would be followed up to proxy.config.http.number_of_redirections, and redirects to all other ranges will be sent as the proxy response.
the action for self has the highest priority when an address would match multiple keys, and the action for default has the lowest priority. other keys represent disjoint sets of addresses that will not conflict. and if duplicate keys are present in the setting, the right-most key-value pair is used. main character energy goes to the right-most one ๐
the default value is routable:follow, which means "follow routable redirects, return all other redirects". note that proxy.config.http.number_of_redirections must be positive also, otherwise redirects will be returned rather than followed. so like, both settings gotta be in their era together โจ
โจ ORIGIN SERVER CONNECT ATTEMPTS โจ
okay so this whole section is about how Traffic Server tries to connect to origin servers and what happens when they ghost us ๐ญ. buckle up, bestie.
proxy.config.http.connect_attempts_max_retries๐- Scope:
CONFIGโข Type:INTโข Default:3โข Reloadable:Yesโข Overridable:Yes - The maximum number of connection retries Traffic Server can make when the origin server is not responding. Each retry attempt lasts for
proxy.config.http.connect_attempts_timeoutseconds. Once the maximum number of retries is reached, the origin is marked dead (as controlled byproxy.config.http.connect.dead.policy. After this, the settingproxy.config.http.connect_attempts_max_retries_dead_serveris used to limit the number of retry attempts to the known dead origin.
- Scope:
proxy.config.http.connect_attempts_max_retries_dead_server๐- Scope:
CONFIGโข Type:INTโข Default:1โข Reloadable:Yesโข Overridable:Yes - Maximum number of connection attempts Traffic Server can make while an origin is marked dead per request. Typically this value is smaller than
proxy.config.http.connect_attempts_max_retriesso an error is returned to the client faster and also to reduce the load on the dead origin. The timeout intervalproxy.config.http.connect_attempts_timeoutin seconds is used with this setting.
- Scope:
proxy.config.http.connect.dead.policy๐ชฆ- Scope:
CONFIGโข Type:INTโข Default:2โข Overridable:Yes - Controls what origin server connection failures contribute to marking a server dead. When set to
2, any connection failure during the TCP and TLS handshakes will contribute to marking the server dead. When set to1, only TCP handshake failures will contribute to marking a server dead. When set to0, no connection failures will be used towards marking a server dead.
- Scope:
proxy.config.http.server_max_connections๐- Scope:
CONFIGโข Type:INTโข Default:0โข Reloadable:Yes - Limits the number of socket connections across all origin servers to the value specified. To disable, set to zero (
0). - This value is used in determining when and if to prune active origin sessions. Without this value set, connections to origins can consume all the way up to
proxy.config.net.connections_throttleconnections, which in turn can starve incoming requests from available connections.
- Scope:
proxy.config.http.per_server.connection.max๐ฏ- Scope:
CONFIGโข Type:INTโข Default:0โข Reloadable:Yesโข Overridable:Yes - Set a limit for the number of concurrent connections to an upstream server group. A value of
0disables checking. If a transaction attempts to connect to a group which already has the maximum number of concurrent connections the transaction either rechecks after a delay or a503(HTTP_STATUS_SERVICE_UNAVAILABLE) error response is sent to the user agent. To configure:- Number of transactions that can be delayed concurrently โ See
proxy.config.http.per_server.connection.queue_size. - How long to delay before rechecking โ See
proxy.config.http.per_server.connection.queue_delay. - Upstream server group definition โ See
proxy.config.http.per_server.connection.match. - Frequency of alerts โ See
proxy.config.http.per_server.connection.alert_delay.
- Number of transactions that can be delayed concurrently โ See
- Scope:
proxy.config.http.per_server.connection.match๐ฏ- Scope:
CONFIGโข Type:STRINGโข Default:bothโข Reloadable:Yesโข Overridable:Yes - Control the definition of an upstream server group for
proxy.config.http.per_server.connection.max. This must be one of the following keywords. ipโ Group by IP address. Each IP address is a group.portโ Group by IP address and port. Each distinct IP address and port pair is a group.hostโ Group by host name. The host name is the post remap FQDN used to resolve the upstream address.bothโ Group by IP address, port, and host name. Each distinct combination is a group.- To disable upstream server grouping, set
proxy.config.http.per_server.connection.maxto0. - > NOTE: This setting is independent of the setting for upstream session sharing matching.
- Scope:
proxy.config.http.per_server.connection.queue_size๐ฅ- Scope:
CONFIGโข Type:INTโข Default:0โข Reloadable:Yes - Controls the number of transactions that can be waiting on an upstream server group.
-1โ Unlimited.0โ Never wait. If the connection maximum has been reached immediately respond with an error.- A positive number โ If there are less than this many waiting transactions, delay this transaction and try again. Otherwise respond immediately with an error.
- Scope:
proxy.config.http.per_server.connection.queue_delayโณ- Scope:
CONFIGโข Type:INTโข Default:100โข Units:millisecondsโข Reloadable:Yes - If a transaction is delayed due to too many connections in an upstream server group, delay this amount of time before checking again.
- Scope:
proxy.config.http.per_server.connection.alert_delay๐จ- Scope:
CONFIGโข Type:INTโข Default:60โข Units:secondsโข Reloadable:Yes - Throttle alerts per upstream server group to be no more often than this many seconds. Summary data is provided per alert to allow log scrubbing to generate accurate data.
- Scope:
proxy.config.http.per_server.connection.min๐งธ- Scope:
CONFIGโข Type:INTโข Default:0โข Reloadable:Yesโข Overridable:Yes - Set a target for the minimum number of active connections to an upstream server group. When an outbound connection is in keep alive state and the inactivity timer expires, if there are fewer than this many connections in the group a new connection the timer is reset instead of closing the connection. Useful when the origin supports keep-alive, removing the time needed to set up a new connection from the next request at the expense of added (inactive) connections.
- Scope:
proxy.config.http.connect_attempts_rr_retries๐- Scope:
CONFIGโข Type:INTโข Default:3โข Reloadable:Yesโข Overridable:Yes - The maximum number of failed connection attempts allowed before a round-robin entry is marked as 'down' if a server has round-robin DNS entries.
- Scope:
proxy.config.http.connect_attempts_timeoutโฑ๏ธ- Scope:
CONFIGโข Type:INTโข Default:30โข Reloadable:Yesโข Overridable:Yes - The timeout value (in seconds) for time to set up a connection to the origin. After the connection is established the value of
proxy.config.http.transaction_no_activity_timeout_outis used to established timeouts on the data over the connection. - See Timeout Settings for more discussion on Traffic Server timeouts.
- Scope:
proxy.config.http.post_connect_attempts_timeout๐ฎ- Scope:
CONFIGโข Type:INTโข Default:1800โข Reloadable:Yesโข Overridable:Yes - The timeout value (in seconds) for an origin server connection when the client request is a POST or PUT request.
- See Timeout Settings for more discussion on Traffic Server timeouts.
- Scope:
proxy.config.http.post.check.content_length.enabled๐- Scope:
CONFIGโข Type:INTโข Default:1 - Enables (
1) or disables (0) checking theContent-Length:Header for a POST request.
- Scope:
proxy.config.http.down_server.cache_time๐๏ธ- Scope:
CONFIGโข Type:INTโข Default:60โข Reloadable:Yesโข Overridable:Yes - Specifies how long (in seconds) Traffic Server remembers that an origin server was unreachable.
- Scope:
proxy.config.http.uncacheable_requests_bypass_parent๐ซ- Scope:
CONFIGโข Type:INTโข Default:1โข Reloadable:Yesโข Overridable:Yes - When enabled (
1), Traffic Server bypasses the parent proxy for a request that is not cacheable.
- Scope:
๐ CONGESTION CONTROL ๐
this is where things get flowy, bestie. no cap.
proxy.config.http.flow_control.enabled๐- Scope:
CONFIGโข Type:INTโข Default:0โข Overridable:Yes - Transaction buffering / flow control is enabled if this is set to a non-zero value. Otherwise no flow control is done.
- Scope:
proxy.config.http.flow_control.high_water๐- Scope:
CONFIGโข Type:INTโข Default:0โข Units:bytesโข Overridable:Yes - The high water mark for transaction buffer control. External source I/O is halted when the total buffer space in use by the transaction exceeds this value.
- Scope:
proxy.config.http.flow_control.low_water๐- Scope:
CONFIGโข Type:INTโข Default:0โข Units:bytesโข Overridable:Yes - The low water mark for transaction buffer control. External source I/O is resumed when the total buffer space in use by the transaction is no more than this value.
- Scope:
proxy.config.http.websocket.max_number_of_connections๐- Scope:
CONFIGโข Type:INTโข Default:-1โข Reloadable:Yes - When enabled
>= (0), Traffic Server will enforce a maximum number of simultaneous websocket connections.
- Scope:
๐ธ NEGATIVE RESPONSE CACHING ๐ธ
Ok bestie, this is the part where Traffic Server gets to say "nah, I already know that page doesn't exist" and not bother the origin about it again. Iconic, honestly.
proxy.config.http.negative_caching_enabled
Scope CONFIG. Type INT. Default 0. Reloadable Yes. Overridable Yes.
When you turn this on (that's a 1), Traffic Server caches negative responses โ think stuff like 404 Not Found โ when a requested page straight up does not exist. So the next time a client asks for that same page, Traffic Server serves the negative response directly from cache. No origin trip, no drama. ๐
When it's off (that's a 0), Traffic Server will only cache the response if the response has Cache-Control headers.
These are the negative responses Traffic Server caches by default:
204โ No Content305โ Use Proxy403โ Forbidden404โ Not Found414โ URI Too Long500โ Internal Server Error501โ Not Implemented502โ Bad Gateway503โ Service Unavailable504โ Gateway Timeout
The cache lifetime for objects cached from this setting is controlled via proxy.config.http.negative_caching_lifetime.
proxy.config.http.negative_caching_lifetime
Scope CONFIG. Type INT. Default 1800. Reloadable Yes. Overridable Yes.
How long (in seconds, bestie, seconds) Traffic Server keeps those negative responses valid in cache. Heads up tho: this value only affects negative responses that do NOT have explicit Expires: or Cache-Control: lifetimes set by the server. If the server already said how long, that wins.
proxy.config.http.negative_caching_list
Scope CONFIG. Type STRING. Default 204 305 403 404 414 500 501 502 503 504. Reloadable Yes.
The HTTP status codes for negative caching. Default values are listed above (and in the table-of-codes we just did). You can take the unwanted status codes out of the list, and you can add other status codes in. The variable is a list but parsed as STRING โ so don't get cute with it, okay? ๐
proxy.config.http.negative_revalidating_enabled
Scope CONFIG. Type INT. Default 1. Reloadable Yes. Overridable Yes.
Negative revalidating lets Traffic Server return stale content if revalidation to the origin fails because of network or HTTP errors. If it's enabled, instead of caching the negative response, the current stale content is preserved and served. Note this is considered only on a revalidation of already cached content. And a revalidation failure means a connection failure or a 50x response code.
When Traffic Server is considering replying with a stale response in these negative revalidating circumstances, it will respect the proxy.config.http.cache.max_stale_age configuration and will not use a cached response older than max_stale_age seconds.
A value of 0 disables serving stale content, and a value of 1 enables keeping and serving stale content if revalidation fails.
proxy.config.http.negative_revalidating_lifetime
Scope CONFIG. Type INT. Default 1800.
When replying with a stale cached response in negative revalidating circumstances (see proxy.config.http.negative_revalidating_enabled), Traffic Server includes an Expires: HTTP header field in the cached response with a future time, so that upstream caches will not try to revalidate their respective stale objects. This configuration specifies how many seconds in the future Traffic Server will calculate the value of this inserted Expires: header field.
There is a limitation to this method you need to be aware of: per specification (see IETF RFC 7234, section 4.2.1),Cache-Control:response directives take precedence over theExpires:header field when determining object freshness. So if the cached response contains either amax-ageor ans-maxageCache-Control:response directive, then those directives would take precedence for the upstream caches over the insertedExpires:field, which renders theExpires:header ineffective in specifying the configured freshness lifetime.
And finally โ be aware that the only way this configuration is used is as input into calculating the value of these inserted Expires: header fields. This configuration does not direct Traffic Server behavior with regard to whether it considers a stale object to be fresh enough to serve out of cache when revalidation fails. As mentioned above in proxy.config.http.negative_revalidating_enabled, proxy.config.http.cache.max_stale_age is used for that determination.
This configuration defaults to 1,800 seconds (that's 30 minutes, bestie).
๐ซถ PROXY USER VARIABLES ๐ซถ
This whole section is basically the privacy-glam squad. Every single one of these is Scope CONFIG, Type INT, Default 0, Reloadable Yes. Let's go.
proxy.config.http.anonymize_remove_from
Scope CONFIG. Type INT. Default 0. Reloadable Yes. Overridable Yes.
When enabled (1), Traffic Server removes the From header to protect the privacy of your users.
proxy.config.http.anonymize_remove_referer
Scope CONFIG. Type INT. Default 0. Reloadable Yes.
When enabled (1), Traffic Server removes the Referrer header to protect the privacy of your site and users.
proxy.config.http.anonymize_remove_user_agent
Scope CONFIG. Type INT. Default 0. Reloadable Yes. Overridable Yes.
When enabled (1), Traffic Server removes the User-agent header to protect the privacy of your site and users.
proxy.config.http.anonymize_remove_cookie
Scope CONFIG. Type INT. Default 0. Reloadable Yes. Overridable Yes.
When enabled (1), Traffic Server removes the Cookie header to protect the privacy of your site and users.
proxy.config.http.anonymize_remove_client_ip
Scope CONFIG. Type INT. Default 0. Reloadable Yes. Overridable Yes.
When enabled (1), Traffic Server removes Client-IP headers for more privacy.
proxy.config.http.insert_client_ip
Scope CONFIG. Type INT. Default 1. Reloadable Yes. Overridable Yes.
Specifies whether Traffic Server inserts Client-IP headers to retain the client IP address:
0โ Don't insert theClient-ipheader1โ Insert theClient-ipheader, but only if the UA did not send one2โ Always insert theClient-ipheader
proxy.config.http.anonymize_other_header_list
Scope CONFIG. Type STRING. Default NULL. Reloadable Yes.
Comma separated list of headers Traffic Server should remove from outgoing requests.
proxy.config.http.insert_squid_x_forwarded_for
Scope CONFIG. Type INT. Default 1. Reloadable Yes. Overridable Yes.
When enabled (1), Traffic Server adds the client IP address to the X-Forwarded-For header.
proxy.config.http.insert_forwarded
- Scope: CONFIG
- Type: STRING
- Default: none
- Reloadable: Yes
- Overridable: Yes
So bestie, when this one is left at its default of none, Traffic Server literally does not insert or append anything to any Forwarded header (that's the one from IETF RFC 7239, iykyk) in the request message. Nada. Zip. ๐
But if you do want info in a Forwarded header on the request, this variable's value has to be a list of the Forwarded parameters you want inserted. Here's the whole menu of what each parameter drops into your outgoing Forwarded header โจ:
forโ the Client IP address ๐ซถby=ipโ the Proxy IP addressby=unknownโ the literal stringunknownby=servernameโ the Proxy server nameby=uuidโ the Server UUID prefixed with_protoโ the Protocol of the incoming requesthostโ the host specified in the incoming requestconnection=compactโ Connection with basic transaction codesconnection=stdโ Connection with detailed transaction codesconnection=fullโ Full user agent connection protocol tags
Every parameter in the list has to be separated by | or :. So like, for|by=uuid|proto is a totally valid value for this variable. No cap. ๐ธ
Heads up though: theconnectionparameter is a non-standard extension to RFC 7239 โ it's giving rebel energy. And also, while Traffic Server does let you have multiplebyparameters for the same proxy, RFC 7239 says that's prohibited. So like, do with that what you will. ๐
And one more thing โ right now, for the host parameter to actually provide the original host from the incoming client request, proxy.config.url_remap.pristine_host_hdr has to be enabled. Periodt.
proxy.config.http.proxy_protocol_allowlist ๐
- Scope: CONFIG
- Type: STRING
- Default:
<ip list>
This one defines an allowlist of server IPs that are trusted to provide connections carrying Proxy Protocol information. It's a comma delimited list of IP addresses, and addresses can be listed individually, as a range separated by a dash, or by using CIDR notation. Slay. ๐
Here's how those look in the wild:
10.0.2.123โ a single IP Address10.0.3.1-10.0.3.254โ a range of IP addresses10.0.4.0/24โ a range of IP addresses specified by CIDR notation
IMPORTANT: if Proxy Protocol is enabled on the port but this directive is not defined, then any server may initiate a connection with Proxy Protocol information. Not a vibe, bestie. ๐ญ See proxy.config.http.server_ports for the tea on how to enable Proxy Protocol on a port.
See Proxy Protocol for more discussion on how Traffic Server transforms the Forwarded: header. ๐ฆ
proxy.config.http.proxy_protocol_out โจ
- Scope: CONFIG
- Type: INT
- Default:
-1 - Reloadable: Yes
- Overridable: Yes
This sets the behavior of outbound PROXY Protocol. Options, in order of chaos:
-1โ Disable (default) ๐ค0โ Forward received PROXY protocol to the next hop1โ Send client information in PROXY protocol version 12โ Send client information in PROXY protocol version 2
proxy.config.http.normalize_ae ๐
- Scope: CONFIG
- Type: INT
- Default:
1 - Reloadable: Yes
- Overridable: Yes
Specifies normalization, if any, of Accept-Encoding: headers. The levels go like this:
0โ No normalization.1โAccept-Encoding: gzip(if the header hasgziporx-gzipwith any q) OR blank (for any header that does not includegzip)2โAccept-Encoding: brif the header hasbr(with any q) ELSE normalize as for value 13โAccept-Encoding: br, gzip(if the header hasbrandgzip(with any q for either) thenbr, gzip) ELSE normalize as for value 2
This is useful for minimizing cached alternates of documents (like, gzip, deflate vs. deflate, gzip โ same energy, two cache entries, so annoying ๐ค). Enabling this option is recommended if your origin servers use no encodings other than gzip or br (Brotli). ๐
๐ SECURITY (the part where we get protective, bestie)
proxy.config.http.push_method_enabledโ ScopeCONFIG. TypeINT. Default0. ReloadableYes.
Turns the HTTP PUSH option on (1) or off (0) ๐
and what that does is let you yeet content directly into the cache with zero user request involved. Very "I don't need permission, I'm built different" of you.
IMPORTANT, no cap: if you turn this on, you also have to specify a filtering rule in the ip_allow.yaml file so that only certain machines are allowed to push content into the cache. Do not skip this step. I am literally begging. ๐
proxy.config.http.max_post_sizeโ ScopeCONFIG. TypeINT. Default0. ReloadableYes.
This one ships disabled by default with a value of (0) ๐ซถ but any positive value will cap how big post bodies are allowed to get. And if a request rolls up with a post body that's bigger than your limit? The response gets terminated with 413 - Request Entity Too Large and it gets logged accordingly. The vibes are: too much, too large, go home. ๐
proxy.config.http.allow_multi_rangeโ ScopeCONFIG. TypeINT. Default0. ReloadableYes. OverridableYes.
This one lets the admin pick how requests with multiple ranges in the Range header get handled. Choose your fighter:
0โ Do not allow multiple ranges, effectively ignoring theRangeheader.1โ Allows multiple ranges. This can be potentially dangerous since well formed requests can cause excessive resource consumption on the server. ๐จ2โ Similar to0, except return a416error code and no response body.
proxy.config.http.host_sni_policyโ ScopeCONFIG. TypeINT. Default2.
This one is the whole host-header-vs-SNI-name mismatch bouncer, okay? And it matters because mismatches may result in SNI-based policies defined in sni.yaml being avoided. โจ
Here's the scenario, picture it: foo.com may be the fqdn value in sni.yaml which defines that client certificates are required. The user could specify bar.com as the SNI to avoid the policy requiring the client certificate, but specify foo.com as the HTTP host header to still access the same object. Sneaky. ๐
So therefore, if a host header would have triggered a SNI policy, it is possible that the user is trying to bypass a SNI policy if the host header and SNI values do not match.
Now the values:
- If this setting is
0, no checking is performed. - If this setting is
1or2, the host header and SNI values are compared if the host header value would have triggered a SNI policy. - If there is a mismatch and the value is
1, a warning is generated but the transaction is allowed to proceed. - If the value is
2and there is a mismatch, a warning is generated and a status403is returned.
And a big ol' note, because this trips people up: SNI and hostname consistency checking is not performed on all connections indiscriminately, even if this global proxy.config.http.host_sni_policy is set to a value of 1 or 2. It is only performed for connections to hosts specifying verify_client and/or ip_allow policies in sni.yaml. That is, the SNI and hostname mismatch check is only performed if a relevant security policy for the SNI is set in sni.yaml. The proxy.config.http.host_sni_policy records.config value is used as the default value if either of these policies is set in the corresponding sni.yaml file entry and the sni.yaml entry does not override this value via a host_sni_policy attribute. ๐
๐๏ธ CACHE CONTROL (my beloved)
proxy.config.cache.enable_read_while_writerโ ScopeCONFIG. TypeINT. Default1. ReloadableYes.
This one specifies when to enable the ability to read a cached object while another connection is still completing the write to cache for that same object. The goal here? Avoid multiple origin connections for the same cacheable object upon a cache miss. She's efficient, she's considerate, she's iconic. ๐
The possible values:
0โ Never read while writing.1โ Always read while writing.2โ Always read while writing, but allow non-cached Range requests through to the origin server.
The 2 option is useful to avoid delaying requests which can not easily be satisfied by the partially written response. ๐ธ
Several other configuration values need to be set for this to be usable. See Reducing Origin Server Requests (Avoiding the Thundering Herd).
proxy.config.cache.read_while_writer.max_retriesโ ScopeCONFIG. TypeINT. Default10. ReloadableYes.
Specifies how many retries trafficserver attempts to trigger read_while_writer on failing to obtain the write VC mutex, or until the first fragment is downloaded for the object being downloaded. The retry duration is specified using the setting proxy.config.cache.read_while_writer_retry.delay. โฑ๏ธ
proxy.config.cache.read_while_writer_retry.delayโ ScopeCONFIG. TypeINT. Default50. ReloadableYes.
Specifies the delay in msec that trafficserver waits to reattempt read_while_writer on failing to obtain the write VC mutex, or until the first fragment is downloaded for the object being downloaded. And note โ trafficserver implements a progressive delay in reattempting, by doubling the configured duration from the third reattempt onwards. It escalates. She's patient but she's not that patient. ๐
proxy.config.cache.force_sector_sizeโ ScopeCONFIG. TypeINT. Default0. ReloadableYes.
Forces the use of a specific hardware sector size, e.g. 4096, for all disks.
SSDs and "advanced format" drives claim a sector size of 512; however, it is safe to force a higher size than the hardware supports natively as we count atomicity in 512 byte increments. ๐ซถ
4096-sized drives formatted for Windows will have partitions aligned on 63 512-byte sector boundaries, so they will be unaligned. There are workarounds, but you need to do some research on your particular drive. Some drives have a one-time option to switch the partition boundary, while others might require reformatting or repartitioning. Do your homework, bestie, I can't do it for you. ๐
To be safe in Linux, you could just use the entire drive: /dev/sdb instead of /dev/sdb1 and Traffic Server will do the right thing. Misaligned partitions on Linux are auto-detected. โจ
For example: If /sys/block/sda/sda1/alignment_offset is non-zero, ATS will offset reads/writes to that disk by that alignment. If Linux knows about any existing partition misalignments, ATS will compensate. She's got you.
Partitions formatted to support hardware sector size of more than 512 (e.g. 4096) will result in all objects stored in the cache to be integral multiples of 4096 bytes, which will result in some waste for small files. Small files catching strays, as always. ๐
proxy.config.http.cache.httpโ ScopeCONFIG. TypeINT. Default1. ReloadableYes. OverridableYes.
Enables (1) or disables (0) caching of HTTP requests. Simple. Clean. Gorgeous. ๐
proxy.config.http.cache.post_methodโ ScopeCONFIG. TypeINT. Default0. ReloadableYes. OverridableYes.
Enables (1) or disables (0) caching of HTTP POST requests.
proxy.config.http.cache.generationโ ScopeCONFIG. TypeINT. Default-1. ReloadableYes. OverridableYes.
If set to a value other than -1, the value of this configuration option is combined with the cache key at cache lookup time. Changing this value has the effect of an instantaneous, zero-cost cache purge since it will cause all subsequent cache keys to change. ๐ฅ Since this is an overridable configuration, it can be used to purge the entire cache, or just a specific remap.config rule. Pick your chaos level, honestly.
proxy.config.http.doc_in_cache_skip_dnsโ ScopeCONFIG. TypeINT. Default1. ReloadableYes. OverridableYes.
When enabled (1), do not perform origin server DNS resolution if a fresh copy of the requested document is available in the cache. ๐ This setting has no effect if HTTP caching is disabled or if there are IP based ACLs configured.
Note that plugins, particularly authorization plugins, which use the TS_HTTP_OS_DNS_HOOK hook may require this configuration variable to be disabled (0) in order to function properly. This will ensure that the hook will be evaluated and plugin execution will occur even when there is a fresh copy of the requested object in the cache (which would normally allow the DNS lookup to be skipped, thus eliminating the hook evaluation). So if your auth plugin is acting up, this is your girl. ๐
The downside is that the performance gain by skipping otherwise unnecessary DNS lookups is lost. Because the variable is overridable, you may retain this performance benefit for portions of your cache which do not require the use of TS_HTTP_OS_DNS_HOOK plugins, by ensuring that the setting is first disabled within only the relevant transactions. Refer to the documentation on Configuration Remap Plugin for more information.
proxy.config.http.cache.ignore_client_no_cacheโ ScopeCONFIG, TypeINT, Default1, Reloadable Yes, Overridable Yes- When enabled (
1), Traffic Server ignores client requests to bypass the cache. Specifically,Pragma: no-cache,Cache-Control: no-cacheandCache-Control: no-storein requests are ignored. bestie said "don't cache this" and we said "lol okay anyway" ๐
- When enabled (
proxy.config.http.cache.ims_on_client_no_cacheโ ScopeCONFIG, TypeINT, Default1, Reloadable Yes, Overridable Yes- When enabled (
1), Traffic Server issues a conditional request to the origin server if an incoming request has aNo-Cacheheader. like, if you're gonna be picky, we'll at least go ask origin nicely ๐ซถ
- When enabled (
proxy.config.http.cache.ignore_server_no_cacheโ ScopeCONFIG, TypeINT, Default0, Reloadable Yes, Overridable Yes- When enabled (
1), Traffic Server ignores origin server requests to bypass the cache. Specifically,Pragma: no-cache,Cache-Control: no-cacheandCache-Control: no-storein responses are ignored.
- When enabled (
proxy.config.http.cache.cache_responses_to_cookiesโ ScopeCONFIG, TypeINT, Default1, Reloadable Yes, Overridable Yes- Specifies how cookies are cached: the whole cookie lore, laid out for u โจ
0โ Do not cache any responses to cookies.1โ Cache for any content-type.2โ Cache only for image types.3โ Cache for all but text content-types.4โ Cache for all but text content-types; except origin server response withoutSet-Cookieor withCache-Control: public.
- Specifies how cookies are cached: the whole cookie lore, laid out for u โจ
proxy.config.http.cache.ignore_authenticationโ ScopeCONFIG, TypeINT, Default0, Overridable Yes- When enabled (
1), Traffic Server ignoresWWW-Authenticationheaders in responses and the responses are cached. noReloadablehere, so this one needs a full restart โ noted ๐
- When enabled (
proxy.config.http.cache.cache_urls_that_look_dynamicโ ScopeCONFIG, TypeINT, Default1, Reloadable Yes, Overridable Yes- Enables (
1) or disables (0) caching of URLs that look dynamic, i.e.: URLs that end in.aspor contain a question mark (?), a semicolon (;), orcgi. For a full list, please refer toHttpTransact::url_looks_dynamic
- Enables (
proxy.config.http.cache.when_to_revalidateโ ScopeCONFIG, TypeINT, Default0, Reloadable Yes, Overridable Yes- Specifies when to revalidate content:
0โ Use cache directives or heuristic (the default value).1โ Stale if heuristic.2โ Always stale (always revalidate).3โ Never stale.4โ Use cache directives or heuristic (0) unless the request has anIf-Modified-Sinceheader.
- Specifies when to revalidate content:
If the request contains the If-Modified-Since header, then Traffic Server always revalidates the cached content and uses the client's If-Modified-Since header for the proxy request. no skipping the vibe check on that one, fr fr
proxy.config.http.cache.required_headersโ ScopeCONFIG, TypeINT, Default2, Reloadable Yes, Overridable Yes- The type of headers required in a request for the request to be cacheable.
0โ No headers required to make document cacheable.1โ Either theLast-Modifiedheader, or an explicit lifetime header (ExpiresorCache-Control: max-age) is required.2โ Explicit lifetime is required, from eitherExpiresorCache-Control: max-age.
- The type of headers required in a request for the request to be cacheable.
proxy.config.http.cache.max_stale_ageโ ScopeCONFIG, TypeINT, Default604800, Reloadable Yes, Overridable Yes- The maximum age in seconds allowed for a stale response before it cannot be cached. that's 604800 seconds of being expired but still cute enough to keep ๐ธ
proxy.config.http.cache.guaranteed_min_lifetimeโ ScopeCONFIG, TypeINT, Default0, Reloadable Yes, Overridable Yes- Establishes a guaranteed minimum lifetime boundary for object freshness. Setting this to
0(default) disables the feature.
- Establishes a guaranteed minimum lifetime boundary for object freshness. Setting this to
proxy.config.http.cache.guaranteed_max_lifetimeโ ScopeCONFIG, TypeINT, Default31536000, Reloadable Yes, Overridable Yes- Establishes a guaranteed maximum lifetime boundary for object freshness. Setting this to
0disables the feature.
- Establishes a guaranteed maximum lifetime boundary for object freshness. Setting this to
proxy.config.http.cache.range.lookupโ ScopeCONFIG, TypeINT, Default1, Overridable Yes- When enabled (
1), Traffic Server looks up range requests in the cache.
- When enabled (
proxy.config.http.cache.range.writeโ ScopeCONFIG, TypeINT, Default0, Overridable Yes- When enabled (
1), Traffic Server will attempt to write (lock) the URL to cache for a request specifying a range. This is useful when the origin server might ignore a range request and respond with a full (200) response. Additionally, this setting will attempt to transform a200response from the origin server to a partial (206) response, honoring the requested range, while caching the full response. glow-up: 200 to 206, iconic behavior โจ
- When enabled (
proxy.config.http.cache.ignore_accept_mismatchโ ScopeCONFIG, TypeINT, Default2, Reloadable Yes, Overridable Yes- When enabled with a value of
1, Traffic Server serves documents from cache with aContent-Type:header even if it does not match theAccept:header of the request. If set to2(default), this logic only happens in the absence of aVaryheader in the cached response (which is the recommended and safe use).
- When enabled with a value of
NOTE: This option should only be enabled with1if you're having problems with caching and you origin server doesn't set theVaryheader. Alternatively, if the origin is incorrectly settingVary: Acceptor doesn't respond with406(Not Acceptable), you can also enable this configuration with a1. do NOT just yolo this to1, bestie, the default exists for a reason ๐ญ
proxy.config.http.cache.ignore_accept_language_mismatchโ ScopeCONFIG, TypeINT, Default2, Reloadable Yes, Overridable Yes- When enabled with a value of
1, Traffic Server serves documents from cache with aContent-Language:header even if it does not match theAccept-Language:header of the request. If set to2(default), this logic only happens in the absence of aVaryheader in the cached response (which is the recommended and safe use). same energy as the one above, just for languages ๐ฆ
- When enabled with a value of
NOTE: bestie, only flip this to1if caching is acting up AND your origin server isn't setting theVaryheader. Or, if your origin is settingVary: Accept-Languagewrong, or just refuses to send back406 (Not Acceptable), then yeah โ1is also valid there.
proxy.config.http.cache.ignore_accept_encoding_mismatchโ when it's on with a value of1, Traffic Server will serve documents straight outta cache with aContent-Encoding:header even when it does NOT match the request'sAccept-Encoding:header. If it's set to2(which is the default), this whole logic only kicks in when there's noVaryheader in the cached response โ and that's the recommended, safe way to use it ๐- Scope:
CONFIG - Type:
INT - Default:
2 - Reloadable: Yes
- Overridable: Yes
- Scope:
NOTE: again โ only enable with1if caching is giving you problems and your origin server doesn't set theVaryheader. Alternatively, if the origin is incorrectly settingVary: Accept-Encodingor doesn't respond with406 (Not Acceptable), you can also enable this with a1.
proxy.config.http.cache.ignore_accept_charset_mismatchโ when enabled with a value of1, Traffic Server serves documents from cache with aContent-Type:header even if it does not match theAccept-Charset:header of the request. Set it to2(the default) and this logic only happens when there's noVaryheader in the cached response โ again, the recommended and safe use โจ- Scope:
CONFIG - Type:
INT - Default:
2 - Reloadable: Yes
- Overridable: Yes
- Scope:
NOTE: yep, same deal โ only enable with1if you're having caching problems and your origin server doesn't set theVaryheader. Or if the origin is incorrectly settingVary: Accept-Charset, or doesn't respond with406 (Not Acceptable), you can also enable it with a1.
proxy.config.http.cache.ignore_client_cc_max_ageโ when enabled (1), Traffic Server ignores anyCache-Control: max-ageheaders coming from the client. Technically this violates the HTTP RFC ๐ but it dodges a whole problem where a client can forcefully invalidate a cached object.- Scope:
CONFIG - Type:
INT - Default:
1 - Reloadable: Yes
- Overridable: Yes
- Scope:
proxy.config.cache.max_doc_sizeโ specifies the maximum object size that will be cached.0means unlimited ๐- Scope:
CONFIG - Type:
INT - Default:
0
- Scope:
proxy.config.cache.min_average_object_sizeโ sets the lower boundary of average object sizes in the cache, and it's used to figure out how many directory buckets to allocate for the in-memory cache directory.- Scope:
CONFIG - Type:
INT - Default:
8000
- Scope:
proxy.config.cache.permit.pinningโ when enabled (1), Traffic Server keeps certain HTTP objects in the cache for a certain amount of time, as specified incache.config.- Scope:
CONFIG - Type:
INT - Default:
0 - Reloadable: Yes
- Scope:
proxy.config.cache.hit_evacuate_percentโ the size of the region (as a percentage of the total content storage in a cache stripe) sitting in front of the write cursor that counts as a recent access hit, for the purpose of evacuating the accessed object.
So here's the vibe: when an object gets accessed, it can be marked for evacuation โ meaning it gets copied over the write cursor and therefore saved from being overwritten ๐ . That happens if it's no more than a specific number of bytes in front of the write cursor. That number of bytes is a percentage of the total number of bytes of content storage in the cache stripe where the object lives, and this variable is what sets that percentage.
By default, the feature is off (set to 0).
- Scope:
CONFIG - Type:
INT - Default:
0
proxy.config.cache.hit_evacuate_size_limitโ limits the size of objects that get hit evacuated. Objects bigger than the limit are not hit evacuated. A value of0disables the limit.- Scope:
CONFIG - Type:
INT - Default:
0 - Units: bytes
- Scope:
proxy.config.cache.limits.http.max_altsโ the maximum number of alternates allowed for any given URL. Disable it by setting it to0.- Scope:
CONFIG - Type:
INT - Default:
5
- Scope:
proxy.config.cache.log.alternate.evictionโ when enabled (1), Traffic Server emits aStatuslevel log entry every single time an alternate for an object gets evicted because the number of its alternates went over the value ofproxy.config.cache.limits.http.max_alts. The URI for the evicted alternate is included in that log ๐. This logging is lowkey useful for figuring out whetherproxy.config.cache.limits.http.max_altsis actually tuned right for a given environment. It also gives you visibility into alternate eviction for individual objects, which is highkey helpful when you're diagnosing unexpectedVary:header behavior from particular origins.
For further details concerning the caching of alternates, see Caching HTTP Alternates.
By default, alternate eviction logging is disabled (set to 0).
- Scope:
CONFIG - Type:
INT - Default:
0
proxy.config.cache.target_fragment_sizeโ sets the target size of a contiguous fragment of a file in the disk cache. When you're picking this number, keep in mind that bigger values could waste memory on slow connections, but smaller values could increase (read: waste) seeks ๐ซ- Scope:
CONFIG - Type:
INT - Default:
1048576
- Scope:
proxy.config.cache.alt_rewrite_max_sizeโ configures the size, in bytes, of an alternate that'll be considered small enough to trigger a rewrite of the resident alt fragment inside a write vector. For further details on cache write vectors, go check the developer documentation forCacheVC.- Scope:
CONFIG - Type:
INT - Default:
4096 - Reloadable: Yes
- Scope:
๐ RAM CACHE ๐
proxy.config.cache.ram_cache.sizeโ by default the RAM cache size is determined automatically, based on disk cache size; approximately10 MBof RAM cache perGBof disk cache. Alternatively, you can set it to a fixed value such as20GB(21474836480) ๐พ- Scope:
CONFIG - Type:
INT - Default:
-1
- Scope:
proxy.config.cache.ram_cache_cutoffโ objects greater than this size will not be kept in the RAM cache. Set it high enough to keep frequently accessed objects in memory so performance stays cute. That's4MB(4194304) ๐- Scope:
CONFIG - Type:
INT - Default:
4194304
- Scope:
proxy.config.cache.ram_cache.algorithmโ two distinct RAM caches are supported here. The default (1) is the simpler LRU (Least Recently Used) cache. As an alternative, CLFUS (Clocked Least Frequently Used by Size) is also available โ you get it by changing this configuration to0โจ- Scope:
CONFIG - Type:
INT - Default:
1
- Scope:
proxy.config.cache.ram_cache.use_seen_filterโ enabling this option filters inserts into the RAM cache to make sure they've been seen at least once. For the LRU, this provides scan resistance. Note that CLFUS already requires a document to have history before it gets inserted, so for CLFUS, setting this option means a document has to be seen three times before it's added to the RAM cache ๐- Scope:
CONFIG - Type:
INT - Default:
1
- Scope:
proxy.config.cache.ram_cache.compressโ the CLFUS RAM cache also supports an optional in-memory compression. Do not confuse this withContent-Encoding: gzipcompression, bestie ๐ The RAM cache compression is meant to try to save space in the RAM, and it is not visible to the User-Agent (client).
Possible values are:
0โ No compression1โ Fastlz (extremely fast, relatively low compression)2โ Libz (moderate speed, reasonable compression)3โ Liblzma (very slow, high compression)
Compression runs on task threads. To use more cores for RAM cache compression, increase proxy.config.task_threads ๐ฅ
- Scope:
CONFIG - Type:
INT - Default:
0
๐ธ HEURISTIC EXPIRATION ๐ธ
proxy.config.http.cache.heuristic_min_lifetimeโ the minimum amount of time, in seconds, that an HTTP object without an expiration date can stay fresh in the cache before it's considered stale.- Scope:
CONFIG - Type:
INT - Default:
3600 - Reloadable: Yes
- Overridable: Yes
- Scope:
proxy.config.http.cache.heuristic_max_lifetimeโ the maximum amount of time, in seconds, that an HTTP object without an expiration date can stay fresh in the cache before it's considered stale.- Scope:
CONFIG - Type:
INT - Default:
86400 - Reloadable: Yes
- Overridable: Yes
- Scope:
proxy.config.http.cache.heuristic_lm_factorโ the aging factor for freshness computations. Traffic Server stores an object for this percentage of the time that elapsed since it last changed โณ- Scope:
CONFIG - Type:
FLOAT - Default:
0.10 - Reloadable: Yes
- Overridable: Yes
- Scope:
โจ DYNAMIC CONTENT & CONTENT NEGOTIATION โจ
Okay bestie, buckle up, we're getting into the cache-lock girlie drama now ๐
proxy.config.http.cache.open_read_retry_time- Scope:
CONFIG - Type:
INT - Default:
10 - Reloadable: Yes
- Overridable: Yes
- Scope:
So like, when a request is cacheable and there's already an equivalent request out there in flight, this is the number of milliseconds our girl waits before she goes and asks the cache for the object. Just a lil patience moment ๐ซถ
proxy.config.http.cache.max_open_read_retries- Scope:
CONFIG - Type:
INT - Default:
-1 - Reloadable: Yes
- Overridable: Yes
- Scope:
How many times we're gonna try to pull the object out of cache when there was an equivalent request already in flight. That's it, that's the vibe โจ
proxy.config.http.cache.max_open_write_retries- Scope:
CONFIG - Type:
INT - Default:
1 - Reloadable: Yes
- Overridable: Yes
- Scope:
The number of times we attempt a cache open write after failing to get a write lock. Like, we tried, it didn't work, so we try again this many times ๐
Heads up bestie: this config gets ignored whenproxy.config.http.cache.open_write_fail_actionis set to5. No cap.
proxy.config.http.cache.open_write_fail_action- Scope:
CONFIG - Type:
INT - Default:
0 - Reloadable: Yes
- Overridable: Yes
- Scope:
This one tells us what to do when we fail to grab the cache open write lock โ and that happens on either a cache miss or a cache hit stale. The way this typically goes down is when more than one request hits the same cache object at the same time ๐ During that little scenario, every request except one (the lucky one that goes to the origin) gets served either a stale copy or an error, and it all depends on this setting.
Here's the whole menu, ordered, no skips ๐
0โ Default. Disable cache and go to origin server.1โ Return a502error on a cache miss.2โ Serve stale if object's age is underproxy.config.http.cache.max_stale_age. Otherwise, go to origin server.3โ Return a502error on a cache miss or serve stale on a cache revalidate if object's age is underproxy.config.http.cache.max_stale_age. Otherwise, go to origin server.4โ Return a502error on either a cache miss or on a revalidation.5โ Retry Cache Read on a Cache Write Lock failure. This option together withproxy.config.cache.enable_read_while_writerconfiguration allows to collapse concurrent requests without a need for any plugin. Make sure to configure the Read While Writer feature correctly. Note that this option may result inCACHE_LOOKUP_COMPLETEHOOK being called back more than once.
Real talk though: if you pick5, please please please make sure the Read While Writer feature is configured correctly. And keep in mind it can make theCACHE_LOOKUP_COMPLETEHOOK get called back more than once โ not a glitch, just how she moves ๐ญ
โจ CUSTOMIZABLE USER RESPONSE PAGES โจ
okay bestie, this whole section is about the pages Traffic Server shows when things go sideways โ the error pages, the "hey something broke" screens. You can make them cute, make them multilingual, or just yeet them entirely. Let's go ๐
๐ proxy.config.body_factory.enable_customizations
- Scope:
CONFIG - Type:
INT - Default:
1
This one decides whether your customizable response pages are language specific or not. Pick your fighter:
1โ Enable customizable user response pages in the default directory only.2โ Enable language-targeted user response pages.3โ Enable host-targeted user response pages.
๐ proxy.config.body_factory.enable_logging
- Scope:
CONFIG - Type:
INT - Default:
0
Enables (1) or disables (0) logging for customizable response pages. When it's turned on, Traffic Server drops a message in the error log every single time a customized response page gets used or modified. Not me spamming the log ๐ โ actually yes, me.
๐ proxy.config.body_factory.template_sets_dir
- Scope:
CONFIG - Type:
STRING - Default:
etc/trafficserver/body_factory
The customizable response page default directory. Heads up though: if this is a relative path, Traffic Server resolves it relative to the PREFIX directory. So it's giving "wherever PREFIX lives" energy, not "wherever you're standing" energy ๐ฆ
๐ proxy.config.body_factory.template_base
- Scope:
CONFIG - Type:
STRING - Default:
"" - Reloadable: Yes
- Overridable: Yes
A prefix for the file name to use to find an error template file. If it's set (aka not the empty string), this value and an underscore get prepended to the file name to find in the template sets directory. See HTML Messages Sent to Clients for the whole story. Periodt.
๐ proxy.config.body_factory.response_max_size
- Scope:
CONFIG - Type:
INT - Default:
8192 - Reloadable: Yes
Maximum size of the error template response page. That's the ceiling, bestie โ don't try to sneak a bigger template past it.
๐ proxy.config.body_factory.response_suppression_mode
- Scope:
CONFIG - Type:
INT - Default:
0 - Reloadable: Yes
- Overridable: Yes
Specifies when Traffic Server suppresses generated response pages. The vibes:
0โ Never suppress generated response pages.1โ Always suppress generated response pages.2โ Suppress response pages only for internal traffic.
๐ proxy.config.http_ui_enabled
- Scope:
CONFIG - Type:
INT - Default:
0
Specifies which http Inspector UI endpoints to allow within remap.config. Lowkey the bouncer at the club door:
0โ Disable all http UI endpoints.1โ Enable only Cache Inspector endpoints.2โ Enable only stats endpoints.3โ Enable all http UI endpoints.
โ ๏ธ Okay important: to enable any endpoint there needs to be an entry in remap.config which specifically enables it. Such a line would look like:
map / http://{cache}
The following are the cache endpoints:
cacheโ UI to interact with the cache.
The following are the stats endpoints:
cache-internalโ Statistics about cache evacuation and volumes.hostdbโ Lookups against the hostdb.httpโ HTTPSM details, this endpoint is also gated byproxy.config.http.enable_http_info.netโ Lookup and listing of open connections.
๐ proxy.config.http.enable_http_info
- Scope:
CONFIG - Type:
INT - Default:
0
Enables (1) or disables (0) access to an endpoint within proxy.config.http_ui_enabled which shows details about inflight transactions (HttpSM). Yeah, it's a whole gate-behind-a-gate situation ๐ฅ โ turn this on and that http stats endpoint actually unlocks.
๐ฆ DNS ๐ฆ
Okay bestie, welcome to the DNS wing of the config file ๐ this is where you tell Traffic Server how to go from a cute little hostname to an actual IP address. Every knob in here is a resolver vibe, so let's get into it.
proxy.config.dns.search_default_domains
Scope CONFIG ยท Type INT ยท Default 0 ยท Reloadable Yes
So here's the tea: Traffic Server can try to resolve unqualified hostnames by gluing your local domain onto the end of them. Like, if a client asks for an unqualified host (say host_x) and the Traffic Server local domain is y.com, then Traffic Server is gonna expand that hostname into host_x.y.com. It's giving "let me just assume what you meant" ๐
0โ Disable local domain expansion. Nope, not doing it, no assumptions.1โ Enable local domain expansion. Yes queen, expand away.2โ Enable local domain expansion, but do not split the local domain name.
proxy.config.dns.splitDNS.enabled
Scope CONFIG ยท Type INT ยท Default 0 ยท Reloadable Yes
Turns DNS server selection on (1) or off (0). When it's enabled, Traffic Server goes and peeks at the splitdns.config file for the selection spec. Refer to Configuring DNS Server Selection if you wanna know more. ๐
proxy.config.dns.resolv_conf
Scope CONFIG ยท Type STRING ยท Default /etc/resolv.conf
Lets you pick which resolv.conf file Traffic Server uses to find resolvers ๐ The format of this file has to be exactly the same as the standard resolv.conf file, but the whole point is that an admin can keep the set of resolvers in an external config file without messing with how the rest of the operating system does DNS. Iconic, honestly.
Heads up bestie: this setting works in conjunction withproxy.config.dns.nameserversโ its settings get appended to theresolv.confcontents. โจ
proxy.config.dns.round_robin_nameservers
Scope CONFIG ยท Type INT ยท Default 1 ยท Reloadable Yes
Enables (1) or disables (0) DNS server round-robin. Spin that wheel ๐ก
proxy.config.dns.nameservers
Scope CONFIG ยท Type STRING ยท Default NULL ยท Reloadable Yes
The DNS servers themselves. But listen โ this does not override proxy.config.dns.resolv_conf. Like, the contents of the file listed in proxy.config.dns.resolv_conf will be appended to the list of nameservers you put here. Wanna stop that from happening? List a bogus file over there and it won't have anything to append. Sneaky but valid ๐
Example
IPv4 DNS server, loopback and port 9999
CONFIG proxy.config.dns.nameservers STRING 127.0.0.1:9999
Example
IPv6 DNS server, loopback and port 9999
CONFIG proxy.config.dns.nameservers STRING [::1]:9999
proxy.config.srv_enabled
Scope CONFIG ยท Type INT ยท Default 0 ยท Reloadable Yes ยท Overridable Yes
Enables (1) or disables (0) using SRV records for origin server lookup ๐ฆ When it's on, Traffic Server takes the weights found in the SRV record and uses them as a weighted round robin for origin selection. Cute and fair.
Also, big detail: Traffic Server will look up _$scheme._$internet_protocol.$origin_name. So for example, if the origin is set to https://my.example.com, Traffic Server would look up _https._tcp.my.example.com.
And one more thing that will absolutely bite you if you ignore it: the port returned in the SRV record MUST match the port being used for the origin. Like, if the origin scheme is http and it's using the default port, there should be a SRV record with port 80. No mismatches, periodt. ๐
proxy.config.dns.dedicated_thread
Scope CONFIG ยท Type INT ยท Default 0
Creates and dedicates a whole entire thread just for DNS processing ๐ This is probably most useful on systems that do a significant number of DNS lookups โ typically forward proxies. But even on other systems, it can avoid some contention on the first worker thread (which otherwise just takes on the burden of all DNS lookups like an unpaid intern). Give that thread its own room, it deserves it ๐ซถ
proxy.config.dns.validate_query_name
Scope CONFIG ยท Type INT ยท Default 0
When enabled (1), this gives you extra resilience against DNS forgery (for instance in DNS Injection attacks) โ especially useful in forward or transparent proxies ๐ฅ But there's a catch: it requires that the resolver actually populates the queries section of the response properly. If it doesn't, this won't save you, bestie.
proxy.config.dns.connection_mode
Scope CONFIG ยท Type INT ยท Default 0
There are three connection modes between Traffic Server and nameservers you can set โ UDP_ONLY, TCP_RETRY, TCP_ONLY. Pick your fighter:
0โUDP_ONLY: Traffic Server always talks to nameservers over UDP.1โTCP_RETRY: Traffic Server does UDP first, and retries with TCP if the UDP response is truncated.2โTCP_ONLY: Traffic Server always talks to nameservers over TCP.
proxy.config.dns.max_tcp_continuous_failures
Scope CONFIG ยท Type INT ยท Default 10
If your DNS connection mode is TCP_RETRY, this sets the threshold for the continuous TCP query failures count on the TCP connection. If the continuous TCP query failures count goes over the threshold, the TCP connection gets reset immediately. And if the threshold is 0 (or less than 0), we close this feature entirely. Shut it down ๐
proxy.config.dns.max_dns_in_flight
Scope CONFIG ยท Type INT ยท Default 2048
Maximum inflight DNS queries made by Traffic Server at any given instant. Yes, there's a cap, this is a whole vibe check on your resolver traffic โจ
proxy.config.dns.lookup_timeout
Scope CONFIG ยท Type INT ยท Default 20
How long to wait for a DNS response, in seconds. After that, we're not waiting anymore bestie, we have places to be โณ
proxy.config.dns.retries
Scope CONFIG ยท Type INT ยท Default 5
Maximum number of retries Traffic Server makes on a given DNS query. Five chances, and then it's giving up ๐ญ
proxy.config.dns.local_ipv4
Scope CONFIG ยท Type STRING ยท Default NULL
Local IPV4 address to bind to in order to make DNS requests. ๐
proxy.config.dns.local_ipv6
Scope CONFIG ยท Type STRING ยท Default NULL
Local IPV6 address to bind to in order to make DNS requests. ๐
๐ฆ HOSTDB ๐ฆ
okay so this is the host database โ the little memory box where Traffic Server keeps track of which hostname goes with which IP. there are so many knobs here bestie, buckle up ๐
proxy.config.hostdb.lookup_timeoutโ how long we sit around waiting for a DNS response, in seconds.- Scope:
CONFIG. Type:INT. Default:30. Units: seconds. Reloadable: Yes.
- Scope:
See Timeout Settings for more discussion on Traffic Server timeouts.
proxy.config.hostdb.serve_stale_forโ the number of seconds you're allowed to keep using a stale NS record while a background fetch goes and gets the fresh data.- Scope:
CONFIG. Type:INT. Default: NONE. Units: seconds. Reloadable: Yes.
- Scope:
If you don't set it, stale records just aren't served, periodt.
proxy.config.hostdb.max_sizeโ the maximum amount of space (in bytes) that gets allocated to hostdb.- Scope:
CONFIG. Type:INT. Default:10737418240. Units: bytes.
- Scope:
Set this to -1 and size limit enforcement is โจdisabledโจ.
proxy.config.hostdb.max_countโ the maximum number of entries that can live in hostdb. A value of-1disables item count limit enforcement.- Scope:
CONFIG. Type:INT. Default:-1.
- Scope:
NOTE: For values above200000, you must increaseproxy.config.hostdb.max_sizeby at least44bytes per entry.
proxy.config.hostdb.round_robin_max_countโ the maximum count of DNS answers per round robin hostdb record. The default variable is16.- Scope:
CONFIG. Type:INT. Default:16.
- Scope:
proxy.config.hostdb.ttl_modeโ a host entry will eventually time out and get yeeted, and this variable controls how that time gets calculated. A DNS request returns a TTL value, and you can also set an internal value withproxy.config.hostdb.timeout. This variable decides which one wins ๐- Scope:
CONFIG. Type:INT. Default:0. Reloadable: Yes.
- Scope:
the values, bestie:
0โ The TTL from the DNS response.1โ The internal timeout value.2โ The smaller of the DNS and internal TTL values. The internal timeout value becomes a maximum TTL.3โ The larger of the DNS and internal TTL values. The internal timeout value become a minimum TTL.
proxy.config.hostdb.timeoutโ internal time to live value for host DB entries, in seconds.- Scope:
CONFIG. Type:INT. Default:86400. Units: seconds. Reloadable: Yes.
- Scope:
See proxy.config.hostdb.ttl_mode for when this value is used. See Timeout Settings for more discussion on Traffic Server timeouts.
proxy.config.hostdb.fail.timeoutโ time to live value for "failed" hostdb lookups.- Scope:
CONFIG. Type:INT. Default:0.
- Scope:
NOTE: HostDB considers any response that does not contain a response to the query a failure. This means "failure" responses (such as SOA) are subject to this timeout
proxy.config.hostdb.strict_round_robinโ set host resolution to use strict round robin.- Scope:
CONFIG. Type:INT. Default:0. Reloadable: Yes.
- Scope:
When this and proxy.config.hostdb.timed_round_robin are both disabled (set to 0), Traffic Server always uses the same origin server for the same client, for as long as the origin server is available. Otherwise if this is set then IP address is rotated on every request. This setting takes precedence over proxy.config.hostdb.timed_round_robin.
proxy.config.hostdb.timed_round_robinโ set host resolution to use timed round robin.- Scope:
CONFIG. Type:INT. Default:0. Reloadable: Yes.
- Scope:
When this and proxy.config.hostdb.strict_round_robin are both disabled (set to 0), Traffic Server always uses the same origin server for the same client, for as long as the origin server is available. Otherwise if this is set to N the IP address is rotated if more than N seconds have passed since the first time the current address was used.
proxy.config.hostdb.host_file.pathโ set the file path for an external host file.- Scope:
CONFIG. Type:STRING. Default:NULL.
- Scope:
If this is set (non-empty) then the file is presumed to be a hosts file in the standard . It is read and the entries there added to the HostDB. The file is periodically checked for a more recent modification date, in which case it is reloaded. The interval is set with proxy.config.hostdb.host_file.interval.
While not technically reloadable, the value is read every time the file is to be checked so that if changed the new value will be used on the next check and the file will be treated as modified.
proxy.config.hostdb.host_file.intervalโ set the file changed check timer forproxy.config.hostdb.host_file.path.- Scope:
CONFIG. Type:INT. Default:86400. Units: seconds. Reloadable: Yes.
- Scope:
The file is checked every this many seconds to see if it has changed. If so the HostDB is updated with the new values in the file.
proxy.config.hostdb.partitionsโ the number of partitions for hostdb. If you are seeing lock contention within hostdb's cache (due to a large number of records) you can increase the number of partitions- Scope:
CONFIG. Type:INT. Default:64.
- Scope:
proxy.config.hostdb.ip_resolveโ set the host resolution style.- Scope:
CONFIG. Type:STRING. Default:NULL. Overridable: Yes.
- Scope:
This is an ordered list of keywords separated by semicolons that specify how a host name is to be resolved to an IP address. The keywords are case insensitive ๐ซถ
ipv4โ Resolve to an IPv4 address.ipv6โ Resolve to an IPv6 address.clientโ Resolve to the same family as the client IP address.onlyโ Stop resolving.
The order of the keywords is critical. When a host name needs to be resolved it is resolved in same order as the keywords. If a resolution fails, the next option in the list is tried. The keyword only means to give up resolution entirely. The keyword list has a maximum length of three keywords, more are never needed. By default there is an implicit ipv4;ipv6 attached to the end of the string unless the keyword only appears.
๐ซ Example ๐ซ
Use the incoming client family, then try IPv4 and IPv6.
client;ipv4;ipv6
Because of the implicit resolution this can also be expressed as just
client
๐ซ Example ๐ซ
Resolve only to IPv4.
ipv4;only
๐ซ Example ๐ซ
Resolve only to the same family as the client (do not permit cross family transactions).
client;only
This value is a global default that can be overridden by proxy.config.http.server_ports.
NOTE: This style is used as a convenience for the administrator. During a resolution the resolution order will be one family, then possibly the other. This is determined by changingclienttoipv4oripv6based on the client IP address and then removing duplicates.
IMPORTANT: This option has no effect on outbound transparent connections The local IP address used in the connection to the origin server is determined by the client, which forces the IP address family of the address used for the origin server. In effect, outbound transparent connections always use a resolution style of "client".
proxy.config.hostdb.verify_afterโ set the interval (in seconds) in which to re-query DNS regardless of TTL status.- Scope:
CONFIG. Type:INT. Default:720.
- Scope:
proxy.config.hostdb.filenameโ the filename to persist hostdb to on disk.- Scope:
CONFIG. Type:STRING. Default:host.db.
- Scope:
proxy.config.cache.hostdb.sync_frequencyโ set the frequency (in seconds) to sync hostdb to disk. If set to zero (default as of v9.0.0), we won't sync to disk ever.- Scope:
CONFIG. Type:INT. Default:0.
- Scope:
Note: hostdb is synced to disk on a per-partition basis (of which there are 64). This means that the minimum time to sync all data to disk is proxy.config.cache.hostdb.sync_frequency * 64
๐ LOGGING CONFIGURATION ๐
next era unlocked, and it's all about logs ๐ the very first variable in this section is:
proxy.config.log.logging_enabledproxy.config.log.logging_enabled(that's the one whose scope we just saw) โ ScopeCONFIG. TypeINT. Default3. Reloadable Yes.
Turns event logging on and off, and decides what actually gets written. Your options, bestie:
0โ Logging disabled. Nothing. Nada. ๐ซ1โ Log errors only.2โ Log transactions only.3โ Dual logging (errors and transactions). That's the default, so yeah, you get both. ๐
Refer to Logging for more information on event logging.
proxy.config.log.max_secs_per_bufferโ ScopeCONFIG. TypeINT. Default5. Reloadable Yes.
The maximum amount of time before data in the buffer is flushed to disk. So like, the longest your buffered log lines can just sit there before they get pushed out. ๐ฆ
NOTE: The effective lower bound to this config is whatever proxy.config.log.periodic_tasks_interval is set to. So if that one's set higher, that's your real floor, no cap.
proxy.config.log.max_space_mb_for_logsโ ScopeCONFIG. TypeINT. Default25000. Units megabytes. Reloadable Yes.
The amount of space allocated to the logging directory (in MB). The headroom amount specified by proxy.config.log.max_space_mb_headroom is taken from this space allocation. ๐ฆ
NOTE: All files in the logging directory contribute to the space used, even if they are not log files. Yes bestie, your random stray files count too. ๐ญ
proxy.config.log.max_space_mb_headroomโ ScopeCONFIG. TypeINT. Default1000. Units megabytes. Reloadable Yes.
The tolerance for the log space limit (in megabytes). If the variable proxy.config.log.auto_delete_rolled_files is set to 1 (enabled), then auto-deletion of log files is triggered when the amount of free space available in the logging directory is less than the value specified here. It's giving โจsafety cushionโจ.
proxy.config.log.hostnameโ ScopeCONFIG. TypeSTRING. Defaultlocalhost. Reloadable Yes.
The hostname of the machine running Traffic Server. Just telling it who it is. Main character energy. ๐
proxy.config.log.logfile_dirโ ScopeCONFIG. TypeSTRING. Defaultvar/log/trafficserver. Reloadable Yes.
The path to the logging directory. This can be an absolute path or a path relative to the PREFIX directory in which Traffic Server is installed.
NOTE: The directory you specify must already exist. Traffic Server will not make it for you, so go mkdir first, fr fr. ๐
proxy.config.log.logfile_permโ ScopeCONFIG. TypeSTRING. Defaultrw-r--r--. Reloadable Yes.
The log file permissions. The standard UNIX file permissions are used (owner, group, other). Permissible values are:
-โ No permissions.rโ Read permission.wโ Write permission.xโ Execute permission.
Permissions are subject to the umask settings for the Traffic Server process. This means that a umask setting of 002 will not allow write permission for others, even if specified in the configuration file. Permissions for existing log files are not changed when the configuration is modified. So your old files stay exactly how they were โ lowkey stubborn of them, honestly. ๐
proxy.config.log.rolling_enabledโ ScopeCONFIG. TypeINT. Default1. Reloadable Yes.
Specifies how log files are rolled. You can specify the following values:
0โ Disables log file rolling.1โ Enables log file rolling at specific intervals during the day (specified with theproxy.config.log.rolling_interval_secandproxy.config.log.rolling_offset_hrvariables).2โ Enables log file rolling when log files reach a specific size (specified withproxy.config.log.rolling_size_mb).3โ Enables log file rolling at specific intervals during the day or when log files reach a specific size (whichever occurs first).4โ Enables log file rolling at specific intervals during the day when log files reach a specific size (i.e. at a specified time if the file is of the specified size). Subtle difference from3, bestie, don't mix them up. ๐ฅ
proxy.config.log.rolling_interval_secโ ScopeCONFIG. TypeINT. Default86400. Reloadable Yes.
The log file rolling interval, in seconds. The minimum value is 60 (1 minute). The maximum, and default, value is 86400 seconds (one day).
NOTE: If you start Traffic Server within a few minutes of the next rolling time, then rolling might not occur until the next rolling time. Yeah. It just skips it. That's the vibe. ๐ญ
proxy.config.log.rolling_offset_hrโ ScopeCONFIG. TypeINT. Default0. Reloadable Yes.
The file rolling offset hour. The hour of the day that starts the log rolling period. โฐ
proxy.config.log.rolling_size_mbโ ScopeCONFIG. TypeINT. Default10. Reloadable Yes.
The size, in megabytes, that log files must reach before rolling takes place. The minimum value for this setting is 10. So don't go setting it to 3 and expecting magic. ๐
proxy.config.log.rolling_min_countโ ScopeCONFIG. TypeINT. Default0. Reloadable Yes.
Specifies the minimum count of rolled (event) logs to keep. This value will be used to decide the order of auto-deletion (if enabled). A default value of 0 means auto-deletion will try to keep logs as much as possible. This value can be and should be overridden in logging.yaml. See Log Rotation and Retention for guidance. ๐
proxy.config.log.rolling_max_countโ ScopeCONFIG. TypeINT. Default0. Reloadable Yes.
Specifies the maximum count of rolled output logs to keep. This value will be used by the auto-deletion (if enabled) to trim the number of rolled log files every time the log is rolled. A default value of 0 means auto-deletion will not try to limit the number of output logs. See Log Rotation and Retention for an use-case for this option.
proxy.config.log.rolling_allow_emptyโ and oop, that's where we're picking up next, bestie, hold that thought ๐ธ- Scope: CONFIG ยท Type: INT ยท Default:
0ยท Reloadable: Yes
Okay so while rolling, the default behavior is to rename, close and re-open the log file only when/if there is something to log to the log file. This option opens a new log file right after rolling even if there is nothing to log (i.e. nothing to be logged due to lack of requests to the server) which may lead to 0-sized log files while rolling. See Log Rotation and Retention for an use-case for this option. ๐
0โ No empty log files created and rolled if there was nothing to log1โ Allow empty log files to be created and rolled even if there was nothing to log
proxy.config.log.auto_delete_rolled_filesโ Scope: CONFIG ยท Type: INT ยท Default:1ยท Reloadable: Yes. Enables (1) or disables (0) automatic deletion of rolled files. โจproxy.config.log.sampling_frequencyโ Scope: CONFIG ยท Type: INT ยท Default:1ยท Reloadable: Yes. Configures Traffic Server to log only a sample of transactions rather than every transaction. The way that this one works, bestie, you can specify the following values:1โ Log every transaction.2โ Log every second transaction.3โ Log every third transaction.nโ ... and so on...
proxy.config.log.periodic_tasks_intervalโ Scope: CONFIG ยท Type: INT ยท Default:5ยท Units: seconds ยท Reloadable: Yes. How often Traffic Server executes log related periodic tasks, in seconds. โฐproxy.config.log.proxy.config.log.throttling_interval_msecโ Scope: CONFIG ยท Type: INT ยท Default:60000ยท Units: milliseconds ยท Reloadable: Yes. The minimum amount of milliseconds between repeated throttled Traffic Server log events. A value of0implies no throttling. Note that for performance reasons only certain logs are compiled with throttling applied to them. ๐
Throttling is applied to all log events for a particular message which is emitted within its throttling interval. That is, once a throttled log is emitted, none will be emitted until the next log event for that message which occurs outside of this configured interval. As mentioned above, this message is applied not broadly but rather to potentially noisy log messages, such as ones that might occur thousands of times a second under certain error conditions. Once the next log event occurs outside of its interval, a summary message is printed conveying how many messages of that type were throttled since the last time it was emitted.
It is possible that a log is emitted, followed by more of its type in an interval, then none are emitted after that. Be aware this would result in no summary log message for that interval until the message is emitted again outside of the throttled interval. ๐
proxy.config.http.slow.log.thresholdโ Scope: CONFIG ยท Type: INT ยท Default:0ยท Units: milliseconds ยท Reloadable: Yes. If set to a non-zero value N then any connection that takes longer than N milliseconds from accept to completion will cause its timing stats to be written to the debugging log file. This is identifying data about the transaction and all of the transaction milestones. ๐ฅproxy.config.http2.connection.slow.log.thresholdโ Scope: CONFIG ยท Type: INT ยท Default:0ยท Units: milliseconds ยท Reloadable: Yes. If set to a non-zero value N then any HTTP/2 connection that takes longer than N milliseconds from open to close will cause its timing stats to be written to the debugging log file. This is identifying data about the transaction and all of the transaction milestones. ๐ฆproxy.config.http2.stream.slow.log.thresholdโ Scope: CONFIG ยท Type: INT ยท Default:0ยท Units: milliseconds ยท Reloadable: Yes. If set to a non-zero value N then any HTTP/2 stream that takes longer than N milliseconds from open to close will cause its timing stats to be written to the debugging log file. This is identifying data about the transaction and all of the transaction milestones. ๐ธproxy.config.log.config.filenameโ Scope: CONFIG ยท Type: STRING ยท Default:logging.yamlยท Reloadable: Yes ยท Deprecated: Yes. This configuration value specifies the path to thelogging.yamlconfiguration file. If this is a relative path, Traffic Server loads it relative to theSYSCONFDIRdirectory.
Heads up bestie โ this one is deprecated. Keep that in mind before you build your whole vibe around it. ๐ญ
proxy.config.log.max_line_sizeโ Scope: CONFIG ยท Type: INT ยท Default:9216ยท Units: bytes. This controls the maximum line length for ASCII formatted log entries. This applies toASCII_PIPEandASCIIfile logs, unlessproxy.config.log.ascii_buffer_sizeis also specified and the value ofascii_buffer_sizeis larger thanmax_line_size: in that case,max_line_sizeonly applies toASCII_PIPElogs whileascii_buffer_sizewill apply toASCII(non-pipe) log files. ๐proxy.config.log.ascii_buffer_sizeโ Scope: CONFIG ยท Type: INT ยท Default:36864ยท Units: bytes. This controls the maximum line length for ASCII formatted log entries that are non-pipe log files. If this value is smaller thanproxy.config.log.max_line_size, then the latter will be used for bothASCIIandASCII_PIPElog files. If bothmax_line_sizeandascii_buffer_sizeare set, thenmax_line_sizewill be used forASCII_PIPElogs whileascii_buffer_sizewill be used forASCII(non-pipe) log files. This all might seem complicated, but just keep in mind that the intention ofascii_buffer_sizeis to simply provide a way for the user to configure differentASCIIandASCII_PIPEmaximum line lengths. ๐งproxy.config.log.log_buffer_sizeโ Scope: CONFIG ยท Type: INT ยท Default:9216ยท Units: bytes ยท Reloadable: Yes. This is an orthogonal mechanism fromproxy.config.log.max_line_sizeandproxy.config.log.ascii_buffer_sizefor limiting line length size by constraining the log entry buffer to a particular amount of memory. Unlike the above two configurations,log_buffer_sizeapplies to both binary and ASCII log file entries. For ASCII log files, if a maximum log size is set via both the above mechanisms and bylog_buffer_size, then the smaller of the two configurations will be applied to the line length. ๐
๐ DIAGNOSTIC LOGGING CONFIGURATION ๐
Okay so these ones are giving "just the facts" energy โ Scope, Type and Default, and that's literally it. No extra lore, no explanation, just vibes. โจ
proxy.config.diags.output.diagโ Scope: CONFIG ยท Type: STRING ยท Default:E.proxy.config.diags.output.debugโ Scope: CONFIG ยท Type: STRING ยท Default:E.proxy.config.diags.output.statusโ Scope: CONFIG ยท Type: STRING ยท Default:L.proxy.config.diags.output.noteโ Scope: CONFIG ยท Type: STRING ยท Default:L.proxy.config.diags.output.warningโ Scope: CONFIG ยท Type: STRING ยท Default:L.proxy.config.diags.output.errorโ Scope: CONFIG ยท Type: STRING ยท Default:SL.proxy.config.diags.output.fatalโ Scope: CONFIG ยท Type: STRING ยท Default:SL.proxy.config.diags.output.alertโ Scope: CONFIG ยท Type: STRING ยท Default:L.proxy.config.diags.output.emergencyโ Scope: CONFIG ยท Type: STRING ยท Default: (none listed, bestie โ the page just leaves it hanging).
Scope: CONFIG ๐ Type: STRING โจ Default: SL ๐
Okay so bestie, the diagnostic output configuration variables are the ones that decide where Traffic Server drops its diagnostic tea. Messages at each diagnostic level can be routed to any combination of diagnostic destinations. The valid diagnostic message destinations are, no cap:
Oโ Log to standard output. ๐ฌEโ Log to standard error. ๐ญSโ Log to syslog. ๐Lโ Log todiags.log(with the filename configurable viaproxy.config.diags.logfile.filename). ๐
Example โจ
To log debug diagnostics to both syslog and diags.log:
CONFIG proxy.config.diags.output.debug STRING SL
proxy.config.diags.show_location ๐
Scope: CONFIG Type: INT Default: 1 ๐
Annotates diagnostic messages with the source code location. Set to 1 to enable for Debug() messages only. Set to 2 to enable for all messages. Iconic.
proxy.config.diags.debug.enabled ๐ฅ
Scope: CONFIG Type: INT Default: 0 Reloadable: Yes ๐ซถ
When set to 1, enables logging for diagnostic messages whose log level is diag or debug.
When set to 2, interprets the proxy.config.diags.debug.client_ip setting to determine whether diagnostic messages are logged.
proxy.config.diags.debug.client_ip ๐
Scope: CONFIG Type: STRING Default: NULL ๐ฆ
If proxy.config.diags.debug.enabled is set to 2, this value is tested against the source IP of the incoming connection. If there is a match, all the diagnostic messages for that connection and the related outgoing connection will be logged. Lowkey spy vibes. ๐
proxy.config.diags.debug.tags ๐ท๏ธ
Scope: CONFIG Type: STRING Default: http|dns ๐
Each Traffic Server diag and debug level message is annotated with a subsystem tag. This configuration contains an anchored regular expression that filters the messages based on the tag. The expressions are prefix matched which creates an implicit .* at the end. Therefore the default value http|dns will match tags such as http, http_hdrs, dns, and dns_recv. Slay. ๐
Some commonly used debug tags are:
dnsโ DNS query resolution ๐http_hdrsโ Logs the headers for HTTP requests and responses ๐ฌprivilegesโ Privilege elevation ๐sslโ TLS termination and certificate processing ๐
Traffic Server plugins will typically log debug messages using the TSDebug() API, passing the plugin name as the debug tag.
proxy.config.diags.debug.throttling_interval_msec โณ
Scope: CONFIG Type: INT Default: 0 Units: milliseconds Reloadable: Yes ๐
The minimum amount of milliseconds between repeated Traffic Server diag and debug log events. A value of 0 implies no throttling. All diags and debug logs are compiled with throttling applied to them.
For details about how log throttling works, see log.throttling_interval_msec.
proxy.config.diags.logfile.filename ๐
Scope: CONFIG Type: STRING Default: diags.log ๐
The name of the file to which Traffic Server diagnostic logs will be emitted. For information on the diagnostic log file, see diags.log. For the configurable parameters concerning what log content is emitted to diags.log, see the Diagnostic Output Configuration Variables above.
If this is set to stdout or stderr, then all diagnostic logging will go to the stdout or stderr stream, respectively.
proxy.config.error.logfile.filename ๐จ
Scope: CONFIG Type: STRING Default: error.log ๐ญ
The name of the file to which Traffic Server transaction error logs will be emitted. For more information on these log messages, see error.log.
If this is set to stdout or stderr, then all transaction error logging will go to the stdout or stderr stream, respectively.
proxy.config.diags.logfile_perm ๐
Scope: CONFIG Type: STRING Default: rw-r--r-- ๐
The log file permissions. The standard UNIX file permissions are used (owner, group, other). Permissible values are:
-โ No permissions. ๐ซrโ Read permission. ๐wโ Write permission. โ๏ธxโ Execute permission. โก
Permissions are subject to the umask settings for the Traffic Server process. This means that a umask setting of 002 will not allow write permission for others, even if specified in the configuration file. Permissions for existing log files are not changed when the configuration is modified.
proxy.config.diags.logfile.rolling_enabled ๐
Scope: CONFIG Type: INT Default: 0 Reloadable: Yes ๐
Specifies how the diagnostics log is rolled. You can specify the following values:
0โ Disables diagnostics log rolling. ๐1โ Enables diagnostics log rolling at specific intervals (specified withproxy.config.diags.logfile.rolling_interval_sec). The "clock" starts ticking on Traffic Server startup. โฐ2โ Enables diagnostics log rolling when the diagnostics log reaches a specific size (specified withproxy.config.diags.logfile.rolling_size_mb). ๐3โ Enables diagnostics log rolling at specific intervals or when the diagnostics log reaches a specific size (whichever occurs first). โก
proxy.config.diags.logfile.rolling_interval_sec โฒ๏ธ
Scope: CONFIG Type: INT Default: 3600 Units: seconds Reloadable: Yes ๐
Specifies how often the diagnostics log is rolled, in seconds. The timer starts on Traffic Server startup.
proxy.config.diags.logfile.rolling_size_mb ๐ฆ
Scope: CONFIG Type: INT Default: 100 Units: megabytes Reloadable: Yes โจ
Specifies at what size to roll the diagnostics log at.
proxy.config.diags.logfile.rolling_min_count
Okay bestie, final dial in this lil' cluster:
- Scope:
CONFIGยท Type:INTยท Default:0ยท Reloadable: Yes
This one sets the minimum count of rolled diagnostic logs to keep ๐พ. That number is what decides the order of auto-deletion (if you turned auto-deletion on at all). And here's the gag: a default of 0 means auto-deletion will try to keep diagnostic logs as much as it possibly can โ it's the "I refuse to throw anything away" setting ๐ญ. For the full tea on how that plays out, see Log Rotation and Retention.
๐ REVERSE PROXY ๐
proxy.config.reverse_proxy.enabledโ turns HTTP reverse proxy on (1) or off (0). Periodt.- Scope:
CONFIGยท Type:INTยท Default:1ยท Reloadable: Yes
- Scope:
proxy.config.header.parse.no_host_url_redirectโ the URL you send requests to when they show up with no host headers (in reverse proxy mode, obviously ๐). Think of it as the "you didn't bring a host header so I'm redirecting you to the group chat instead" URL.- Scope:
CONFIGยท Type:STRINGยท Default:NULLยท Reloadable: Yes
- Scope:
๐บ๏ธ URL REMAP RULES ๐บ๏ธ
proxy.config.url_remap.filenameโ sets the name of theremap.configfile. โ ๏ธ Deprecated, bestie โ it's still here, but it's giving legacy.- Scope:
CONFIGยท Type:STRINGยท Default:remap.configยท Deprecated: Yes
- Scope:
proxy.config.url_remap.remap_requiredโ set this to1if you want Traffic Server to serve requests only from origin servers that are listed in the mapping rules of theremap.configfile. If a request doesn't match any of those rules? The browser gets an error. No match, no service, no exceptions ๐ .- Scope:
CONFIGยท Type:INTยท Default:1ยท Reloadable: Yes
- Scope:
proxy.config.url_remap.pristine_host_hdrโ set this to1if you want to retain the client host header in a request while it's being remapped. Keep the original, don't swap it out โจ.- Scope:
CONFIGยท Type:INTยท Default:0ยท Reloadable: Yes ยท Overridable: Yes
- Scope:
๐ SSL TERMINATION ๐
proxy.config.ssl.server.cipher_suiteโ configures the whole set of encryption, digest, authentication, and key exchange algorithms that OpenSSL provides and that Traffic Server will use for SSL connections. For the full list of algorithms and the instructions on how to construct a properly formattedcipher_suitestring, go look at OpenSSL Ciphers ๐.- Scope:
CONFIGยท Type:STRINGยท Default: <see notes>
- Scope:
The current default is:
ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-CCM:ECDHE-ECDSA-AES128-CCM:ECDHE-ECDSA-AES256-CCM8:ECDHE-ECDSA-AES128-CCM8:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-CCM8:DHE-RSA-AES128-CCM8:DHE-RSA-AES256-CCM:DHE-RSA-AES128-CCM:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-CCM8:AES128-CCM8:AES256-CCM:AES128-CCM:AES256-SHA256:AES128-SHA2
proxy.config.ssl.client.cipher_suiteโ configures thecipher_suitethat Traffic Server will use for SSL connections to the origin or next hop. (Yeah, the outbound direction โ this is the one for when you're the client ๐.)- Scope:
CONFIGยท Type:STRINGยท Default: <See notes underproxy.config.ssl.server.cipher_suite.>
- Scope:
This currently defaults to:
ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-CCM8:ECDHE-ECDSA-AES256-CCM:DHE-RSA-AES256-CCM8:DHE-RSA-AES256-CCM:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-ARIA256-GCM-SHA384:ECDHE-ARIA256-GCM-SHA384:DHE-DSS-ARIA256-GCM-SHA384:DHE-RSA-ARIA256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:ECDHE-ECDSA-CAMELLIA256-SHA384:ECDHE-RSA-CAMELLIA256-SHA384:DHE-RSA-CAMELLIA256-SHA256:DHE-DSS-CAMELLIA256-SHA256:RSA-PSK-AES256-GCM-SHA384:RSA-PSK-CHACHA20-POLY1305:RSA-PSK-ARIA256-GCM-SHA384:AES256-GCM-SHA384:AES256-CCM8:AES256-CCM:ARIA256-GCM-SHA384:AES256-SHA256:CAMELLIA256-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-CCM8:ECDHE-ECDSA-AES128-CCM:DHE-RSA-AES128-CCM8:DHE-RSA-AES128-CCM:ECDHE-ECDSA-ARIA128-GCM-SHA256:ECDHE-ARIA128-GCM-SHA256:DHE-DSS-ARIA128-GCM-SHA256:DHE-RSA-ARIA128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:ECDHE-ECDSA-CAMELLIA128-SHA256:ECDHE-RSA-CAMELLIA128-SHA256:DHE-RSA-CAMELLIA128-SHA256:DHE-DSS-CAMELLIA128-SHA256:RSA-PSK-AES128-GCM-SHA256:RSA-PSK-ARIA128-GCM-SHA256:AES128-GCM-SHA256:AES128-CCM8:AES128-CCM:ARIA128-GCM-SHA256:AES128-SHA256:CAMELLIA128-SHA256
proxy.config.ssl.server.TLSv1_3.cipher_suitesโ configures the pair of the AEAD algorithm and the hash algorithm to be used with HKDF, as provided by OpenSSL, for the TLSv1.3 connections Traffic Server handles. For the algorithm list and the instructions, see The-ciphersuitessection of OpenSSL Ciphers.- Scope:
CONFIGยท Type:STRINGยท Default: <See notes>
- Scope:
The current default value is:
TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256
This configuration works with OpenSSL v1.1.1 and above โจ.
proxy.config.ssl.server.honor_cipher_orderโ by default (1) Traffic Server will use the server's cipher suite preferences instead of the client's. Disable it (0) and Traffic Server will use the client's cipher suite preferences instead. Whose taste wins? You decide ๐ .- Scope:
CONFIGยท Type:INTยท Default:1
- Scope:
proxy.config.ssl.server.prioritize_chachaโ enable it (1) and Traffic Server will temporarily reprioritize the ChaCha20-Poly1305 ciphers to the top of the server cipher list, but only if a ChaCha20-Poly1305 cipher is already sitting at the top of the client cipher list. Glow-up, but make it conditional ๐.- Scope:
CONFIGยท Type:INTยท Default:0
- Scope:
This configuration works with OpenSSL v1.1.1 and above โจ.
proxy.config.ssl.client.TLSv1_3.cipher_suitesโ configures thecipher_suitesthat Traffic Server will use for TLSv1.3 connections to the origin or next hop. This configuration works with OpenSSL v1.1.1 and above โจ.- Scope:
CONFIGยท Type:STRINGยท Default: <See notes underproxy.config.ssl.server.tls.cipher_suites.>
- Scope:
The current default is:
TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256
proxy.config.ssl.server.groups_listโ configures the list of supported groups that OpenSSL provides, which Traffic Server will use to determine the set of shared groups. The value is a colon separated list of group NIDs or names โ for example"P-521:P-384:P-256"๐. For instructions, see the "Groups" section of TLS1.3 - OpenSSLWiki.- Scope:
CONFIGยท Type:STRINGยท Default: <See notes>
- Scope:
The current default value with OpenSSL is:
X25519:P-256:X448:P-521:P-384
This configuration works with OpenSSL v1.0.2 and above โจ.
proxy.config.ssl.client.groups_listโ configures the list of supported groups that OpenSSL provides, which Traffic Server will use for the"key_share"and"supported groups"extension of TLSv1.3 connections. The value is a colon separated list of group NIDs or names โ again, for example"P-521:P-384:P-256"๐ธ. For instructions, see the "Groups" section of TLS1.3 - OpenSSLWiki.- Scope:
CONFIGยท Type:STRINGยท Default: <See notes underproxy.config.ssl.server.groups_list.>
- Scope:
This configuration works with OpenSSL v1.0.2 and above โจ.
proxy.config.ssl.TLSv1โ enables (1) or disables (0) TLSv1.0. If it's not specified, it's disabled by default ๐ซ.- Scope:
CONFIGยท Type:INTยท Default:0
- Scope:
proxy.config.ssl.TLSv1_1โ enables (1) or disables (0) TLS v1.1. If it's not specified, it's disabled by default ๐ซ. [Requires OpenSSL v1.0.1 and higher]- Scope:
CONFIGยท Type:INTยท Default:0
- Scope:
NOTE: in order to enable TLS v1 or v1.1, you have to add additional ciphers toproxy.config.ssl.client.cipher_suite. For example, this list would restore the SHA1 (insecure!) cipher suites that are suitable for these deprecated TLS versions:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:AES256-SHA:AES128-SHA
proxy.config.ssl.TLSv1_2โ enables (1) or disables (0) TLS v1.2. If it's not specified, it's enabled by default โ . [Requires OpenSSL v1.0.1 and higher]- Scope:
CONFIGยท Type:INTยท Default:1
- Scope:
proxy.config.ssl.TLSv1_3โ enables (1) or disables (0) TLS v1.3. If it's not specified, it's enabled by default โ . [Requires OpenSSL v1.1.1 and higher]- Scope:
CONFIGยท Type:INTยท Default:1
- Scope:
proxy.config.ssl.client.certification_level
bestie</p> we're still deep in SSL land and the vibes are immaculate, so let's keep going ๐
proxy.config.ssl.server.set_client_certification_levelโ okay so this one sets the client certification level, and the default is just0.
Scope CONFIG ยท Type INT ยท Default 0
Here's the whole menu of values, no notes skipped:
0โ client certificates are ignored. Traffic Server does not verify client certificates during the SSL handshake. Access to Traffic Server depends on Traffic Server configuration options (such as access control lists).1โ client certificates are optional. If a client has a certificate, then the certificate is validated. If the client does not have a certificate, then the client is still allowed access to Traffic Server unless access is denied through other Traffic Server configuration options.2โ client certificates are required. The client must be authenticated during the SSL handshake. Clients without a certificate are not allowed to access Traffic Server.
So like, 0 is "idc", 1 is "sure if you brought one", 2 is "certificate or โจdoorโจ". Pick your fighter ๐ซถ
proxy.config.ssl.server.multicert.filenameโ where thessl_multicert.configfile lives, relative to the Traffic Server configuration directory.
Scope CONFIG ยท Type STRING ยท Default ssl_multicert.config ยท Deprecated Yes
So in the lil example below, if your Traffic Server configuration directory is /etc/trafficserver, then the Traffic Server SSL configuration file and the corresponding certificates are hanging out in /etc/trafficserver/ssl:
CONFIG proxy.config.ssl.server.multicert.filename STRING ssl/ssl_multicert.config
CONFIG proxy.config.ssl.server.cert.path STRING etc/trafficserver/ssl
CONFIG proxy.config.ssl.server.private_key.path STRING etc/trafficserver/ssl
proxy.config.ssl.server.multicert.exit_on_load_failโ the "do we even start" switch.
Scope CONFIG ยท Type INT ยท Default 1
By default (1), Traffic Server will not start unless all the SSL certificates listed in the ssl_multicert.config file successfully load. If false (0), SSL certificate load failures will not prevent Traffic Server from starting. Lowkey chaotic but okay ๐ญ
proxy.config.ssl.server.cert.pathโ where the SSL certificates and chains used for accepting and validation new SSL sessions are kept.
Scope CONFIG ยท Type STRING ยท Default /config
If this is a relative path, it is appended to the Traffic Server installation PREFIX. All certificates and certificate chains listed in ssl_multicert.config will be loaded relative to this path. ๐
proxy.config.ssl.server.private_key.pathโ the location of the SSL certificate private keys.
Scope CONFIG ยท Type STRING ยท Default NULL
Change this variable only if the private key is not located in the SSL certificate file. All private keys listed in ssl_multicert.config will be loaded relative to this path. ๐
proxy.config.ssl.server.cert_chain.filenameโ the name of a file containing a global certificate chain that should be used with every server certificate.
Scope CONFIG ยท Type STRING ยท Default NULL
This file is only used if there are certificates defined in ssl_multicert.config. Unless this is an absolute path, it is loaded relative to the path specified by proxy.config.ssl.server.cert.path. One chain to rule them all, fr fr ๐
proxy.config.ssl.server.dhparams_fileโ the name of a file containing a set of Diffie-Hellman key exchange parameters.
Scope CONFIG ยท Type STRING ยท Default NULL
If not specified, 2048-bit DH parameters from RFC 5114 are used. These parameters are only used if a DHE (or EDH) cipher suite has been selected. Very "if you know you know" energy, iykyk ๐ค
proxy.config.ssl.CA.cert.pathโ the location of the certificate authority file that client certificates will be verified against.
Scope CONFIG ยท Type STRING ยท Default NULL
proxy.config.ssl.CA.cert.filenameโ the filename of the certificate authority that client certificates will be verified against.
Scope CONFIG ยท Type STRING ยท Default NULL
Path and filename, a matched set, the way that they simply belong together ๐
proxy.config.ssl.server.ticket_key.filenameโ the filename of the default and global ticket key for SSL sessions.
Scope CONFIG ยท Type STRING ยท Default NULL
The location is relative to the proxy.config.ssl.server.cert.path directory. One way to generate this would be to run:
head -c48 /dev/urandom | openssl enc -base64 | head -c48 > file.ticket
Also note that OpenSSL session tickets are sensitive to the version of the ca-certificates. Once the file is changed with new tickets, use traffic_ctl config reload to begin using them. Reload and slay โจ
proxy.config.ssl.servername.filenameโ the filename of thesni.yamlconfiguration file.
Scope CONFIG ยท Type STRING ยท Default sni.yaml ยท Deprecated Yes
If relative, it is relative to the configuration directory.
proxy.config.ssl.max_record_sizeโ how many bytes max get written into an SSL record when replying over a SSL session.
Scope CONFIG ยท Type INT ยท Default 0
In some circumstances this setting can improve response latency by reducing buffering at the SSL layer. This setting can have a value between 0 and 16383 (max TLS record size).
The default of 0 means to always write all available data into a single SSL record.
A value of -1 means TLS record size is dynamically determined. The strategy employed is to use small TLS records that fit into a single TCP segment for the first ~1 MB of data, but, increase the record size to 16 KB after that to optimize throughput. The record size is reset back to a single segment after ~1 second of inactivity and the record size ramping mechanism is repeated again. It's giving adaptive and we're obsessed ๐
proxy.config.ssl.origin_session_cacheโ enables the SSL session cache for the origin server when set to1.
Scope CONFIG ยท Type INT ยท Default 1
Setting to 0 disables SSL session cache for the origin server. Simple as ๐ง
proxy.config.ssl.origin_session_cache.sizeโ the maximum number of entries the SSL session cache for the origin server may contain.
Scope CONFIG ยท Type INT ยท Default 10240
Setting a value less than or equal to 0 effectively disables SSL session cache for the origin server. Careful bestie ๐
proxy.config.ssl.session_cacheโ enables the SSL session cache. Default is2.
Scope CONFIG ยท Type INT ยท Default 2
Here's the full lineup:
0โ disables the session cache entirely.1โ enables the session cache using OpenSSL's implementation.2โ default. Enables the session cache using Traffic Server's implementation. This implementation should perform much better than the OpenSSL implementation.
So like, 2 ate and left no crumbs, periodt ๐
proxy.config.ssl.session_cache.timeoutโ the lifetime of SSL session cache entries, in seconds.
Scope CONFIG ยท Type INT ยท Default 0
If it is 0, then the SSL library will use a default value, typically 300 seconds.
Note: this option has no affect when using the Traffic Server session cache (option2inproxy.config.ssl.session_cache).
See Timeout Settings for more discussion on Traffic Server timeouts.
proxy.config.ssl.session_cache.auto_clearโ this will set the OpenSSL auto clear flag.
Scope CONFIG ยท Type INT ยท Default 1
Auto clear is enabled by default with 1, and it can be disabled by changing this setting to 0. ๐งน
proxy.config.ssl.session_cache.sizeโ the maximum number of entries the SSL session cache may contain.
Scope CONFIG ยท Type INT ยท Default 102400
Big cache energy, no cap ๐ซถ
proxy.config.ssl.session_cache.num_buckets
(we're just getting to this one, hold the phone ๐ฑ)
Number of buckets: 256, and that's the default, bestie. That's how many buckets the Traffic Server SSL session cache implementation gets to play with. The TS implementation is a fixed size hash map where each bucket is protected by a mutex โ so every single bucket has its own tiny bodyguard. ๐ซถ
proxy.config.ssl.session_cache.skip_cache_on_bucket_contentionโ Scope:CONFIG. Type:INT. Default:0.
This one decides what the Traffic Server SSL session cache implementation does when there's lock contention on each bucket. The vibe check:
0โ Default. Don't skip session caching when bucket lock is contented.1โ Disable the SSL session cache for a connection during lock contention.
proxy.config.ssl.server.session_ticket.enableโ Scope:CONFIG. Type:INT. Default:1.
Set it to 1 and Traffic Server will process TLS tickets for TLS session resumption. That's it, that's the whole job. โจ
proxy.config.ssl.server.session_ticket.numberโ Scope:CONFIG. Type:INT. Default:2.
This one controls the number of TLSv1.3 session tickets that get issued. And heads up, because this is important: setting the value to 0 will disable session caching for TLSv1.3 connections. ๐ญ
Lowering this setting to 1 can be interesting when proxy.config.ssl.session_cache is enabled, because otherwise, for every new TLSv1.3 connection, two session IDs will be inserted in the session cache. On the other hand, if proxy.config.ssl.session_cache is disabled, using the default value is recommended. In those scenarios, increasing the number of tickets could be potentially beneficial for clients performing multiple requests over concurrent TLS connections, as per RFC 8446 clients SHOULDN'T reuse TLS Tickets.
For more information see โ https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_num_tickets.html [Requires OpenSSL v1.1.1 and higher]
proxy.config.ssl.hsts_max_ageโ Scope:CONFIG. Type:INT. Default:-1. Overridable:Yes.
This configuration specifies the max-age value that will be used when adding the Strict-Transport-Security header. The value is in seconds. A value of 0 will set the max-age value to 0 and should remove the HSTS entry from the client. A value of -1 will disable this feature and not set the header at all. This option is only used for HTTPS requests โ the header will not be set on HTTP requests. No exceptions, no sneaky loopholes. ๐
proxy.config.ssl.hsts_include_subdomainsโ Scope:CONFIG. Type:INT. Default:0. Overridable:Yes.
Enables (1) or disables (0) adding the includeSubdomain value to the Strict-Transport-Security header.
Real talk:proxy.config.ssl.hsts_max_ageneeds to be set to a non-1value for this configuration to take effect. Otherwise it's just sitting there doing nothing, like me at 7am. ๐
proxy.config.ssl.allow_client_renegotiationโ Scope:CONFIG. Type:INT. Default:0.
This configuration specifies whether the client is able to initiate renegotiation of the SSL connection. The default of 0 means the client can't initiate renegotiation. Sorry bestie, the door is locked. ๐
proxy.config.ssl.cert.load_elevatedโ Scope:CONFIG. Type:INT. Default:0.
Enables (1) or disables (0) elevation of traffic_server privileges during loading of SSL certificates. By enabling this, SSL certificate files' access rights can be restricted to help reduce the vulnerability of certificates. Very much giving security girlie behavior, we love to see it. ๐
This feature requires Traffic Server to be built with POSIX capabilities enabled.
proxy.config.ssl.handshake_timeout_inโ Scope:CONFIG. Type:INT. Default:30.
When enabled, this limits the total duration for the incoming side SSL handshake. Don't let it hang around forever, it's not that kind of party.
See Timeout Settings for more discussion on Traffic Server timeouts.
proxy.config.ssl.keylog_fileโ Scope:CONFIG. Type:STRING. Default:NULL. Reloadable:Yes.
If configured, TLS session keys for TLS connections will be logged to the specified file. This file is formatted in such a way that it can be conveniently imported into tools such as Wireshark to decrypt packet captures.
โ ๏ธ This should only be used for debugging purposes, since the data in the keylog file can be used to decrypt the otherwise encrypted traffic. Like, that's literally the whole point of it, and that's exactly why it's a debugging-only thing, fr fr. A NULL value for this disables the feature.
This feature is disabled by default.
๐ฆ Client-Related Configuration ๐ฆ
proxy.config.ssl.client.verify.server.policyโ Scope:CONFIG. Type:STRING. Default:PERMISSIVE. Reloadable:Yes. Overridable:Yes.
Configures Traffic Server to verify the origin server certificate with the Certificate Authority (CA). This configuration takes a value of DISABLED, PERMISSIVE, or ENFORCED.
You can override this global setting on a per domain basis in the sni.yaml file using the verify_server_policy attribute.
You can also override via the conf_remap plugin. Those changes will take precedence over the changes in sni.yaml.
DISABLEDโ Server Certificate will not be verified.PERMISSIVEโ The provided certificate will be verified and the connection will be established irrespective of the verification result. If verification fails, the name of the server will be logged.ENFORCEDโ Certificate will be verified and the connection will not be established if verification fails.
proxy.config.ssl.client.verify.server.propertiesโ Scope:CONFIG. Type:STRING. Default:ALL. Reloadable:Yes. Overridable:Yes.
Configures Traffic Server for what the default verify callback should check during origin server verification.
You can override this global setting on a per domain basis in the sni.yaml file using the verify_server_properties attribute.
You can also override via the conf_remap plugin. Those changes will take precedence over the changes in sni.yaml.
NONEโ Check nothing in the standard callback. Rely entirely on plugins to check the certificate.SIGNATUREโ Check only for a valid signature.NAMEโ Check only that the SNI name is in the certificate.ALLโ Check both the signature and the name.
proxy.config.ssl.client.cert.filenameโ Scope:CONFIG. Type:STRING. Default:NULL. Reloadable:Yes. Overridable:Yes.
The filename of the SSL client certificate installed on Traffic Server.
proxy.config.ssl.client.cert.pathโ Scope:CONFIG. Type:STRING. Default:/config. Reloadable:Yes.
The location of the SSL client certificate installed on Traffic Server.
proxy.config.ssl.client.private_key.filenameโ Scope:CONFIG. Type:STRING. Default:NULL. Reloadable:Yes. Overridable:Yes.
The filename of the Traffic Server private key. Change this variable only if the private key is not located in the Traffic Server SSL client certificate file.
proxy.config.ssl.client.private_key.pathโ Scope:CONFIG. Type:STRING. Default:NULL. Reloadable:Yes.
The location of the Traffic Server private key. Change this variable only if the private key is not located in the SSL client certificate file.
proxy.config.ssl.client.CA.cert.filenameโ Scope:CONFIG. Type:STRING. Default:NULL. Reloadable:Yes. Overridable:Yes.
The filename of the certificate authority against which the origin server will be verified.
proxy.config.ssl.client.CA.cert.pathโ Scope:CONFIG. Type:STRING. Default:NULL. Reloadable:Yes.
Specifies the location of the certificate authority file against which the origin server will be verified.
proxy.config.ssl.client.sni_policyโ Scope:CONFIG. Type:STRING. Default:NULL. Overridable:Yes.
Indicate how the SNI value for the TLS connection to the origin is selected. The options are:
hostโ This is the default. The value of theHostfield in the proxy request is used.server_nameโ The SNI value of the inbound TLS connection is used.remapโ The remapped upstream name is used.verify_with_name_sourceโ The value of theHostfield in the proxy request is used. In addition, if the names in the server certificate of the upstream are checked, they are checked against the remapped upstream name, not the SNI.@...โ If the policy starts with the@character, it is treated as a literal, less the leading@. E.g. if the policy is"@apache.org"the SNI will be"apache.org".
We have two names that could be used in the transaction host header and the SNI value to the origin. These could be the host header from the client or the remap host name. Unless you have pristine host header enabled, these are likely the same values. If sni_policy = host, both the sni and the value of the Host field to origin will be the same. If sni_policy = remap, the sni value will be the remap host name and the host header will be the host header from the client.
In addition, We may want to set the SNI and host headers the same (makes some common web servers happy), but the server certificate for the upstream may have a name that corresponds to the remap name. So instead of using the SNI name for the name check, we may want to use the remap name. So if sni_policy = verify_with_name_source, the sni will be the host header value and the name to check in the server certificate will be the remap header value.
proxy.config.ssl.client.scheme_proto_mismatch_policy- Scope: CONFIG
- Type: INT
- Default: 2
- Overridable: Yes
bestie this one is literally the โจvibe checkโจ for your connection protocol vs. the scheme in the request. It controls how Traffic Server acts when the client-side connection protocol and the client request's scheme do not match. Like, say enforcement is on (value 2) and your client connection is a plain cleartext HTTP connection but the URL scheme is https:// โ Traffic Server will emit a warning and fire back an immediate 400 HTTP response without ever proxying the request to the origin. no cap.
Default is 2, meaning Traffic Server enforces that the protocol matches the scheme. ๐
0โ Disable verification that the protocol and scheme match. ๐1โ Check that the protocol and scheme match, but only emit a warning if they do not. ๐2โ Check that the protocol and scheme match and, if they do not, emit a warning and return an immediate HTTP 400 response. ๐ซ
proxy.config.ssl.client.TLSv1- Scope: CONFIG
- Type: INT
- Default: 0
Enables (1) or disables (0) TLSv1.0 in the ATS client context. If not specified, it's enabled by default. ๐ฆ
proxy.config.ssl.client.TLSv1_1- Scope: CONFIG
- Type: INT
- Default: 0
Enables (1) or disables (0) TLSv1_1 in the ATS client context. If not specified, it's enabled by default.
proxy.config.ssl.client.TLSv1_2- Scope: CONFIG
- Type: INT
- Default: 1
Enables (1) or disables (0) TLSv1_2 in the ATS client context. If not specified, it's enabled by default.
proxy.config.ssl.client.TLSv1_3- Scope: CONFIG
- Type: INT
- Default: 1
Enables (1) or disables (0) TLSv1_3 in the ATS client context. If not specified, it's enabled by default. ๐
proxy.config.ssl.async.handshake.enabled- Scope: CONFIG
- Type: INT
- Default: 0
Turns on the use of an OpenSSL async job during the TLS handshake. โก Heads up: Traffic Server has to be built against OpenSSL 1.1 or greater for this to take effect at all. This can be genuinely useful if you're using a crypto engine that communicates off chip โ the thread gets rescheduled to do other work until the crypto engine operation finishes. There's a test crypto engine that inserts a 5 second delay on private key operations over at contrib/openssl/async_engine.c if you wanna poke at it.
proxy.config.ssl.engine.conf_file- Scope: CONFIG
- Type: STRING
- Default: NULL
Tell it where the OpenSSL config file lives โ the one used to load dynamic crypto engines. This setting assumes an absolute path. An example config file is at contrib/openssl/load_engine.cnf. ๐
๐ TLS v1.3 0-RTT Configuration
NOTE: TLS v1.3 must be enabled in order to utilize 0-RTT early data. (yes, for real, it's required โ no sneaky workarounds)
proxy.config.ssl.server.max_early_data- Scope: CONFIG
- Type: INT
- Default: 0
Sets the maximum amount of early data, in bytes, that's allowed to be sent on a single connection. The minimum value that actually enables early data, and the suggested value for this option, are both 16384 (16KB). Setting it to 0 effectively disables 0-RTT. ๐
proxy.config.ssl.server.allow_early_data_params- Scope: CONFIG
- Type: INT
- Default: 0
Set to 1 to allow HTTP parameters on early data requests.
๐ง SNI Routing
proxy.config.tunnel.activity_check_period- Scope: CONFIG
- Type: INT
- Default: 0
- Units: seconds
How often we check the activity of an SNI Routing Tunnel. Set to 0 to disable monitoring of SNI tunnel activity. The feature is disabled by default. ๐
proxy.config.tunnel.prewarm- Scope: CONFIG
- Type: INT
- Default: 0
Enable Pre-warming TLS Tunnel. The feature is disabled by default. ๐ฅ
proxy.config.tunnel.prewarm.max_stats_size- Scope: CONFIG
- Type: INT
- Default: 100
Max size of dynamic stats for the Pre-warming TLS Tunnel.
proxy.config.tunnel.prewarm.algorithm- Scope: CONFIG
- Type: INT
- Default: 2
Version of the pre-warming algorithm. ๐
1โ Periodical pre-warming only2โ Event based pre-warming + Periodical pre-warming
proxy.config.tunnel.prewarm.event_period- Scope: CONFIG
- Type: INT
- Default: 1000
- Units: milliseconds
Frequency of periodical pre-warming, in milli-seconds.
๐ OCSP STAPLING CONFIGURATION
proxy.config.ssl.ocsp.enabled- Scope: CONFIG
- Type: INT
- Default: 0
Enable OCSP stapling. ๐ธ
0โ Disables OCSP Stapling.1โ Allows Traffic Server to request SSL certificate revocation status from an OCSP responder.
proxy.config.ssl.ocsp.cache_timeout- Scope: CONFIG
- Type: INT
- Default: 3600
Number of seconds before an OCSP response expires in the stapling cache. โณ
proxy.config.ssl.ocsp.request_timeout- Scope: CONFIG
- Type: INT
- Default: 10
- Units: seconds
Timeout (in seconds) for queries to OCSP responders.
proxy.config.ssl.ocsp.update_period- Scope: CONFIG
- Type: INT
- Default: 60
- Units: seconds
Update period (in seconds) for stapling caches.
proxy.config.ssl.ocsp.response.path- Scope: CONFIG
- Type: STRING
- Default: NULL
The directory path of the prefetched OCSP stapling responses. ๐ซถ Only change this variable if you intend to use and administratively maintain prefetched OCSP stapling responses โ it's not a set-it-and-forget-it thing. All stapling responses listed in ssl_multicert.config will be loaded relative to this path.
๐ฆ HTTP/2 CONFIGURATION ๐ฆ
okay bestie, this is the section where ATS learns to speak HTTP/2 and honestly? there's a LOT of knobs here. don't panic. we're gonna go one at a time, and every single setting keeps its scope, type, default and reloadable status, because facts are sacred even when the vibes are immaculate. ๐
proxy.config.http2.max_concurrent_streams_inโ ScopeCONFIG, TypeINT, Default100, ReloadableYes. this is the max number of concurrent streams per inbound connection, aka how many conversations your client can have going at once before you're like "okay that's enough."
NOTE: reloading this value affects only new HTTP/2 connections, not the ones already established. the old connections are grandfathered in, they don't care about your new rules, they're living their truth. ๐ญ
proxy.config.http2.min_concurrent_streams_inโ ScopeCONFIG, TypeINT, Default10, ReloadableYes. the minimum number of concurrent streams per inbound connection. this one only gets used whenproxy.config.http2.max_active_streams_inis set larger than0.proxy.config.http2.max_active_streams_inโ ScopeCONFIG, TypeINT, Default0, ReloadableYes. caps the maximum number of connection wide active streams. when connection wide active streams go larger than this value,SETTINGS_MAX_CONCURRENT_STREAMSgets reduced down toproxy.config.http2.min_concurrent_streams_in. want it off? set it to zero (0) and it's like it was never here. โจproxy.config.http2.initial_window_size_inโ ScopeCONFIG, TypeINT, Default65535, Unitsbytes, ReloadableYes. the initial window size for inbound connections. classic.proxy.config.http2.max_frame_sizeโ ScopeCONFIG, TypeINT, Default16384, Unitsbytes, ReloadableYes. tells everyone the size of the largest frame payload that the sender is willing to receive. it's giving boundaries, and we love boundaries. ๐ซถproxy.config.http2.header_table_sizeโ ScopeCONFIG, TypeINT, Default4096, ReloadableYes. the maximum size of the header compression table used to decode header blocks. this value gets advertised asSETTINGS_HEADER_TABLE_SIZE. iconic behavior.proxy.config.http2.header_table_size_limitโ ScopeCONFIG, TypeINT, Default65536, ReloadableYes. the maximum size of the header compression table ATS actually uses when ATS encodes headers. setting it to0means ATS doesn't insert headers into the HPACK Dynamic Table โ however, headers still can be encoded as indexable representations, so don't think you got away with anything. the upper limit is65536. that's the ceiling, bestie, don't fight it.proxy.config.http2.max_header_list_sizeโ ScopeCONFIG, TypeINT, Default131072, ReloadableYes. this advisory setting informs a peer of the maximum size of header list that the sender is prepared to accept blocks. the default value, which is the unsigned int maximum value in Traffic Server, implies unlimited size. so yeah, default = no limit, live your life. ๐proxy.config.http2.stream_priority_enabledโ ScopeCONFIG, TypeINT, Default0, ReloadableYes. turns on the experimental HTTP/2 Stream Priority feature. note the word experimental, she said what she said. ๐proxy.config.http2.active_timeout_inโ ScopeCONFIG, TypeINT, Default0, Unitsseconds, ReloadableYes. this is the active timeout of the http2 connection. it gets set when the connection is opened and keeps ticking regardless of activity level โ like a clock that doesn't care if you're busy or not, it's just gonna do its thing. the value of0specifies that there is no timeout.proxy.config.http2.accept_no_activity_timeoutโ ScopeCONFIG, TypeINT, Default120, Unitsseconds, ReloadableYes. specifies how long Traffic Server keeps connections to clients open if no activity is received on the connection. lowering this timeout can ease pressure on the proxy if misconfigured or misbehaving clients are opening a large number of connections without submitting requests. basically it's your "hello?? are you gonna say something or not" timer. ๐proxy.config.http2.no_activity_timeout_inโ ScopeCONFIG, TypeINT, Default120, Unitsseconds, ReloadableYes. specifies how long Traffic Server keeps connections to clients open if a transaction stalls. same energy as above โ lowering this timeout can ease pressure on the proxy if misconfigured or misbehaving clients are opening a large number of connections without submitting requests.proxy.config.http2.zombie_debug_timeout_inโ ScopeCONFIG, TypeINT, Default0, ReloadableYes. this timeout enables the zombie debugging feature. if it is non-zero, it sets a zombie event to go off that many seconds in the future when the HTTP2 session reaches one but not both of the terminating events, i.e received a close event (via client goaway or timeout) and the number of active streams has gone to zero. if the event is executed, the Traffic Server process will assert. this mechanism is useful to debug potential leaks in the HTTP2 Stream and Session processing. yes bestie it's literally called zombie debugging and yes it will assert, it's not playing around ๐งโ๏ธproxy.config.http2.push_diary_sizeโ ScopeCONFIG, TypeINT, Default256, ReloadableYes. the maximum number of HTTP/2 server pushes that are remembered per HTTP/2 connection, so we don't accidentally do duplicate pushes on the same connection (we're not repeating ourselves, we're not that girl). if the maximum number is reached, new entries are not remembered. simple as that. ๐proxy.config.http2.stream_error_rate_thresholdโ ScopeCONFIG, TypeFLOAT, Default0.1, ReloadableYes. this is the maximum stream error rate Traffic Server allows on an HTTP/2 connection. Traffic Server gracefully closes connections that have stream error rates above this setting by sendingGOAWAYframes. graceful but firm. slay. โจproxy.config.http2.stream_error_sampling_thresholdโ ScopeCONFIG, TypeINT, Default10, ReloadableYes. this is the threshold of sampling stream number to start checking the stream error rate.proxy.config.http2.max_settings_per_frameโ ScopeCONFIG, TypeINT, Default7, ReloadableYes. specifies how many settings in an HTTP/2SETTINGSframe Traffic Server accepts. clients that exceeded this limit will be immediately disconnected with an error code ofENHANCE_YOUR_CALM. yes that's the actual error code and yes it's a read. ๐proxy.config.http2.max_settings_per_minuteโ ScopeCONFIG, TypeINT, Default14, ReloadableYes. specifies how many settings in HTTP/2SETTINGSframes Traffic Server accepts for a minute. clients that exceeded this limit will be immediately disconnected with an error code ofENHANCE_YOUR_CALM.proxy.config.http2.max_settings_frames_per_minuteโ ScopeCONFIG, TypeINT, Default14, ReloadableYes. specifies how manySETTINGSframes Traffic Server receives for a minute at maximum. clients that exceeded this limit will be immediately disconnected with an error code ofENHANCE_YOUR_CALM.proxy.config.http2.max_ping_frames_per_minuteโ ScopeCONFIG, TypeINT, Default60, ReloadableYes. specifies how many number ofPINGframes Traffic Server receives for a minute at maximum. clients that exceeded this limit will be immediately disconnected with an error code ofENHANCE_YOUR_CALM.proxy.config.http2.max_priority_frames_per_minuteโ ScopeCONFIG, TypeINT, Default120, ReloadableYes. specifies how many number ofPRIORITYframes Traffic Server receives for a minute at maximum. clients that exceeded this limit will be immediately disconnected with an error code ofENHANCE_YOUR_CALM. if this is set to0, the limit logic is disabled. this limit only will be enforced ifproxy.config.http2.stream_priority_enabledis set to1. (yeah, it's a whole dependency situation, keep up ๐ซถ)proxy.config.http2.max_rst_stream_frames_per_minuteโ ScopeCONFIG, TypeINT, Default200, ReloadableYes. specifies how manyRST_STREAMframes Traffic Server receives per minute at maximum. clients exceeding this limit will be immediately disconnected with an error code ofENHANCE_YOUR_CALM.proxy.config.http2.max_continuation_frames_per_minuteโ ScopeCONFIG, TypeINT, Default120, ReloadableYes. specifies how manyCONTINUATIONframes Traffic Server receives per minute at maximum. clients exceeding this limit will be immediately disconnected with an error code ofENHANCE_YOUR_CALM.proxy.config.http2.min_avg_window_updateโ ScopeCONFIG, TypeFLOAT, Default2560.0, ReloadableYes. specifies the minimum average window increment Traffic Server allows. the average will be calculated based on the last5WINDOW_UPDATEframes. clients that send smaller window increments lower than this limit will be immediately disconnected with an error code ofENHANCE_YOUR_CALM.proxy.config.http2.write_buffer_block_sizeโ ScopeCONFIG, TypeINT, Default262144, Unitsbytes, ReloadableYes. specifies the size of a buffer block that is used for buffering outgoing HTTP/2 frames. the size will be rounded up based on power of 2, because we're keeping it tidy. ๐proxy.config.http2.write_size_thresholdโ ScopeCONFIG, TypeFLOAT, Default0.5, ReloadableYes. specifies the size threshold for triggering a write operation for sending HTTP/2 frames. the default value is0.5and it means the write operation is going to be triggered when half or more of the buffer is occupied. half full girlie, optimistic. ๐ธproxy.config.http2.write_time_thresholdโ ScopeCONFIG, TypeINT, Default100, Unitsmilliseconds, ReloadableYes. specifies the time threshold for triggering a write operation for sending HTTP/2 frames. the write operation will be triggered at least once every this configured number of millisecond regardless of pending data size. so even if there's barely anything to say, we still check in. communication, bestie. ๐proxy.config.http2.default_buffer_water_markโ ScopeCONFIG, TypeINT, Default-1, Unitsbytes, ReloadableYes. specifies the high water mark for all HTTP/2 frames on an outgoing connection. default is-1to preserve existing water marking behavior. you can override this global setting on a per domain basis in thesni.yamlfile using thehttp2_buffer_water_markattribute. per-domain customization? we love to see it. ๐
๐ง HTTP/3 CONFIGURATION ๐ง
there is no configuration available yet on this release. that's it, that's the whole section. she's not here yet, she's still getting ready. ๐ come back later.
๐ QUIC CONFIGURATION ๐
ok bestie, real talk before we get into it: all of the QUIC configs are still experimental and may be changed or removed in the future without prior notice. ๐ like... don't build your whole personality on them, yk? proceed with caution, queen.
proxy.config.quic.qlog_dirโ Scope:CONFIG, Type:STRING, Default:NULL, Reloadable: Yes.- qlog is enabled whenever this config is not
NULL. When it's on, it will dump the qlog into this dir. โจ
- qlog is enabled whenever this config is not
proxy.config.quic.instance_idโ Scope:CONFIG, Type:INT, Default:0, Reloadable: Yes.- A static key used for calculating the Stateless Reset Token. Every instance in a cluster has to share the same value โ no exceptions, fr fr. ๐
proxy.config.quic.connection_table.sizeโ Scope:CONFIG, Type:INT, Default:65521.- The size of the hash table that stores connection information. it's giving very specific number energy ๐
proxy.config.quic.proxy.config.quic.num_alt_connection_idsโ Scope:CONFIG, Type:INT, Default:65521, Reloadable: Yes.- The number of alternate Connection IDs that Traffic Server provides to a peer. It has to be at least
8. (yes bestie, that config name really does repeat itself like that โ we don't make the rules, we just report them ๐ญ)
- The number of alternate Connection IDs that Traffic Server provides to a peer. It has to be at least
proxy.config.quic.stateless_retry_enabledโ Scope:CONFIG, Type:INT, Default:0, Reloadable: Yes.- Enables Stateless Retry.
proxy.config.quic.client.vn_exercise_enabledโ Scope:CONFIG, Type:INT, Default:0, Reloadable: Yes.- Enables version negotiation exercise on origin server connections.
proxy.config.quic.client.cm_exercise_enabledโ Scope:CONFIG, Type:INT, Default:0, Reloadable: Yes.- Enables connection migration exercise on origin server connections.
proxy.config.quic.server.supported_groupsโ Scope:CONFIG, Type:STRING, Default:"P-256:X25519:P-384:P-521", Reloadable: Yes.- Configures the list of supported groups provided by OpenSSL which will be used to determine the set of shared groups on QUIC origin server connections.
proxy.config.quic.client.supported_groupsโ Scope:CONFIG, Type:STRING, Default:"P-256:X25519:P-384:P-521", Reloadable: Yes.- Same energy, but for QUIC client connections โ configures the list of supported groups provided by OpenSSL that'll determine the shared groups. ๐ฆ
proxy.config.quic.client.session_fileโ Scope:CONFIG, Type:STRING, Default:"", Reloadable: Yes.- Only available for
traffic_quic. If you specify it, TLS session data gets stored to the file, and it'll be used for resuming a session. ๐พ
- Only available for
proxy.config.quic.no_activity_timeout_inโ Scope:CONFIG, Type:INT, Default:30000, Reloadable: Yes.- This value will be advertised as the
idle_timeoutTransport Parameter.
- This value will be advertised as the
proxy.config.quic.no_activity_timeout_outโ Scope:CONFIG, Type:INT, Default:30000, Reloadable: Yes.- This value will be advertised as the
idle_timeoutTransport Parameter.
- This value will be advertised as the
proxy.config.quic.preferred_address_ipv4โ Scope:CONFIG, Type:STRING, Default:"", Reloadable: Yes.- This value will be advertised as a part of the
preferred_addressTransport Parameter.
- This value will be advertised as a part of the
proxy.config.quic.preferred_address_ipv6โ Scope:CONFIG, Type:STRING, Default:"", Reloadable: Yes.- This value will be advertised as a part of the
preferred_addressTransport Parameter.
- This value will be advertised as a part of the
proxy.config.quic.initial_max_data_inโ Scope:CONFIG, Type:INT, Default:65536, Reloadable: Yes.- This value will be advertised as the
initial_max_dataTransport Parameter.
- This value will be advertised as the
proxy.config.quic.initial_max_data_outโ Scope:CONFIG, Type:INT, Default:65536, Reloadable: Yes.- This value will be advertised as the
initial_max_dataTransport Parameter.
- This value will be advertised as the
proxy.config.quic.max_stream_data_bidi_local_inโ Scope:CONFIG, Type:INT, Default:0, Reloadable: Yes.- This value will be advertised as the
initial_max_stream_data_bidi_localTransport Parameter.
- This value will be advertised as the
proxy.config.quic.max_stream_data_bidi_local_outโ Scope:CONFIG, Type:INT, Default:4096, Reloadable: Yes.- This value will be advertised as the
initial_max_stream_data_bidi_localTransport Parameter.
- This value will be advertised as the
proxy.config.quic.max_stream_data_bidi_remote_inโ Scope:CONFIG, Type:INT, Default:4096, Reloadable: Yes.- This value will be advertised as the
initial_max_stream_data_bidi_remoteTransport Parameter.
- This value will be advertised as the
proxy.config.quic.max_stream_data_bidi_remote_outโ Scope:CONFIG, Type:INT, Default:0, Reloadable: Yes.- This value will be advertised as the
initial_max_stream_data_bidi_remoteTransport Parameter.
- This value will be advertised as the
proxy.config.quic.max_stream_data_uni_inโ Scope:CONFIG, Type:INT, Default:4096, Reloadable: Yes.- This value will be advertised as the
initial_max_stream_data_uniTransport Parameter.
- This value will be advertised as the
proxy.config.quic.max_stream_data_uni_outโ Scope:CONFIG, Type:INT, Default:0, Reloadable: Yes.- This value will be advertised as the
initial_max_stream_data_uniTransport Parameter.
- This value will be advertised as the
proxy.config.quic.max_streams_bidi_inโ Scope:CONFIG, Type:INT, Default:100, Reloadable: Yes.- This value will be advertised as the
initial_max_streams_bidiTransport Parameter.
- This value will be advertised as the
proxy.config.quic.max_streams_bidi_outโ Scope:CONFIG, Type:INT, Default:100, Reloadable: Yes.- This value will be advertised as the
initial_max_streams_bidiTransport Parameter.
- This value will be advertised as the
proxy.config.quic.max_streams_uni_inโ Scope:CONFIG, Type:INT, Default:100, Reloadable: Yes.- This value will be advertised as the
initial_max_streams_uniTransport Parameter.
- This value will be advertised as the
proxy.config.quic.max_streams_uni_outโ Scope:CONFIG, Type:INT, Default:100, Reloadable: Yes.- This value will be advertised as the
initial_max_streams_uniTransport Parameter.
- This value will be advertised as the
proxy.config.quic.ack_delay_exponent_inโ Scope:CONFIG, Type:INT, Default:3, Reloadable: Yes.- This value will be advertised as the
ack_delay_exponentTransport Parameter.
- This value will be advertised as the
proxy.config.quic.ack_delay_exponent_outโ Scope:CONFIG, Type:INT, Default:3, Reloadable: Yes.- This value will be advertised as the
ack_delay_exponentTransport Parameter.
- This value will be advertised as the
proxy.config.quic.max_ack_delay_inโ Scope:CONFIG, Type:INT, Default:25, Reloadable: Yes.- This value will be advertised as the
max_ack_delayTransport Parameter.
- This value will be advertised as the
proxy.config.quic.max_ack_delay_outโ Scope:CONFIG, Type:INT, Default:25, Reloadable: Yes.- This value will be advertised as the
max_ack_delayTransport Parameter.
- This value will be advertised as the
๐จ ok so everything from here down is loss detection / congestion control territory and every single one of them says the same thing: this is just for debugging. Do not change it from the default value unless you really understand what this is. like... genuinely. this is not the moment to be quirky and experimental, bestie. ๐
proxy.config.quic.loss_detection.packet_thresholdโ Scope:CONFIG, Type:INT, Default:3, Reloadable: Yes.- This is just for debugging. Do not change it from the default value unless you really understand what this is.
proxy.config.quic.loss_detection.time_thresholdโ Scope:CONFIG, Type:FLOAT, Default:1.25, Reloadable: Yes.- This is just for debugging. Do not change it from the default value unless you really understand what this is.
proxy.config.quic.loss_detection.granularityโ Scope:CONFIG, Type:INT, Default:1, Reloadable: Yes.- This is just for debugging. Do not change it from the default value unless you really understand what this is.
proxy.config.quic.loss_detection.initial_rttโ Scope:CONFIG, Type:INT, Default:1, Reloadable: Yes.- This is just for debugging. Do not change it from the default value unless you really understand what this is.
proxy.config.quic.congestion_control.max_datagram_sizeโ Scope:CONFIG, Type:INT, Default:1200, Reloadable: Yes.- This is just for debugging. Do not change it from the default value unless you really understand what this is.
proxy.config.quic.congestion_control.initial_windowโ Scope:CONFIG, Type:INT, Default:12000, Reloadable: Yes.- This is just for debugging. Do not change it from the default value unless you really understand what this is.
proxy.config.quic.congestion_control.minimum_windowโ Scope:CONFIG, Type:INT, Default:2400, Reloadable: Yes.- This is just for debugging. Do not change it from the default value unless you really understand what this is.
proxy.config.quic.congestion_control.loss_reduction_factorโ Scope:CONFIG, Type:FLOAT, Default:0.5, Reloadable: Yes.- This is just for debugging. Do not change it from the default value unless you really understand what this is.
proxy.config.quic.congestion_control.persistent_congestion_thresholdโ Scope:CONFIG, Type:INT, Default:2, Reloadable: Yes.- This is just for debugging. Do not change it from the default value unless you really understand what this is.
๐ PLUG-IN CONFIGURATION ๐
proxy.config.plugin.plugin_dirโ Scope:CONFIG, Type:STRING, Default:config/plugins.- Specifies the location of Traffic Server plugins. ๐ where the โจmagicโจ lives, basically.
proxy.config.plugin.dynamic_reload_modeโ Scope:CONFIG, Type:INT, Default:1.- Enables (
1) or disables (0) the dynamic reload feature for remap plugins (remap.config). - > heads up: global plugins (
plugin.config) do not have the dynamic reload feature yet. ๐ซถ
- Enables (
proxy.config.plugin.vc.default_buffer_indexโ Scope:CONFIG, Type:INT, Default:8, Reloadable: Yes, Overridable: Yes.- Specifies the buffer index โ and therefore the size โ to use when constructing IO buffers within the
PluginVC. Tuning this can impact the performance of intercept plugins. Default is8, which aligns with the default value ofts:cv:CONFIG proxy.config.http.default_buffer_size. ๐ฅ
- Specifies the buffer index โ and therefore the size โ to use when constructing IO buffers within the
proxy.config.plugin.vc.default_buffer_water_markโ Scope:CONFIG, Type:INT, Default:0, Reloadable: Yes, Overridable: Yes.- Specifies the buffer water mark size in bytes, used to control the flow of data through IO buffers within the
PluginVC. Default is zero, to preserve the existingPluginVCwater marking behavior. ๐ง
- Specifies the buffer water mark size in bytes, used to control the flow of data through IO buffers within the
๐งฆ SOCKS PROCESSOR ๐งฆ
okay bestie, this whole section is about the SOCKS side of things โ every single dial, no skips. let's go ๐
proxy.config.socks.socks_neededโ Scope:CONFIG. Type:INT. Default:0. Turns the SOCKS processor on (1) or off (0). that's literally it, that's the switch ๐๏ธproxy.config.socks.socks_versionโ Scope:CONFIG. Type:INT. Default:4. Picks which SOCKS version we're running:4or5. choose wisely bestie ๐ฆproxy.config.socks.socks_config_fileโ Scope:CONFIG. Type:STRING. Default:socks.config. Deprecated: Yes. โ ๏ธ so like, it still exists but it's giving retired. This file lets you specify ranges of IP addresses that will not be relayed to the SOCKS server. It can also be used to configure AUTH information for SOCKSv5 servers. ๐proxy.config.socks.socks_timeoutโ Scope:CONFIG. Type:INT. Default:100. The activity timeout value (in seconds) for SOCKS server connections. โณ
See Timeout Settings for more discussion on Traffic Server timeouts.
proxy.config.socks.server_connect_timeoutโ Scope:CONFIG. Type:INT. Default:10. The timeout value (in seconds) for SOCKS server connection attempts. like how long we wait for the server to pick up the phone ๐
See Timeout Settings for more discussion on Traffic Server timeouts.
proxy.config.socks.per_server_connection_attemptsโ Scope:CONFIG. Type:INT. Default:1. The total number of connection attempts allowed per SOCKS server, if multiple servers are used. ๐ฏproxy.config.socks.connection_attemptsโ Scope:CONFIG. Type:INT. Default:4. The total number of connection attempts allowed to a SOCKS server โ Traffic Server bypasses the server or fails the request. ๐proxy.config.socks.server_retry_timeoutโ Scope:CONFIG. Type:INT. Default:300. The timeout value (in seconds) for SOCKS server connection retry attempts. ๐
See Timeout Settings for more discussion on Traffic Server timeouts.
proxy.config.socks.default_serversโ Scope:CONFIG. Type:STRING. Default:*NONE*. Default list of SOCKS servers and their ports. ๐proxy.config.socks.server_retry_timeโ Scope:CONFIG. Type:INT. Default:300. The amount of time allowed between connection retries to a SOCKS server that is unavailable. ghosted by the server? give it a sec ๐ซฅproxy.config.socks.server_fail_thresholdโ Scope:CONFIG. Type:INT. Default:2. The number of times the connection to the SOCKS server can fail before Traffic Server considers the server unavailable. two strikes and you're out fr fr ๐ซproxy.config.socks.accept_enabledโ Scope:CONFIG. Type:INT. Default:0. Enables (1) or disables (0) the SOCKS proxy option. As a SOCKS proxy, Traffic Server receives SOCKS traffic (usually on port1080) and forwards all requests directly to the SOCKS server. ๐งฆโจproxy.config.socks.accept_portโ Scope:CONFIG. Type:INT. Default:1080. Specifies the port on which Traffic Server accepts SOCKS traffic. ๐ชproxy.config.socks.http_portโ Scope:CONFIG. Type:INT. Default:80. Specifies the port on which Traffic Server accepts HTTP proxy requests over SOCKS connections. ๐
๐ SOCKETS ๐
this is the networking section bestie, lowkey the main character energy of the whole file ๐ every socket dial ATS has, coming right up.
proxy.config.net.defer_acceptโ Scope:CONFIG. Type:INT. Default:1. default:1meaning on all Platforms except Linux:45seconds.
This directive enables operating system specific optimizations for a listening socket. defer_accept holds a call to accept(2) back until data has arrived. In Linux' special case this is up to a maximum of 45 seconds. On FreeBSD, the accf_data module needs to be loaded. ๐ง๐ฆ
proxy.config.net.listen_backlogโ Scope:CONFIG. Type:INT. Default:-1:reloadable:. This directive sets the maximum number of pending connections. If it is set to-1, Traffic Server will automatically set this to a platform-specific maximum. ๐ขproxy.config.net.tcp_congestion_control_inโ Scope:CONFIG. Type:STRING. Default:"". This directive will override the congestion control algorithm for incoming connections (accept sockets). On Linux, the allowed values are typically specified in a space separated list in/proc/sys/net/ipv4/tcp_allowed_congestion_control. ๐ฆproxy.config.net.tcp_congestion_control_outโ Scope:CONFIG. Type:STRING. Default:"". This directive will override the congestion control algorithm for outgoing connections (connect sockets). On Linux, the allowed values are typically specified in a space separated list in/proc/sys/net/ipv4/tcp_allowed_congestion_control. ๐ฅproxy.config.net.sock_send_buffer_size_inโ Scope:CONFIG. Type:INT. Default:0. Sets the send buffer size for connections from the client to Traffic Server. ๐คproxy.config.net.sock_recv_buffer_size_inโ Scope:CONFIG. Type:INT. Default:0. Sets the receive buffer size for connections from the client to Traffic Server. ๐ฅproxy.config.net.sock_option_flag_inโ Scope:CONFIG. Type:INT. Default:0x1. Turns different options "on" for the socket handling client connections:
TCP_NODELAY (1)
SO_KEEPALIVE (2)
SO_LINGER (4) - with a timeout of 0 seconds
TCP_FASTOPEN (8)
PACKET_MARK (16)
PACKET_TOS (32)
TCP_NOTSENT_LOWAT (64)
NOTE: This is a bitmask and you need to decide what bits to set. Therefore, you must set the value to 3 if you want to enable nodelay and keepalive options above. ๐งฎ
NOTE: To allow TCP Fast Open for client sockets on Linux, bit2of thenet.ipv4.tcp_fastopensysctl must be set. ๐ง
proxy.config.net.sock_send_buffer_size_outโ Scope:CONFIG. Type:INT. Default:0. Overridable: Yes. Sets the send buffer size for connections from Traffic Server to the origin server. ๐คโจproxy.config.net.sock_recv_buffer_size_outโ Scope:CONFIG. Type:INT. Default:0. Overridable: Yes. Sets the receive buffer size for connections from Traffic Server to the origin server. ๐ฅโจproxy.config.net.sock_option_flag_outโ Scope:CONFIG. Type:INT. Default:0x1. Overridable: Yes. Turns different options "on" for the origin server socket:
TCP_NODELAY (1)
SO_KEEPALIVE (2)
SO_LINGER (4) - with a timeout of 0 seconds
TCP_FASTOPEN (8)
PACKET_MARK (16)
PACKET_TOS (32)
TCP_NOTSENT_LOWAT (64)
NOTE: This is a bitmask and you need to decide what bits to set. Therefore, you must set the value to 3 if you want to enable nodelay and keepalive options above. ๐งฎ
NOTE: WhenSO_LINGERis enabled, the linger timeout time is set to0. This is useful when Traffic Server and the origin server are co-located and large numbers of sockets are retained in theTIME_WAITstate. โฑ๏ธ
NOTE: To allow TCP Fast Open for server sockets on Linux, bit1of thenet.ipv4.tcp_fastopensysctl must be set. ๐ง
proxy.config.net.sock_mss_inโ Scope:CONFIG. Type:INT. Default:0. Same as the command line option--accept_mssthat sets the MSS for all incoming requests. ๐proxy.config.net.sock_packet_mark_inโ Scope:CONFIG. Type:INT. Default:0x0. Set the packet mark on traffic destined for the client (the packets that make up a client response). ๐ท๏ธ
SEE ALSO: Traffic Shaping
proxy.config.net.sock_packet_mark_outโ Scope:CONFIG. Type:INT. Default:0x0. Overridable: Yes. Set the packet mark on traffic destined for the origin (the packets that make up an origin request). ๐ท๏ธโจ
SEE ALSO: Traffic Shaping
proxy.config.net.sock_packet_tos_inโ Scope:CONFIG. Type:INT. Default:0x0. Set the ToS/DiffServ Field on packets sent to the client (the packets that make up a client response). ๐ฏ
SEE ALSO: Traffic Shaping
proxy.config.net.sock_packet_tos_outโ Scope:CONFIG. Type:INT. Default:0x0. Overridable: Yes. Set the ToS/DiffServ Field on packets sent to the origin (the packets that make up an origin request). ๐ฏโจ
SEE ALSO: Traffic Shaping
proxy.config.net.sock_notsent_lowatโ Scope:CONFIG. Type:INT. Default:16384. Overridable: Yes. Set socket optionTCP_NOTSENT_LOWATto specified value for a connection. ๐ปproxy.config.net.poll_timeoutโ Scope:CONFIG. Type:INT. Default:10(or30on Solaris). Same as the command line option--poll_timeout, or-t, which specifies the timeout used for the polling mechanism used. This timeout is always in milliseconds (ms). This is the timeout toepoll_wait()on Linux platforms, and tokevent()on BSD type OSs. The default value is10on all platforms. โฒ๏ธ
Changing this configuration can reduce CPU usage on an idle system, since periodic tasks gets processed at these intervals. On busy servers, this overhead is diminished, since polled events triggers more frequently. However, increasing the setting can also introduce additional latency for certain operations, and timed events. It's recommended not to touch this setting unless your CPU usage is unacceptable at idle workload. Some alternatives to this could be:
- Reduce the number of worker threads (net-threads)
- Reduce the number of disk (AIO) threads
Make sure accept threads are enabled.
The relevant configurations for this are:
CONFIG proxy.config.exec_thread.autoconfig INT 0
CONFIG proxy.config.exec_thread.limit INT 2
CONFIG proxy.config.accept_threads INT 1
CONFIG proxy.config.cache.threads_per_disk INT 8
See Timeout Settings for more discussion on Traffic Server timeouts. ๐
proxy.config.task_threadsโ Scope:CONFIG. Type:INT. Default:2. Specifies the number of task threads to run. These threads are used for various tasks that should be off-loaded from the normal network threads. You must have at least one task thread available. ๐งตproxy.config.allocator.thread_freelist_sizeโ Scope:CONFIG. Type:INT. Default:512. Sets the maximum number of elements that can be contained in aProxyAllocator(per-thread) before returning the objects to the global pool. If set to0, there is no limit enforced. ๐๏ธproxy.config.allocator.thread_freelist_low_watermarkโ Scope:CONFIG. Type:INT. Default:32. Sets the minimum number of items aProxyAllocator(per-thread) will guarantee to be holding at any one time. ๐งproxy.config.allocator.hugepagesโ Scope:CONFIG. Type:INT. Default:0. Enable (1) the use of huge pages on supported platforms. (Currently only Linux) ๐๐ง
Okay so the OS-level bit too, bestie โ you gotta actually turn hugepages on in the kernel. On modern Linux you do it by setting /proc/sys/vm/nr_overcommit_hugepages to something sufficiently big. Using (system memory/hugepage size) is a reasonable call, because these pages only get created on demand. โจ
Wanna know what enabling huge pages actually costs you? Go read Wikipedia โ specifically the "Page size trade-off" part of the computer memory article. It's giving required reading. ๐
proxy.config.dump_mem_info_frequencyโ ScopeCONFIG, TypeINT, Default0, Reloadable Yes. Turns it on with<value>. When it's enabled, Traffic Server dumps IO Buffer memory info totraffic.outevery<value>seconds (intervals are in seconds, duh). A value of0literally means it's disabled. ๐proxy.config.res_track_memoryโ ScopeCONFIG, TypeINT, Default0. When enabled, Traffic Server tracks memory usage โ allocations and releases, both. That info gets dumped totraffic.outwhen the user sends aSIGUSR1signal, or periodically whenproxy.config.dump_mem_info_frequencyis enabled. Two ways to peek, pick your fave ๐0โ Memory tracking Disabled1โ Tracks IO Buffer Memory allocations and releases2โ Tracks IO Buffer Memory and OpenSSL Memory allocations and releases
proxy.config.system_clockโ ScopeCONFIG, TypeINT, Default0. For advanced users only, no cap. This one lets you specify the underlying system clock ATS uses. The default isCLOCK_REALTIME(0), but if you're chasing performance,CLOCK_REALTIME_COARSE(5) could be the move. Seeclock_gettime(2)for the details, and on Linux those definitions live in<linux/time.h>. ๐proxy.config.allocator.dontdump_iobuffersโ ScopeCONFIG, TypeINT, Default1. Enable (1) to exclude IO buffers from core files when ATS crashes on supported platforms. (Currently Linux only, soz.) On Linux platforms that supportMADV_DONTDUMP, the IO buffers get allocated with theMADV_DONTDUMPflag viamadvise(). It's enabled by default โ you're welcome. ๐ซถproxy.config.ssl.misc.io.max_buffer_indexโ ScopeCONFIG, TypeINT, Default8. Configures the max IOBuffer Block index used for various SSL operations โ handshake, protocol probe, that whole vibe. Default value is8, which maps to a 32K buffer. ๐proxy.config.hostdb.io.max_buffer_indexโ ScopeCONFIG, TypeINT, Default8. Configures the max IOBuffer Block index used for storing HostDB records. Default is8, which maps to a 32K buffer. Same energy, different department. ๐proxy.config.payload.io.max_buffer_indexโ ScopeCONFIG, TypeINT, Default8. Configures the max IOBuffer Block index used for storing the request payload buffer for a POST request. Default8โ 32K buffer. ๐ฆproxy.config.msg.io.max_buffer_indexโ ScopeCONFIG, TypeINT, Default8. Configures the max IOBuffer Block index used for storing miscellaneous transactional buffers, like an error response body. Default8โ 32K buffer. ๐ฌproxy.config.log.io.max_buffer_indexโ ScopeCONFIG, TypeINT, Default8. Configures the max IOBuffer Block index used for storing an access log entry. Default8โ 32K buffer. ๐proxy.config.http.enabledโ ScopeCONFIG, TypeINT, Default1. Turns HTTP proxying support on or off. Honestly it's rarely used โ the one exception being if you run Traffic Server with a protocol plugin and you want it to not support HTTP requests at all. Main character, non-HTTP edition. ๐proxy.config.http.allow_half_openโ ScopeCONFIG, TypeINT, Default1, Reloadable Yes, Overridable Yes. Turns support for connection half open on or off for the client side. Default is on, so after the client sendsFIN, the connection is still there. It's still standing fr fr. ๐ฅproxy.config.http.wait_for_cacheโ ScopeCONFIG, TypeINT, Default0. Accepting inbound connections and starting the cache are two independent operations in Traffic Server. This variable controls the relative timing of those operations and Traffic Server's dependency on cache โ because if cache is required, then accepting inbound connections should be deferred until we know whether the cache requirement is actually valid. And hey, if cache initialization fails, that gets logged indiags.log. So thoughtful of it. ๐0โ Decouple inbound connections and cache initialization. Connections will be accepted as soon as possible and Traffic Server will run regardless of the results of cache initialization.1โ Do not accept inbound connections until cache initialization has finished. Traffic Server will run regardless of the results of cache initialization.2โ Do not accept inbound connections until cache initialization has finished and been sufficiently successful that cache is enabled. This means at least one cache span is usable. If there are no spans instorage.configor none of the spans can be successfully parsed and initialized, then Traffic Server will shut down. ๐3โ Do not accept inbound connections until cache initialization has finished and been completely successful. This requires at least one cache span instorage.configand that every span specified is valid and successfully initialized. Any error will cause Traffic Server to shut down. No half measures, periodt.
๐ COPYRIGHT ๐
2026, dev@trafficserver.apache.org
and that's the whole entire page, bestie โ we made it to the end ๐ This bad boy is from version 9.2, dated Feb 12, 2026, and it lives at RECORDS.CONFIG(5). Go forth and configure responsibly, you absolute icon ๐ฆโจ๐
๐ฆ where this page comes from
- ubuntu questing: trafficserver 9.2.5+ds-1ubuntu2.1
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms