资源调优¶
流式传输¶
lighttpd 提供多种选项来控制请求体和响应体的流式传输。
流式传输选项影响 lighttpd 在请求由**动态后端**(mod_proxy、mod_fastcgi、mod_scgi 等)处理时如何缓冲请求体和响应体。为动态后端提供服务的 lighttpd 模块在准备好处理请求体时会触发请求体的读取(如果有)。如果处理请求的 lighttpd 模块对请求体不感兴趣,则在请求处理并发送响应之前不会读取请求体。类似地,当 lighttpd 发送静态文件作为响应时,在 lighttpd 发送静态文件响应时不会读取请求体(如果有)。
请记住,lighttpd 会尽快发送响应,除非受到流量整形的限制。
流式传输设置影响动态处理程序,但对静态文件没有影响
server.stream-request-body
server.stream-response-body
默认情况下,请求体流式传输和响应体流式传输均被禁用:server.stream-request-body = 0
和 server.stream-response-body = 0
。通过这些设置,lighttpd 可以有效地从后端卸载请求和响应。lighttpd 直到请求体已被 lighttpd 完全读取并缓冲后,才会连接到后端(或启动 CGI 程序)。lighttpd 尽可能快地读取和缓冲来自后端的响应,并且直到响应体已被 lighttpd 完全读取并缓冲后才开始发送响应。对于超过特定大小的请求和响应,lighttpd 会使用磁盘上的临时文件来存储请求体和响应体,从而限制内存使用。这样做的结果是,CPU 和内存密集型后端进程运行时间尽可能短,并且不会在等待客户端通过网络发送或接收数据(这可能很慢且有损)时占用 CPU 和内存。例如:如果 CGI 程序做的第一件事是读取整个请求体,则建议使用 server.stream-request-body = 0
,以便 CGI 不会因等待请求体到达而运行超出所需时间。如果临时文件磁盘空间非常有限,则 server.stream-request-body = 2
可能是更好的选择。
对于 server.stream-request-body
或 server.stream-response-body
的非零值会在一个或两个方向上启用流式传输,进而减少 lighttpd 在一个或两个方向上的卸载。启用流式传输可以减少后端开始接收请求体或客户端开始接收响应体之前的延迟。当后端可能在请求体完成上传之前发送响应并中止读取请求体时,或者当后端产生的响应很大、耗时很长或分段产生时,这种设置是可取的。供参考:任何支持 Upgrade: websocket
的后端(例如 mod_cgi 的 cgi.upgrade = "enable"
或 mod_proxy 的 proxy.header = ("upgrade" => "enable")
)在客户端连接升级为使用 WebSockets 时会自动启用流式传输。
如果启用流式传输,请考虑是否也要调整 lighttpd 默认的读写超时时间server.max-read-idle
- 从客户端读取新数据等待的最大秒数(默认值:60),否则关闭连接server.max-write-idle
- 向客户端写入待处理数据等待的最大秒数(默认值:360),否则关闭连接
(在 lighttpd 1.4.60+ 中添加:)
后端选项 *.server += ("write-timeout" => 0, "read-timeout" => 0)
(默认值:从后端读/写无超时)
mod_cgi cgi.limits = ("write-timeout" => 0, "read-timeout" => 0)
(默认值:从 CGI 读/写无超时)
当 server.stream-request-body = 1
或 server.stream-response-body = 1
时,lighttpd 会继续以网络允许的速度从客户端或后端读取数据,将大型数据体缓冲到磁盘上的临时文件中。如果磁盘空间有限,则 server.stream-request-body = 2
或 server.stream-response-body = 2
会将 lighttpd 对临时文件的使用限制为清空内核套接字或管道缓冲区,并会暂停从客户端读取更多数据,直到 lighttpd 已向后端写入更多数据,或者会暂停从后端读取更多数据,直到 lighttpd 已向客户端写入更多数据。这可能会引入请求/响应延迟,但如果磁盘空间是主要资源限制之一,则其填充有限磁盘空间的可能性也大大降低。
server.upload-dirs 用于配置 lighttpd 存储临时文件的位置。尽管包含“upload”一词,但配置的位置用于请求体和响应体。server.upload-dirs
是一个列表,可以包含多个目录。如果第一个位置已满,lighttpd 将重试将其他临时文件写入列表中的下一个位置。在大多数临时文件可以容纳在快速内存文件系统(大小有限)中(例如 /dev/shm
),并且希望减少对嵌入式系统闪存上的 /usr/local/tmp
的写入时,使用多个目录非常有用:server.upload-dirs = ( "/dev/shm", "/usr/local/tmp" )
。默认值取自 lighttpd 启动时的环境变量 TMPDIR
(如果未设置 TMPDIR
,则在 Windows 上取自 TEMP
),否则为 server.upload-dirs = ("/var/tmp")
,因为 /var/tmp
通常比 /tmp
大。然而,在嵌入式系统中,/var/tmp
可能会符号链接到 /tmp
,而 /tmp
可能是一个大小有限的内存文件系统,在这种情况下,server.stream-request-body = 2
可能是一个不错的选择。
默认情况下,在创建临时文件时,lighttpd 将每个文件的大小限制为大约 1 MB(模糊值),这可以通过 server.upload-temp-file-size
(以字节为单位)进行配置。使用多个(相对)较小尺寸的临时文件的原因是,每个临时文件在被后端读取或发送到客户端后可以立即删除(并释放空间)。这是为了避免存储整个结果(任一方向)并在请求或响应的整个持续时间内占用越来越多的磁盘空间。如果 server.stream-request-body = 0
(默认值),磁盘空间有限,并且 CGI 所做的第一件事是将整个请求体读取到另一个临时文件中,那么对于 lighttpd 1.4.60 及更高版本,还建议使用 server.feature-flags += ("cgi.tempfile-accum" => "disable")
来禁用 mod_cgi 中的一项优化。
一些其他相关选项server.max-connections
- 同时处理的最大客户端连接数server.max-request-field-size
- 请求头最大字节数(默认 8192 (8k);最大可配置为 64k-1)server.max-request-size
- 请求(头 + 体)最大千字节数(默认:0 表示无限制)