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;
默认值:false

示例

debug.log_request_handling true;

static.range_requests (选项)

启用范围请求

static.range_requests value;
默认值:true

示例

static.range_requests false;

keepalive.timeout (选项)

保持活跃连接的开放时长(秒)

keepalive.timeout timeout;
默认值:5

示例

keepalive.timeout 30;

keepalive.requests (选项)

客户端在一次连接中允许发出的最大请求数

keepalive.requests requests;
默认值:0

示例

keepalive.requests 10;

etag.use (选项)

用于计算etag的属性列表;指定空列表以禁用etag。可用属性:"inode", "mtime", "size"

etag.use properties;
默认值:("inode", "mtime", "size")

示例

etag.use ();

stat.async (选项)

启用异步 stat() 调用

stat.async value;
默认值:true

如果文件名在 lighttpd 的 stat “缓存”中,lighttpd 假定内核仍将该条目保存在内存中,因此 stat() 不太可能阻塞。
否则,它将请求一个后台线程调用 stat(),这样主工作线程就不会等待缓慢的磁盘(或网络文件系统),但这仅在启用 stat.async 时。

如果您知道您的磁盘足够快(也许是内存盘?),并且希望节省到后台线程的上下文切换,则可以禁用此功能。

buffer_request_body (选项)

启用在磁盘上缓冲请求体

buffer_request_body value;
默认值:true

某些后端喜欢在转发/处理响应之前等待完整的响应。为此,它们需要此选项以节省一些内存。

strict.post_content_length (选项)

对POST请求要求Content-Length

strict.post_content_length value;
默认值:true

某些客户端对于空请求体的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/2.0.0"

默认值为“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配置)。

在以下情况下不执行任何操作:

  • 请求已被处理
  • 未设置物理路径(缺少 docrootalias 等)
  • 物理路径指向一个目录

所有其他问题都会导致错误页面,例如:

  • 错误的请求方法 (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.add (操作)

添加新的请求头行

req_header.add (name, value);
名称
头名称
模式头值

与请求头的 header.add 相同。

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";
}