lighttpd

来自 ArchWiki

lighttpd (发音为 /lighty/) 是一个安全、快速、符合标准且非常灵活的 web 服务器,它针对高性能环境进行了优化。 lighttpd 支持各种各样的功能,同时有效地使用内存和 CPU,使 lighttpd 成为所有系统(无论大小)的理想 web 服务器。”

安装

安装 lighttpd 软件包。

配置

基本设置

lighttpd 配置文件是:/etc/lighttpd/lighttpd.conf。默认情况下,它应该生成一个可工作的测试页面。

要检查您的 lighttpd.conf 是否有错误,您可以使用此命令(有助于快速找到错误配置)

$ lighttpd -tt -f /etc/lighttpd/lighttpd.conf

默认配置文件指定 /srv/http/ 作为文档目录。要测试安装,请创建一个虚拟文件

/srv/http/index.html
Hello world!

然后 启动/启用 lighttpd.service,并将您的浏览器指向 localhost,您应该在那里看到测试页面。

示例配置文件位于 /usr/share/doc/lighttpd/ 中。

基本日志记录

lighttpd 可以将错误和访问都写入日志文件。错误日志默认启用(由 server.errorlog 选项控制)。要启用访问日志,请按如下方式编辑 /etc/lighttpd/lighttpd.conf

server.modules += (
   "mod_accesslog",
)

accesslog.filename = "/var/log/lighttpd/access.log"

启用基于 SSL 的 https

警告: 计划实施 SSL/TLS 的用户应该知道,某些变体和实现容易受到攻击。有关详细信息,请参阅 OpenSSL 文章。
提示
自签名

可以生成自签名 SSL 证书,假设系统上安装了 openssl,如下所示

# mkdir /etc/lighttpd/certs
# openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -sha256 -keyout /etc/lighttpd/certs/server.pem -out /etc/lighttpd/certs/server.pem
# chmod 600 /etc/lighttpd/certs/server.pem

修改 /etc/lighttpd/lighttpd.conf,添加以下行以启用 https

server.modules += ( "mod_openssl" )

$SERVER["socket"] == ":443" {
   ssl.engine                  = "enable" 
   ssl.pemfile                 = "/etc/lighttpd/certs/server.pem" 
}

有关详细信息,请参阅 lighttpd TLS 配置

Let's Encrypt

或者,生成由 Let's Encrypt 签名的证书。

编辑 /etc/lighttpd/lighttpd.conf,添加以下行

$SERVER["socket"] == ":443" {
    ssl.engine                  = "enable"
    ssl.privkey                 = "/etc/letsencrypt/live/domain/privkey.pem" 
    ssl.pemfile                 = "/etc/letsencrypt/live/domain/fullchain.pem"  
}

有关详细信息,请参阅 lighttpd 文档中的 bootstrap Let's Encrypt

将 http 请求重定向到 https

您应该在 /etc/lighttpd/lighttpd.conf 的 server.modules 数组中添加 "mod_redirect"

server.modules += ( "mod_redirect" )

$HTTP["scheme"] == "http" {
  url.redirect = ("" => "https://${url.authority}${url.path}${qsa}")
}

$SERVER["socket"] == ":443" {
  ssl.engine = "enable" 
  ssl.pemfile = "/etc/lighttpd/certs/server.pem" 
  server.document-root = "..." 
}

要重定向站点的一部分的所有主机(例如 secure 或 phpmyadmin)

$HTTP["url"] =~ "^/secure" {
  $HTTP["scheme"] == "http" {
    url.redirect = ("" => "https://${url.authority}${url.path}${qsa}")
  }
}

密码保护目录

用户身份验证需要一个 passwd 文件,它是 lighttpd 中等效于系统 /etc/passwd 的文件。设置需要特定的格式和 md5sum 哈希密码,但用户可以使用以下示例快速轻松地创建条目

$ user=foo
$ password=b@R102
$ realm='Password Required'
$ hash=`echo -n "$user:$realm:$password" | md5sum | cut -b -32`

# echo "$user:$realm:$hash" >> /etc/lighttpd/lighttpd.user

修改 /etc/lighttpd/lighttpd.conf,添加以下行以启用目录保护

server.modules += ( "mod_auth", "mod_authn_file" )

auth.backend                = "htdigest"
auth.backend.htdigest.userfile = "/etc/lighttpd/lighttpd.user"

# note this entry is relative to the server.document-root
auth.require = ( "/secret" =>
   (
    "method" => "basic",
    "realm" => "Password Required",
    "require" => "valid-user"
   )
)
注意: 输入到 /etc/lighttpd/lighttpd.conf 中的 realm 必须与 /etc/lighttpd/lighttpd.user 中选择的值匹配,身份验证才能工作。

CGI

通用网关接口 (CGI) 脚本只需要启用 CGI 模块;包含配置文件,并确保安装了您选择的编程语言解释器。(即,对于 python,您需要安装 python

创建文件 /etc/lighttpd/conf.d/cgi.conf 并添加以下内容

server.modules += ( "mod_cgi" )

cgi.assign                 = ( ".pl"  => "/usr/bin/perl",
                               ".cgi" => "/usr/bin/perl",
                               ".rb"  => "/usr/bin/ruby",
                               ".erb" => "/usr/bin/eruby",
                               ".py"  => "/usr/bin/python",
                               ".php" => "/usr/bin/php-cgi" )

index-file.names           +=( "index.pl",   "default.pl",
                               "index.rb",   "default.rb",
                               "index.erb",  "default.erb",
                               "index.py",   "default.py",
                               "index.php",  "default.php" )

对于 PHP 脚本,您需要确保在 /etc/php/php.ini 中设置了以下内容

cgi.fix_pathinfo = 1

在您的 lighttpd 配置文件 /etc/lighttpd/lighttpd.conf 中添加

include "conf.d/cgi.conf"

FastCGI

安装 fcgi。现在您已经安装了支持 fcgi 的 lighttpd。如果这就是您想要的,那么您就都设置好了。想要 Ruby on Rails、PHP 或 Python 的人应该继续。

注意: 新的默认用户和组:lighttpd 现在默认以用户/组 http 身份运行,而不是组 nobody

首先,将示例配置文件从 /usr/share/doc/lighttpd/config/conf.d/fastcgi.conf 复制到 /etc/lighttpd/conf.d

以下内容需要添加到配置文件 /etc/lighttpd/conf.d/fastcgi.conf

server.modules += ( "mod_fastcgi" )

index-file.names += ( "dispatch.fcgi" ) #dispatch.fcgi if rails specified

server.error-handler-404   = "/dispatch.fcgi" #too
fastcgi.server = (
    ".fcgi" => (
      "localhost" => ( 
        "socket" => "/run/lighttpd/rails-fastcgi.sock",
        "bin-path" => "/path/to/rails/application/public/dispatch.fcgi"
      )
    )
)

然后在 /etc/lighttpd/lighttpd.conf

include "conf.d/fastcgi.conf"

对于 PHP 或 Ruby on Rails,请参阅下一节。

PHP

使用 php-cgi

安装 phpphp-cgi(另请参阅 PHPLAMP)。

检查 php-cgi 是否正常工作 php-cgi --version

PHP 5.4.3 (cgi-fcgi) (built: May  8 2012 17:10:17)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies

如果您得到类似的输出,则 php 已正确安装。

创建一个新的配置文件

/etc/lighttpd/conf.d/fastcgi.conf
# Make sure to install php and php-cgi. See:                                                             
# https://wiki.archlinux.org.cn/index.php/Fastcgi_and_lighttpd#PHP

server.modules += ("mod_fastcgi")

# FCGI server
# ===========
#
# Configure a FastCGI server which handles PHP requests.
#
index-file.names += ("index.php")
fastcgi.server = ( 
    # Load-balance requests for this path...
    ".php" => (
        # ... among the following FastCGI servers. The string naming each
        # server is just a label used in the logs to identify the server.
        "localhost" => ( 
            "bin-path" => "/usr/bin/php-cgi",
            "socket" => "/tmp/php-fastcgi.sock",
            # breaks SCRIPT_FILENAME in a way that PHP can extract PATH_INFO
            # from it 
            "broken-scriptfilename" => "enable",
            # Launch (max-procs + (max-procs * PHP_FCGI_CHILDREN)) procs, where
            # max-procs are "watchers" and the rest are "workers". See:
            # https://wiki.lighttpd.net/frequentlyaskedquestions#How-many-php-CGI-processes-will-lighttpd-spawn 
            "max-procs" => "4", # default value
            "bin-environment" => (
                "PHP_FCGI_CHILDREN" => "1" # default value
            )
        )
    )   
)

通过将以下行附加到您的 lighttpd 配置文件,使 lighttpd 使用新的配置文件

/etc/lighttpd/lighttpd.conf
include = "conf.d/fastcgi.conf"
注意: 请记住,模块加载的顺序很重要。正确的顺序在 /usr/share/doc/lighttpd/config/modules.conf 中列出。

重新加载 lighttpd。

注意
  • 如果您在尝试访问 php 文件时收到类似No input file found的错误,则可能有几种可能的解释。有关更多信息,请参阅 此 FAQ
  • 确保没有其他模块(例如 mod_cgi)会尝试处理 .php 扩展名。
使用 php-fpm

对于 PHP 进程的动态管理,您可以安装 php-fpm,然后 启动启用 php-fpm.service

注意: 您可以通过编辑文件 /etc/php/php-fpm.conf 来配置池中的服务器数量并调整其他配置选项。有关 php-fpm 的更多详细信息,请访问 php-fpm 网站。请记住,当您更改 /etc/php/php.ini 时,您需要 重启 php-fpm.service

/etc/lighttpd/conf.d/fastcgi.conf 中添加

server.modules += ( "mod_fastcgi" )

index-file.names += ( "index.php" ) 

fastcgi.server = (
    ".php" => (
      "localhost" => ( 
        "socket" => "/run/php-fpm/php-fpm.sock",
        "broken-scriptfilename" => "enable"
      ))
)

uWSGI

/etc/lighttpd/lighttpd.conf 中添加

server.modules += ("mod_scgi")

$HTTP["url"] =~ "^/uwsgi/" {
    scgi.protocol = "uwsgi"
    scgi.server   = (
        "/uwsgi/foo" => ((
            "socket"            => "/path/to/socket",
            "check-local"       => "disable"
        )),
        "/uwsgi/bar" => ((
            "host"              => "127.0.0.1",
            "port"              => "8080",
            "check-local"       => "disable"
        ))
    )
}

然后,您可以将 uwsgi 应用程序作为 systemd 单元直接启动。这里 是 digitalocean 提供的关于如何从头开始设置 flask 应用程序的简洁指南。

输出压缩

复制示例配置文件

# mkdir /etc/lighttpd/conf.d
# cp /usr/share/doc/lighttpd/config/conf.d/deflate.conf /etc/lighttpd/conf.d/

/etc/lighttpd/lighttpd.conf 中添加以下内容

include "conf.d/deflate.conf"

最后,重新加载 lighttpd.service,它将动态压缩纯文本和 html 内容。

注意: 您不能这样做(复制 deflate.conf)并在 /etc/lighttpd/lighttpd.conf 中添加所需的内容来代替。

也可以选择应该压缩的内容类型。修改 /etc/lighttpd/conf.d/deflate.conf 上的参数 deflate.mimetypes

deflate.mimetypes           = ("text/plain", "text/html", "text/javascript", "text/css", "text/xml")

您还可以创建一个缓存目录来存储压缩文件

# mkdir /var/cache/lighttpd/compress
# chown http:http /var/cache/lighttpd/compress

然后取消注释并修改 /etc/lighttpd/conf.d/deflate.conf 中的 deflate.cache-dir 选项

deflate.cache-dir = "/var/cache/lighttpd/compress"

参见