Project pound
pound
4.23
— 
2026-05-26
* Important bugfix
A bug in "SendFile" allowed for reading files outside of the
configured directory. This is fixed.
* Compilation
The early pthread_cancel probe hack is no longer used. Consequently, the
"--disable-pthread-cancel-probe" configure option is gone.
* Handling of errors during service selection
In previous versions, if service selection failed due to an error
(e.g. because a non-existing backreference was used, a run-time error
in a Lua function occurred, or the like), that service would be skipped
as if its conditions returned false, and the next one would be tried.
This could lead to selecting an improper service in case of error.
Starting from this version, any error occurring during service
selection causes pound to return internal server error (500).
* File descriptor usage
At startup, pound closes all inherited file descriptors numerically
greater than 2. If this is undesirable for some reason, use the
-Wno-close-extra-fds command line option.
Capacity of the incoming connection queue (used when all workers
become busy) is computed so as to prevent the program from running out
of file descriptors. It can also be set explicitly, using the
"ConnectionQueueSize" configuration file statement.
* Configuration constants
The "Constant" statement defines a configuration constant for use in
string expansions and Lua code. A constant is a string value
identified by a unique name. The "Constant" statement can appear in
top-level, listener, and service scopes. The syntax is:
Constant "NAME" "VALUE"
or
Constant "NAME" OPTIONS
where OPTIONS are:
-file FILE
Read constant value from the file FILE at startup.
-filewatch FILE
Read constant value from the file FILE, and monitor it during
the runtime for changes.
-trim
Trim off the trailing whitespace from the obtained value.
Constants can be used in string expansions (using the "%[const NAME]"
accessor), and in Lua code (using the "http:const(NAME)" method).
Refer to the documentation, section "Constants", for a detailed
discussion with examples.
* Tunnels
A tunnel passes an opaque stream of bytes between the client and backend.
It is defined in configuration file using the following construct:
Tunnel [ "ID" ]
Address IPADDR
Port PORT
Backend
Address IPADDR
Port PORT
End
End
Naturally, only one backend is allowed. Similarly to other listeners,
the Address/Port pair in the Tunnel section can be replaced with a
single SocketFrom statement. The following statements are allowed in
Backend subsection: Timeout, ConnTO, Disabled.
* Runtime log level control
The "poundctl" command can be used to inspect log level settings or to
change them without restarting pound.
- poundctl log [/]
Show global log level.
- poundctl log /L
Show log level for the listener L.
- poundctl log /[L] F
Set log level F. If argument is "/", global log level is
set. Otherwise, log level for the listener L is set.
- poundctl log -d /L
Clears log level setting for the listener L. As a result, the
listener will use global log level.
- poundctl log -d [/]
Set global log level to "null".
* Lua: access to the originator IP
Two new fields are available in the "http" table:
* http.rmt_ip
Request originator IP address (as string).
* http.fwd_ip
Request originator IP address (as string), determined using the
X-Forwarded-For (or similar) header. If the request bears no such
header or if the TrustedIP list is not declared, this is
equivalent to http.rmt_ip.
Pound is a reverse proxy, load balancer and HTTPS front-end for Web servers. It was developed to enable distributing load among several Web-servers and to allow for a convenient SSL wrapper for those Web servers that do not offer it natively.
Pound was originally developed by Robert Segall at Apsis GmbH. I took over its development when Robert announced that he abandons it.