常见问题 (FAQs)¶
.
帮助:我在哪里可以获得帮助?¶
.
通用¶
为什么 lighttpd 无法启动?¶
手动测试 lighttpd 配置:lighttpd -tt -f /etc/lighttpd/lighttpd.conf
并检查输出。
检查 lighttpd 错误日志以获取线索:例如 /var/log/lighttpd/error.log
systemd 通常隐藏有用的信息,因此 systemctl status lighttpd
不够。journalctl --unit=lighttpd
有时会有帮助。
为什么我的 lighttpd 配置没有达到我想要的效果?¶
打印 lighttpd 配置:lighttpd -p -f /etc/lighttpd/lighttpd.conf
并检查输出。这是 lighttpd 看到的完整配置。
建议您从一个简单、可工作的配置开始。然后,每次只做一个更改,重新启动 lighttpd,并测试更改。
lighttpd 可以使用 DebugVariables 进行配置,以将额外的调试信息打印到 lighttpd 错误日志 (/var/log/lighttpd/error.log
)
为什么对 lighttpd 的请求会超时?(首次设置)¶
如果您是首次设置 lighttpd,则您的系统防火墙可能需要配置为允许 HTTP/HTTPS 请求到达 lighttpd。如果您的系统有 firewall-cmd
,则以 root 身份运行
firewall-cmd --permanent --zone=public --add-service=http firewall-cmd --permanent --zone=public --add-service=https firewall-cmd --reload firewall-cmd --permanent --zone=public --list-services
如何绑定到多个地址?¶
使用 server.bind
和 server.port
绑定到第一个端口,然后使用 $SERVER["socket"]
条件(可以有一个空主体 { }
)绑定到其余端口。例如,绑定到 192.0.2.1 端口 80,并绑定到 *:443 和 [::]:443 (TLS/SSL 端口)
server.port = 80 server.bind = "192.0.2.1" $SERVER["socket"] == ":443" { } $SERVER["socket"] == "[::]:443" { }
更多IPv6 绑定示例
%1/$1 是什么意思?¶
这些是 反向引用,由 mod_rewrite 和 mod_redirect 使用。
%n 用于表示对配置条件的反向引用,而 $n 用于对重定向/重写正则表达式的反向引用。
如果您需要了解正则表达式,Regular-Expressions.info 是一个很好的入门网站。
lighttpd 支持 HTTP/2 吗?¶
是的,lighttpd 1.4.56 及更高版本支持 HTTP/2。
lighttpd 1.4.59 默认启用 HTTP/2 支持。
lighttpd 1.4.56 - lighttpd 1.4.58 可以使用以下配置启用 HTTP/2 支持:server.feature-flags += ( "server.h2proto" => "enable", "server.h2c" => "enable" )
lighttpd 不实现 HTTP/2 PUSH。您可以使用 HTTP Link
响应头来实现类似的行为。
您可以使用 curl
测试 lighttpd HTTP/2 支持curl -v --http2 https://www.example.org/
curl -v --http2 http://www.example.org/
curl -v --http2-prior-knowledge http://www.example.org/
server.error-handler-404
会设置什么样的环境?¶
环境(在使用 CGI 或 FastCGI 时相关)很正常,但请注意以下几点
- REQUEST_URI 是原始请求,与重定向指向的位置无关。
- 其余的 CGI 环境基于
server.error-handler-404
目标。 - QUERY_STRING 不是从原始请求设置的,因此您必须自己解析 REQUEST_URI 才能获取它。
- PATH_INFO 类似,不是从原始请求设置的。
- SCRIPT_NAME 根据
server.error-handler-404
目标设置,而不是根据原始 REQUEST_URI 设置。 - REDIRECT_STATUS 是原始请求的错误状态(例如 404 或 403),
server.error-handler-404
为此被调用。
为什么 server.error-handler-404
返回 200 而不是 404?¶
返回的状态是运行 server.error-handler-404 目标处理程序的结果。您的目标处理程序可以检查 REDIRECT_STATUS,并选择返回该状态而不是 200。如果您只想发送自定义 404 错误页面,请使用 server.errorfile-prefix。要完全控制所有 HTTP 错误状态码,请参见 server.error-handler
如何用密码保护目录?¶
mod_auth
doc/authentication.txt
如果您是从 Apache 转换而来,一个使用 htpasswd 认证的示例:如何从多个文件进行认证
为什么我收到 403 Forbidden?¶
您收到 403 Forbidden 的原因可能有很多。首先要检查的地方是文件系统中的文件权限。十有八九(在 IRC 支持中),您忘记检查某个父目录的权限,以及文档根目录及其内容的权限。仔细检查路径中的每个目录,确保 lighttpd 用户可以访问嵌套的文档根目录。selinux 和类似工具也可能会给您带来麻烦 :)
FastCGI¶
spawn-php 程序/脚本在哪里?¶
spawn-php 是一个单独的软件包。
有 su-exec 包装器可用吗?¶
非官方,但 Sune Foldager 专门为 lighttpd 编写了一个,您可以在这里获取。它非常易于使用,但尚未经过广泛测试,因此建议谨慎使用。另一方面,源代码非常小,因此很容易获得安全概览。说明和使用示例(与 lighttpd 一起)在 README 中。
如何将特定目录从 FastCGI 中排除?¶
# to exclude multiple directories: $HTTP["url"] !~ "^/(?:no-fcgi1|foo/no-fcgi2|bar)/" { $HTTP["url"] !~ "^/no-fcgi/" { fastcgi.server = ( "/" => ... ) }
我的脚本框架如何处理不存在文件的请求?¶
推荐的解决方案是 url.rewrite-if-not-file
例如 url.rewrite-if-not-file = ( "" => "/index.php?path=${url.path}${qsa}" )
更通用的解决方案是 mod_magnet 与 lua 脚本。(有关示例,请参见 LighttpdOnRails。)
应优先使用 url.rewrite-if-not-file 或 mod_magnet,而不是过度使用 server.error-handler-404
将所有不存在的文件重定向到 FastCGI。
当我尝试使用 PHP 时,收到“未指定输入文件”的错误¶
遗憾的是,此错误消息可能意味着很多事情。一个常见的解释尝试:PHP 无法定位或打开它应该解析的文件。这可能有很多原因- 您忘记在 php.ini 中添加 cgi.fix_pathinfo=1
请参见 PHP 文档中的注释。这里的问题是环境变量SCRIPT_FILENAME
没有传递给 PHP。 - 确保您没有在 php.ini 中设置 doc_root 或 userdir,或者如果您设置了它,请确保它具有正确的值(在这种情况下,doc_root 应该与 lighttpd 的 server.document-root 选项匹配)
- 如果设置了 open_basedir,请确保请求的文件位于其中一个指定目录之下。过去 PHP 也会解析不在 open_basedir 内部的文件,但此安全问题已修复(在 php-5.2.3 左右)。
- 如果您以与 lighttpd 不同的权限运行 PHP(spawn-fcgi 使用 -u/-g,execwrap,suexec,...),请检查 PHP 是否确实可以读取文件
如果您无法找到/修复问题,可以使用 strace 查看它是否是(与操作系统相关的)权限问题(查找 stat*(...YOURFILE...) = RETURNCODE)。在这种情况下,将 max-procs
设置为 1 并同时设置 PHP_FCGI_CHILDREN
(请参见 fastcgi 文档)可能会有所帮助,以便您可以轻松地将 strace 附加到正确的 php-cgi 进程。
lighttpd 将生成多少个 PHP CGI 进程?¶
lighttpd 有三个配置选项控制将运行多少个 php-cgi 进程
PHP_FCGI_CHILDREN
(默认为 1)max-procs
(默认为 4)min-procs
(默认为 max-procs)
lighttpd 启动时,它将启动 max-procs 个父 PHP 进程。每个父进程随后预分叉 PHP_FCGI_CHILDREN 个子进程。例如,如果 max-procs 为 4 且 PHP_FCGI_CHILDREN 为 16,lighttpd 将启动 max-procs x ( PHP_FCGI_CHILDREN + 1)。在我们的例子中:4 * ( 16 + 1 ) = 68(4 个不处理请求的观察进程,64 个实际处理请求的 PHP 后端)。
如果您使用 opcode 缓存(如 eAccelerator、XCache 或类似工具),建议将 max-procs 保持在一个非常低的数字(1 完全可以),并改为增加 PHP_FCGI_CHILDREN。否则,这些 opcode 缓存将为每个父进程创建单独的内存空间,在这种情况下,这并不是“高效内存使用”。如果您将 max-procs 保持为 4,您最终将得到四个独立的 opcode 内存缓存段。
请注意,建议设置 PHP_FCGI_MAX_REQUESTS 以避免可能出现的内存泄漏副作用。
来自 Apache 用户的问题¶
从 Apache 迁移的提示¶
lighttpd 支持 Apache .htaccess 文件吗?¶
不支持。Apache .htaccess 文件使用 Apache 配置语法,而不是 lighttpd 配置语法。Apache .htaccess 文件也非常低效,并且在 Apache 中每次请求都会被检查和处理。
话虽如此,有多种方法可以在 lighttpd 中实现 .htaccess 类似的功能
我可以在 lighttpd 中使用 Apache 模块吗?¶
不支持。Apache 模块与 lighttpd 不兼容。
我可以通过 lighttpd 使用 WebDAV 上的 SVN 吗?¶
不支持。请使用 Apache。如果您愿意,可以通过 lighttpd 使用 mod_proxy 将请求代理到 Apache。
lighttpd 中相当于 Apache "Options +!MultiViews" 的是什么?¶
请参见 MultiViews