plugin_core
plugin_core 包含通用请求处理、静态文件、日志文件和缓冲区限制的核心功能。
套接字地址
可使用以下地址格式
IPv4
可以带端口 192.168.0.1:80
,也可以不带 192.168.0.1
;您可以使用真实IP或 0.0.0.0
来监听所有网络接口。
IPv6
类似于IPv4;只需将IPv6放在“[”和“]”之间,例如:[::1]:80
(带端口80的IPv6 localhost)。
请注意,lighttpd始终只监听IPv6(某些平台默认在[::]上也会监听IPv4)。
Unix域套接字
Unix域套接字需要一个用于放置套接字的文件名;使用 unix:/path/to/socket
作为套接字地址。
请勿将Unix域套接字放在 /tmp
中。请使用 /var/run/lighttpd/
或类似路径,以便只有root或选定的“受信任”用户才能创建文件。
这可能并非在所有可以指定套接字地址的地方都受支持。
选项
debug.log_request_handling (选项)
启用请求处理的调试输出
debug.log_request_handling value;
示例
debug.log_request_handling true;
static.range_requests (选项)
启用范围请求
static.range_requests value;
示例
static.range_requests false;
keepalive.timeout (选项)
保持活跃连接的开放时长(秒)
keepalive.timeout timeout;
示例
keepalive.timeout 30;
keepalive.requests (选项)
客户端在一次连接中允许发出的最大请求数
keepalive.requests requests;
示例
keepalive.requests 10;
etag.use (选项)
用于计算etag的属性列表;指定空列表以禁用etag。可用属性:"inode", "mtime", "size"
etag.use properties;
示例
etag.use ();
stat.async (选项)
启用异步 stat() 调用
stat.async value;
如果文件名在 lighttpd 的 stat “缓存”中,lighttpd 假定内核仍将该条目保存在内存中,因此 stat()
不太可能阻塞。
否则,它将请求一个后台线程调用 stat()
,这样主工作线程就不会等待缓慢的磁盘(或网络文件系统),但这仅在启用 stat.async
时。
如果您知道您的磁盘足够快(也许是内存盘?),并且希望节省到后台线程的上下文切换,则可以禁用此功能。
buffer_request_body (选项)
启用在磁盘上缓冲请求体
buffer_request_body value;
某些后端喜欢在转发/处理响应之前等待完整的响应。为此,它们需要此选项以节省一些内存。
strict.post_content_length (选项)
对POST请求要求Content-Length
strict.post_content_length value;
某些客户端对于空请求体的POST请求不发送Content-Length;它们应该发送 Content-Length: 0
。当启用此检查时,它们将收到 411 Length required
错误。
static.exclude_extensions (选项)
不提供带有列出扩展名的静态文件
static.exclude_extensions extensions;
示例
static.exclude_extensions [ ".php", ".htaccess", ".htpasswd" ];
server.name (选项)
服务器名称;在某些情况下,如果HTTP/1.0请求中未指定HTTP请求主机名,则使用此名称。
server.name hostname;
即使是HTTP/1.0客户端通常也会指定Host: 头;没有Host: 头,您只能在一个IP地址上运行一个域。
此选项用于您希望以良好方式处理不支持Host: 头的客户端的罕见情况。
示例
server.name "lighttpd.net";
server.tag (选项)
用于在不同位置(HTTP响应头、CGI环境、mod_dirlist页脚等)显示服务器名称+版本
server.tag tag;
默认值为“lighttpd/”+当前版本。
mime_types (选项)
将文件扩展名映射到MIME类型
mime_types mapping;
默认MIME类型是“application/octet-stream”。源代码包含一个 mimetypes示例配置,其中包含许多标准映射。
使用最长匹配的后缀(".tar.gz"
始终优先于 ".gz"
),如果存在重复条目,则使用最后一个。
示例
mime_types [ ".htm" => "text/html", ".txt" => "text/plain; charset=utf-8" ];
Lua所需操作
在非Lua配置中,这些操作不是必需的(或不可用)。
list (操作)
(Lua) 将一系列操作合并为一个操作,仅在Lua中需要
list actions;
- 操作
- 要合并的操作列表
when (操作)
(Lua) 构建一个条件块(仅在Lua中可用)
when (condition, action1, action2);
- 条件
- 一个条件;只能在Lua中构建
- 操作1
- 如果条件为真或Lua“nil”,则运行的操作
- 操作2
- (可选)如果条件为假,则运行的操作
将URL路径映射到文件名
docroot (操作)
设置文档根目录,并为请求的文件构建物理路径
docroot patterns;
- 模式
- 用于构建文档根目录的一个或多个模式
使用 模式 来构建文档根目录(要服务的文件的基本位置)。
docroot
使用第一个生成现有目录的模式;否则,它使用最后一个条目。
您会希望 docroot
操作在 alias
操作之前!
示例
docroot ("/var/www/vhosts/$0/htdocs", "/var/www/default/htdocs");
alias (操作)
根据匹配前缀设置文档根目录
alias mapping;
- 映射
- 将前缀映射到磁盘上的基本位置
在前缀附加到基本位置之前,会从URL路径中删除。
您会希望 docroot
操作在 alias
操作之前!
别名目标支持 模式,与 docroot
中一样。由于每个前缀只能给出一个模式,alias
不会检查目标是否存在。
前缀中的尾随斜杠曾用于指示“目录处理”并被匹配时忽略;现在“目录处理”总是启用。
这意味着URL路径仅在分隔符边界处匹配;前缀 /a
(和 /a/
)匹配路径 /a
、/a/
和 /a/b
,但不匹配 /ab
。
示例
docroot ("/var/www/vhosts/$0/htdocs", "/var/www/default/htdocs");
alias [
"/phpmyadmin/" => "/usr/share/phpmyadmin",
"/pma/" => "/usr/share/phpmyadmin",
"/.well-known/openpgpkey/" => "/var/lib/gnupg/wks/$0/",
];
alias "/favicon.ico" => "/var/www/favicon.ico";
index (操作)
目录中显示的默认文件名
index filenames;
- 文件名
- 要查找的文件名
如果物理路径是一个目录,则搜索指定的文件名;在文件名之前加上‘/’以在文档根目录中搜索。
工作方式如下
- 如果当前物理路径指向常规文件,则不执行任何操作
- 遍历要查找的文件名列表
- 如果文件名不以‘/’开头,并且当前物理路径不指向目录,则忽略该条目
- 如果文件名不以‘/’开头,并且URL不以‘/’结尾,则将请求重定向到附加了‘/’的URL
- 如果文件名不以‘/’开头,则在当前物理路径(一个目录)中搜索它
- 如果文件名以‘/’开头,则在文档根目录中搜索它
示例
setup {
module_load "mod_dirlist";
}
# if a directory was requested, first search for some default files
index ["index.php", "index.html", "/index.php"];
# if none of them did exists show a simple directory listing
dirlist;
# ... + handle PHP and static files
pathinfo (操作)
将物理路径拆分为现有文件/目录和剩余的PATH_INFO
pathinfo;
搜索物理路径名中最长且存在的公共前缀,仅在目录分隔符 /
处进行拆分;同时永远不会离开文档根目录(从技术上讲,文件名不能比文档根目录更短)。
示例
以下示例将 http://example.com/index.php/some/site
映射到文件 /var/www/index.php
,其 PATH_INFO=/some/site
(假设 /var/www/index.php
是一个普通文件)。
docroot "/var/www";
pathinfo;
if phys.path =$ ".php" { fastcgi "unix:/var/run/lighttpd/php.sock"; }
示例
以下示例将 http://example.com/some/site
映射到文件 /var/www/index.php
,其 PATH_INFO=/some/site
(假设 /var/www/index.php
是一个普通文件,并且 /var/www/some
不存在)。
docroot "/var/www";
pathinfo;
index ("index.php");
if phys.path =$ ".php" { fastcgi "unix:/var/run/lighttpd/php.sock"; }
生成响应
static (操作)
使用磁盘上的静态文件处理GET和HEAD请求
static;
此操作会自动附加到全局配置中(除非在命令行中指定了lua配置)。
在以下情况下不执行任何操作:
- 请求已被处理
- 未设置物理路径(缺少
docroot
、alias
等) - 物理路径指向一个目录
所有其他问题都会导致错误页面,例如:
- 错误的请求方法 (405)
- 文件未找到 (404)
- 无法打开文件 (403)
- 文件名匹配
static.exclude_extensions
(403) - …
static_no_fail (操作)
使用磁盘上的静态文件处理GET和HEAD请求
static_no_fail;
与 static
相同,但不返回任何错误页面;相反,请求处理继续。
respond (操作)
返回带可选响应体的快速响应
respond (status, content);
- 状态
- HTTP响应状态码
- 内容
- (可选)响应体的模式
生成一个简单响应(我们最喜欢的基准测试处理程序)。
响应体被解析为 模式。
示例
respond 403 => "Forbidden";
示例
respond 200 => "benchmark content!";
日志记录
日志级别
对于标准日志记录(“error.log”),lighttpd 知道以下级别:
debug(调试)
info(信息)
warning(警告)
error(错误)
-
abort
(在终止进程之前) -
backend
(用于来自后端(例如FastCGI标准错误流)的日志数据)
日志目标
已知的日志目标如下:
- 不记录日志:空字符串
- 文件:
file:/var/log/error.log
或仅/var/log/error.log
- 标准错误:
stderr:
或stderr
- syslog:
syslog:
(暂不支持) - 管道:
pipe:command
或| command
(暂不支持)
未知字符串将映射到 stderr
。
log (操作)
覆盖所有日志级别的日志目标
log map;
- 映射
- 将日志级别(或默认级别)映射到日志目标
示例
log [
"error" => "/var/log/lighttpd/error.log",
"abort" => "/var/log/lighttpd/error.log",
"backend" => "/var/log/lighttpd/backend.log",
default => "/var/log/lighttpd/debug.log",
];
log.write (操作)
将日志消息写入“info”日志级别
log.write message;
- 消息
- 消息模式字符串
使用 info
级别将指定消息写入日志;该消息被解析为 模式。
示例
log.write "hello world";
log (设置)
为所有日志级别设置默认日志目标
log map;
- 映射
- 将日志级别(或默认级别)映射到日志目标
示例
setup {
log [
"error" => "/var/log/lighttpd/error.log",
"abort" => "/var/log/lighttpd/error.log",
"backend" => "/var/log/lighttpd/backend.log",
default => "/var/log/lighttpd/debug.log",
];
}
log.timestamp (设置)
设置日志中时间戳的格式字符串
log.timestamp format;
- 格式
- strftime格式字符串
有关格式字符串语法,请参阅 strftime。
默认格式字符串为 "%d/%b/%Y %T %Z"
。
连接环境
连接环境是一组带有名称和值(均为简单字符串)的变量。CGI后端除了标准的CGI环境变量外,还会转发此环境。
连接环境会覆盖标准的CGI值。
env.set (操作)
设置连接环境变量
env.set (name, value);
- 名称
- 要设置的变量名称
- 值
- 要设置的模式值
该值被解析为 模式。
示例
env.set "INFO" => "%{req.path}";
env.add (操作)
如果尚未设置,则设置连接环境变量
env.add (name, value);
- 名称
- 要设置的变量名称
- 值
- 要设置的模式值
该值被解析为 模式。env.add
不会覆盖已存在的值。
示例
env.add "INFO" => "%{req.path}";
env.remove (操作)
移除连接环境变量
env.remove name;
- 名称
- 要移除的变量名称
示例
env.remove "INFO";
env.clear (操作)
移除所有连接环境变量
env.clear;
示例
env.clear;
响应头
所有设置的头值都将被解析为 模式。
header.add (操作)
添加新的响应头行
header.add (name, value);
- 名称
- 头名称
- 值
- 模式头值
HTTP规范要求,多个同名头可以通过使用“,”连接其值来合并。
实际操作中这并非总是有效,尤其是对于“Cookie”头;因此此操作实际上会添加一个单独的头行。
示例
header.add "Cache-Control" => "public";
header.append (操作)
将值附加到响应头行
header.append (name, value);
- 名称
- 头名称
- 值
- 模式头值
如果头已存在,则将新值用“, “分隔后附加;否则添加新的头行。
header.overwrite (操作)
覆盖响应头行或添加新行
header.overwrite (name, value);
- 名称
- 头名称
- 值
- 模式头值
如果头已存在,则覆盖其值;否则添加新行。
header.remove (操作)
移除现有响应头
header.remove name;
- 名称
- 头名称
示例
# ... some PHP handling
# wait for response headers to be ready
if resp.status >= 0 {
header.remove "X-Powered-By";
}
set_status (操作)
修改HTTP状态码
set_status;
修改HTTP状态码,但不会以任何方式处理请求。
后续操作可能会覆盖状态,或者如果响应稍后被解析,后端(FastCGI、代理等)可能会覆盖它。
仅当某个操作实际处理了请求时才有效。
如果处理请求的操作未生成响应体且允许响应体,Lighttpd将生成错误页面(如果它知道该代码)。
示例
# hide all 404s at end of config by setting 403
static;
if resp.status == 404 { set_status 403; }
请求头
所有设置的头值都将被解析为 模式。
req_header.append (操作)
将值附加到请求头行
req_header.append (name, value);
- 名称
- 头名称
- 值
- 模式头值
与请求头的 header.append 相同。
req_header.overwrite (操作)
覆盖请求头行或添加新行
req_header.overwrite (name, value);
- 名称
- 头名称
- 值
- 模式头值
与请求头的 header.overwrite 相同。
req_header.remove (操作)
移除现有请求头
req_header.remove name;
- 名称
- 头名称
与请求头的 header.remove 相同。
示例
移除 Accept-Encoding
请求头,以解决HTTPS中的 BREACH 漏洞。
if request.scheme == "https" {
# create a copy of the header value
req_header.add "HTTPS-Accept-Encoding" => '%{req.header[Accept-Encoding]}';
req_header.remove "Accept-Encoding";
}
io.buffer_out (操作)
设置出站chunkqueues的内存限制(默认为256KiB)
io.buffer_out limit;
- 限制
- 字节限制(0表示无限制)
示例
io.buffer_out 512kbyte;
io.buffer_in (操作)
设置入站chunkqueues的内存限制(默认为256KiB)
io.buffer_in limit;
- 限制
- 字节限制(0表示无限制)
示例
io.buffer_in 512kbyte;
map (操作)
将模式的结果映射到用户定义的操作
map (pattern, mapping);
- 模式
- 此模式的评估结果用作映射中的键
- 映射
- 将字符串(或默认值)映射到操作
该模式被解析为 模式。有关主机名的特殊映射,请参阅 mod_vhost。
示例
map "%{req.path}" => [
"/" => {
respond 200 => "root";
},
"/news" => {
respond 200 => "news";
},
default => {
respond 404;
},
];
listen (设置)
监听套接字地址,接受的格式请参见上方(默认TCP端口为80)
listen socket-address;
- 套接字地址
- 要监听的套接字地址
示例
setup {
listen "0.0.0.0";
listen "[::]";
listen "127.0.0.1:8080";
}
workers (设置)
设置worker数量;每个worker都在自己的线程中运行,并处理从主worker分配给它的连接
workers count;
- 数量
- worker数量(默认为1)
示例
setup {
workers 2;
}
workers.cpu_affinity (设置)
将worker线程绑定到CPU,仅在Linux系统上可用
workers.cpu_affinity mapping;
- 映射
- 整数列表或整数列表的列表
示例
workers.cpu_affinity [0, 1];
module_load (设置)
加载指定模块
module_load names;
- 名称
- 包含模块名称的字符串或字符串列表
模块可以多次“加载”而不会出错
示例
setup {
module_load "mod_rewrite";
}
io.timeout (设置)
设置全局I/O超时(等待网络读写)
io.timeout timeout;
- 超时
- 超时值(秒),默认为300秒
stat_cache.ttl (设置)
设置统计缓存条目的TTL
stat_cache.ttl ttl;
- TTL(生存时间)
- 生存时间(秒),默认为10秒
tasklet_pool.threads (设置)
设置阻塞任务的后台线程数
tasklet_pool.threads threads;
- 线程
- 线程数
例如,stat缓存使用此类后台线程。
如果 threads = 0
,则任务在前台运行(无后台线程)。
如果 threads < 0
,所有worker共享一个GThreadPool。
如果 threads > 0
,则每个worker都有自己的线程池,包含 threads
个线程。
fetch.files_static (设置)
启动一个Fetch API提供者
fetch.files_static (name, filename-pattern);
- 名称
- 存储名称
- 文件名模式
- 一个包含一个“*”的文件名模式
将所有匹配通配符模式(必须包含一个 *
)的文件名加载到fetch存储中。
示例
setup {
fetch.files_static "sni" => "/etc/certs/lighttpd_sni_*.pem";
}