Lighttpd (简体中文) - ArchWiki

# Lighttpd (简体中文)

From ArchWiki
Jump to navigation Jump to search
翻译状态： 本文是英文页面 lighttpd 的翻译，最后翻译时间：2019-07-5，点击这里可以查看翻译后英文页面的改动。

lighttpd是一个安全，快速，标准，且非常灵活的网页服务器，并对高性能环境做了最佳化。相较于其他网页服务器,它占用的内存很少，且注重CPU负载量。它的进阶功能集 （FastCGI，CGI，验证，输出压缩，网址重定向等等）让Lighttpd成为每个试图摆脱瓶颈的服务器的完美网页服务器软件。

## 安装

Lighttpd可以从[extra]仓库获得:

    # pacman -S lighttpd

## 设置

### 基本设置

lighttpd配置文件： `/etc/lighttpd/lighttpd.conf`。在安装完成后它会自动生成一个用于测试的测试页面。

想要检查 `lighttpd.conf` 中的语法错误，可以使用以下命令来快速查找错误：

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

预设配置文件会把 `/srv/http/` 指定为提供HTTP服务的文件目录。

测试安装结果：

    # chmod 755 /srv/http/index.html
    # echo 'TestMe!' >> /srv/http/index.html

修改日志目录权限:

    # chown -R http:http /var/log/lighttpd

启动服务:

    # systemctl start lighttpd

然后就可以使用浏览器打开网址 `localhost` ，你应该能见到测试页面。

开机自动启动:

    # systemctl enable lighttpd

示例配置文件在 `/usr/share/doc/lighttpd/`。

#### 基本日志

lighttpd 能够输出错误与访问记录到日志文件中。如下编辑`/etc/lighttpd/lighttpd.conf`以启用这两个日志选项：

    server.modules += (
       "mod_access",
       "mod_accesslog",
    )

    server.errorlog   = "/var/log/lighttpd/error.log"
    accesslog.filename = "/var/log/lighttpd/access.log"

#### 通过SSL启动HTTPS

警告: 计划独立实现SSL/TLS的用户应当注意，SSL/TLS的一些变种和实现难以抵抗攻击。参阅OpenSSL
Tip:

- Mozilla 有一个能用于lighttpd的SSL 配置生成器。
- 设置SSL后, 你可以用 Qualys SSL Labs' SSL服务器检验来检查你的配置

##### 自签名证书

安装openssl后，自签名SSL证书用以下方式生成：

    # 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["socket"] == ":443" {
        ssl.engine                  = "enable"
        ssl.pemfile                 = "/etc/lighttpd/certs/server.pem"
     }

##### Let's Encrypt

你也可以生成被Let's Encrypt签名的证书。在手动生成Let’s Encrypt的证书后，把生成的`privkey.pem`和完整的证书链文件`fullchain.pem`组合为一个文件：

    # cat /etc/letsencrypt/live/domain/{privkey.pem,fullchain.pem} > /etc/letsencrypt/live/domain/combined.pem

在`/etc/lighttpd/lighttpd.conf`增加：

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

This article or section needs expansion.

Reason: 需要解释下列内容, link to [1] and SSL_CONF_cmd(3ssl). (Discuss in Talk:Lighttpd (简体中文)#)

If you get a "empty reply from server" when trying to curl https://domain, trying adding

    ssl.openssl.ssl-conf-cmd = ("Protocol" => "-ALL, TLSv1.2")

to the above. This may also fix Firefox not being able to load the HTTPS version of your site

#### 重定向HTTP请求到HTTPS

你需要在`/etc/lighttpd/lighttpd.conf`中的server.modules数组中增加`"mod_redirect"`:

    server.modules += ( "mod_redirect" )

    $SERVER["socket"] == ":80" {
      $HTTP["host"] =~ "example.org" {
        url.redirect = ( "^/(.*)" => "https://example.org/$1" )
        server.name                 = "example.org"
      }
    }

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

为了重定向所有网络主机到它们的HTTPS安全访问方式，用以下内容取代之前的socket 80端口配置：

    $SERVER["socket"] == ":80" {
      $HTTP["host"] =~ ".*" {
        url.redirect = (".*" => "https://%0$0")
      }
    }

如仅需重定向所有网络主机的一部分 (例如，“secure” or ”phpmyadmin“):

    $SERVER["socket"] == ":80" {
      $HTTP["url"] =~ "^/secure" {
        url.redirect = ( "^/(.*)" => "https://example.com/$1" )
      }
    }

#### 用密码保护目录

注意：此模块需要mariadb-libs。一个近似于系统的`/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",
     )

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

    # 注意：这里的路径是相对于server.document-root变量的
    auth.require = ( "/secret" =>
       (
        "method" => "basic",
        "realm" => "Password Required",
        "require" => "user=foo"
       )
    )

注意: 写入`/etc/lighttpd/lighttpd.conf`的”user“和”realm“项必须与`/etc/lighttpd/lighttpd.user`中相符，以使认证正常运作。

### CGI

Common Gateway Interface (CGI) 脚本对于lighttpd可以开箱即用, 你只需要开启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，之后你的lighttpd就有了fcgi支持， 以下内容是给需要使用Ruby，PHP或者Python的人的指导。

注意: lighttpd现在默认以用户 `http` 运行。

首先复制一份默认配置，从 `/usr/share/doc/lighttpd/config/conf.d/fastcgi.conf` 复制到 `/etc/lighttpd/conf.d`

将以下内容添加到 `/etc/lighttpd/conf.d/fastcgi.conf`

    server.modules += ( "mod_fastcgi" )

    #server.indexfiles += ( "dispatch.fcgi" ) #这是强烈不建议的
    index-file.names += ( "dispatch.fcgi" ) # 如果选用rails，增加dispatch.fcgi

    server.error-handler-404   = "/dispatch.fcgi" #同上
    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的指导。

#### PHP

安装 php 和 php-cgi (可以参阅 PHP 、 LAMP).

确认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

    # 请确保php和php-cgi已正确安装。参阅:
    # https://wiki.archlinux.org/index.php/Fastcgi_and_lighttpd#PHP

    server.modules += ("mod_fastcgi")

    # FCGI server
    # ===========
    #
    # 配置一个处理PHP请求的FastCGI服务器
    #
    index-file.names += ("index.php")
    fastcgi.server = (
        ".php" => (
            # 下列FastCGI服务器中的负载均衡配置。
            # 服务器的命名仅用作日志中服务器的标识名。
            "localhost" => (
                "bin-path" => "/usr/bin/php-cgi",
                "socket" => "/tmp/php-fastcgi.sock",
                # 分解SCRIPT_FILENAME 以让PHP能够从中解析出PATH_INFO
                "broken-scriptfilename" => "enable",
                # 启动 (max-procs + (max-procs * PHP_FCGI_CHILDREN)) 个进程, 其中
                # max-procs 个是“watcher”进程，其余是“worker”进程。参阅：
                # https://redmine.lighttpd.net/projects/1/wiki/frequentlyaskedquestions#How-many-php-CGI-processes-will-lighttpd-spawn
                "max-procs" => 4, # 默认值
                "bin-environment" => (
                    "PHP_FCGI_CHILDREN" => "1" # 默认值
                )
            )
        )
    )

在/etc/lighttpd/lighttpd.conf中添加以下内容使新配置能够应用:

    /etc/lighttpd/lighttpd.conf

    include "conf.d/fastcgi.conf"

注意: 模块顺序十分重要, 正确地模块加载顺序位于 `/usr/share/doc/lighttpd/config/modules.conf`. 任何错误配置都可能导致 lighttpd 崩溃。

重新加载 lighttpd：

1. systemctl restart lighttpd

注意:

- 如果你在访问php文件时遇到诸如 No input file found 的错误, 有很多原因可以导致这个错误，请参阅 this FAQ 。
- 确认没有其他模块 (如 `mod_cgi`) 负责处理php文件。

##### 使用php-fpm

在最近的lighttpd发行版中不再有适应性的进程创建功能（adaptive spawning）。为了动态管理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"
          ))
    )

#### Python FastCGI

注意:

- 以下方法无法用于Python3,因为Flup库仅对Python2有效。

如果你想使用Python3,你可参考本文的#CGI一节

如上文#FastCGI所述安装并配置FastCGI。 安装 python2-flup

    pacman -S python2-flup

配置:

    fastcgi.server = (
        ".py" =>
        (
            "python-fcgi" =>
            (
            "socket" => "/run/lighttpd/fastcgi.python.socket",
             "bin-path" => "test.py",
             "check-local" => "disable",
             "max-procs" => 1,
            )
        )
    )

在你服务器的根目录运行如下内容的test.py;（注意，你应对其增加可执行权限: chmod +x test.py)

    #!/usr/bin/env python2

    def myapp(environ, start_response):
        print 'got request: %s' % environ
        start_response('200 OK', [('Content-Type', 'text/plain')])
        return ['Hello World!']

    if __name__ == '__main__':
        from flup.server.fcgi import WSGIServer
        WSGIServer(myapp).run()

感谢用户 firecat53的解释

##### 服务器名称标识（Server_Name_Indication）

要在lighttpd中使用SNI，仅需把 ssl.pemfile配置文件加入主机的条件判断中。操作仍需一个默认的ssl.pemfile文件。

    $HTTP["host"] == "www.example.org" {
        ssl.pemfile = "/etc/lighttpd/certs/www.example.org.pem"
    }

    $HTTP["host"] == "mail.example.org" {
        ssl.pemfile = "/etc/lighttpd/certs/mail.example.org.pem"
    }

### 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",
                "strip-request-url" => "uwsgi/foo"
            )),
            "/uwsgi/bar" =>
                "host"              => "127.0.0.1",
                "port"              => "8080",
                "check-local"       => "disable",
                "strip-request-url" => "uwsgi/foo"
            ))
        )
    }

你可以以systemd unit]或[direct的方式启动ywsgi应用。 此处是一个来自 digitalocean的小巧的教程，指出如何从零开始创建一个Flask框架应用程序。

### 输出压缩

在 `/etc/lighttpd/lighttpd.conf` 中增加：

    var.cache_dir           = "/var/cache/lighttpd"

之后，为压缩的文件创建目录：

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

复制示例配置文件：

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

在`/etc/lighttpd/lighttpd.conf`中增加如下内容：

    include "conf.d/compress.conf"

注意: 你不能通过在`/etc/lighttpd/lighttpd.conf`增加内容代替复制compress.conf的作用

你同样能够选择何种类型的内容应该被压缩。修改`/etc/lighttpd/conf.d/compress.conf`中的`compress.filetype`参数来做到这一点:

    compress.filetype           = ("text/plain", "text/html", "text/javascript", "text/css", "text/xml")

## 疑难解答

### 关于Lighttpd下载.php文件的情况

若Lighttpd仅仅是下载`.php`文件而不是去“初始化”它们，那么你可能没把下面的一些设置写入你的配置文件里`/etc/lighttpd/lighttpd.conf`。

    server.modules = (
                       "mod_fastcgi",
                     )

    fastcgi.server = ( ".php" => ((
                         "bin-path" => "/usr/bin/php-cgi", #depends where your php-cgi has been installed. Default here.
                         "socket" => "/tmp/php.socket",
                         "max-procs" => 2,
                         "bin-environment" => (
                           "PHP_FCGI_CHILDREN" => "16",
                           "PHP_FCGI_MAX_REQUESTS" => "10000"
                         ),
                         "bin-copy-environment" => (
                           "PATH", "SHELL", "USER"
                         ),
                         "broken-scriptfilename" => "enable"
                     )))

### CCS样式列表无法正确显示

Lighttpd的默认设置是没有包括CSS的媒体类型的，所以标准的浏览器把text/CSS误以为text/html而混淆彼此，最终什么都没有正确的显示出来。要解决这个问题需要在CSS中增加一条说明。

    mimetype.assign	= (
      ".html" => "text/html",
      ".txt" => "text/plain",
      ".jpg" => "image/jpeg",
      ".png" => "image/png",
      ".css" => "text/css"
    )

换行不是必须的，仅仅为了可读性。

## 参见

- Lighttpd wiki

Category:

- Web server (简体中文)

Hidden category:

- Pages or sections flagged with Template:Expansion