1.  常用文档

2.  Debian下基本安装

在Debian下安装很简单:“apt-get install lighttpd”就可以了。

安装之后默认使用www-data用户启动服务进程,默认的页面根目录在/var/www,配置文件都在/etc/lighttpd下面,日志文件在/var/log/lighttpd。

3.  启用 SSL 支持

现在公益组织 Let's Encrypt 提供限时但免费的 SSL 证书,因此个人站也可以启用 SSL 支持了。启用 SSL 支持,有利于提供一点网站的安全性。

注意:Lighttpd 的 SSL 支持不能与反向代理功能一起使用,有这样场景需要的话就得改为使用 Nginx 或 HAProxy。

3.1  安装 snapcraft 环境

获取以及自动更新证书,最方便是使用一个名为 certbot 的工具来进行。虽然 Linux 发行版一般也提供 certbot 软件包,但版本不够新,可能在使用中会存在一些问题,因此一般建议使用 snapcraft 环境来安装 certbot,因此这里先准备 snapcraft 环境(一个类似 Docker 的解决方案,但会直接使用宿主机的 ip 地址和端口)。

详细情形可参考 Installing snap on Debian ,这里记录简要操作:

  1. apt-get install snapd (这一步之后最好退出当前 shell 重新登录,这样让新的 snap 环境变量生效)
  2. snap install core

在国内使用 snap,会严重受到跨国网络的影响,又慢又不稳定,会经常下载安装失败。所以,下载安装失败时多试几次……如果实在下载总是不成功,那么试试把下载步骤和安装步骤分开,以 hello-world 包为例(原始说明参考:Offline snap installers and possibility to update):

  1. snap download hello-world
  2. snap ack hello-world_27.assert
  3. snap install hello-world_27.snap
  4. snap list

3.2  用 certbot 获取证书

详细说明参考:Certbot Instructions

安装 certbot:snap install --classic certbot

如果 lighttpd 已经在提供服务,那么使用指令 certbot certonly --webroot

之后根据指令返回的交互提示一步一步操作即可。(Let's Encrypt 的证书似乎不支持通配符,但可以在一个证书上绑定多个子域名。其中 webroot 指的是网站根目录在服务器上的物理路径,证书申请过程会需要在网站根目录上临时增加一点文件,以便向 Let's Encrypt 证明申请者是此网站的拥有者。)

3.3  在 lighttpd 启用 SSL 证书

先要把 certbot 生成的 cert.pem 和 privkey.pem 两个文件合并为 web.pem 这一个,才能给 lighttpd 用。例如执行如下指令:

cat /etc/letsencrypt/live/www.elias.cn/cert.pem /etc/letsencrypt/live/www.elias.cn/privkey.pem > /etc/letsencrypt/live/www.elias.cn/web.pem

再在 lighttpd.conf 文件中,增加如下行(这声明了 https 访问使用的默认证书):

$SERVER["socket"] == ":443" {
  ssl.engine = "enable"
  ssl.pemfile = "/etc/letsencrypt/live/www.elias.cn/web.pem" # Combined Certificate
  ssl.ca-file = "/etc/letsencrypt/live/www.elias.cn/chain.pem" # Root CA
}

如果要给不同域名的网站指定不同的证书,那么在 virtual host 中可以再重新声明与具体网站对应的证书文件,例如:

$HTTP["host"] =~ "(www\.|)elias\.cn" {
  ssl.pemfile = "/etc/letsencrypt/live/www.elias.cn/web.pem" # Combined Certificate
}

如果一切正确,这样已经可以使用 https 来访问网站了。

我们可以再增加一个重定向,把所有 http 访问自动跳转到 https,例如 lighttpd.conf 中增加这样一段:

$HTTP["scheme"] == "http" {
  $HTTP["host"] == "www.elias.cn" { # HTTP URL
    url.redirect = ("/.*" => "https://www.elias.cn$0") # Redirection HTTPS URL
  }
}

3.4  测试 certbot 证书自动更新

certbot 会自己在系统中增加定时任务去维护证书的自动更新,为了测试这个过程是否有效,可以用如下指令:

certbot renew --dry-run

另外需要记得,要自行建立定时任务,处理 cert.pem 和 privkey.pem 合并为 web.pem 这件事。

4.  php相关配置

4.1  启用php支持

如果要启用php支持,可以这样(使用的是fast-cgi方式):

  1. 首先“apt-get install php5-cgi”来安装php5相关的包(当然也可以改为安装php4-cgi来仅使用php4版本)
  2. 修改/etc/lighttpd/conf-available/10-fastcgi.conf,将里面的“php4-cgi”字样改为“php5-cgi”以使配置脚本正确调用php5包中提供的指令。
  3. “lighty-enable-mod fastcgi”来启用lighttpd的fastcgi模块支持,再“/etc/init.d/lighttpd force-reload”来强制lighttpd重新读取配置文件来激活php解析。

这样已经可以在/var/www目录下放置php程序了。php自身的参数配置可以修改/etc/php5/cgi/php.ini来实现。

4.2  优化php的FastCGI设置

详见http://trac.lighttpd.net/trac/wiki/Docs%3APerformanceFastCGI

由于服务器内存紧张,没有启用XCache等组件,我在这里主要是调整了FastCGI启动php的进程和线程数。除了按照文中通过估计单位时间pv来确定需要准备的php总线程数外,也可以考虑用试验法……top指令是可以看到所有php线程的,按大写的T键,使线程/进程们按照已经占用的所有cpu时间来排序,如果仍然有几乎没有怎么工作的php线程,则通常可以认为是总线程数有富余。

此外,文中建议避免少量进程带大量线程,因为这样一旦一个进程挂掉,会一次死掉很多线程,其他进程就很有可能负载暴增,造成进程死亡的连锁反应。

4.3  安装 XCache

XCache 在 Debian 中有官方安装包,而 eAccelerator 没有,需要自行编译,因此暂时使用的 XCache 。只需 apt-get install php5-xcache 后重启 lighttpd 即可,网站系统的执行效率有可以感觉到的明显提升。其默认设置的缓存容量为 16M ,在小内存的系统上可能还有进一步优化的余地。

4.4  安装eAccelerator模块加速

安装了eAccelerator后php线程占用的内存有所增加(当然占用内存多少和线程执行的php脚本本身的特点也有关系),但脚本执行的速度也是能够感觉到有加速的。

安装eAccelerator的方法详见http://www.howtoforge.com/eaccelerator_php5_debian_etch (如果是其他Linux发行版,在该网站也可以找到对应的说明文档)。大致步骤有:

apt-get install build-essential php5-dev
cd /tmp
wget http://bart.eaccelerator.net/source/0.9.5.2/eaccelerator-0.9.5.2.tar.bz2
tar xvfj eaccelerator-0.9.5.2.tar.bz2
cd eaccelerator-0.9.5.2
phpize
./configure
make
make install

然后设置eAccelerator的配置参数(/etc/php5/conf.d/eaccelerator.ini),如果没有这个文件,可以自行建立,如果服务器内存足够那么文件内容通常写成这样:

extension="eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/var/cache/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

如果服务器内存很紧张,比如服务器总共才128M内存,那么可以这样写(参考自Nginx 0.7.x + PHP 5.2.6(FastCGI)+ MySQL 5.1 在128M小内存VPS服务器上的配置优化):

extension="eaccelerator.so"
eaccelerator.shm_size="1"
eaccelerator.cache_dir="/var/cache/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="3600"
eaccelerator.shm_prune_period="3600"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
eaccelerator.keys = "disk_only"
eaccelerator.sessions = "disk_only"
eaccelerator.content = "disk_only"

其中省内存的配置对每个PHP进程大约只多占用1M内存,但在我服务器上实测性能大约能提高10%。此外也可以参考http://www.eaccelerator.net/wiki/Settings 的说明自行琢磨着调整这些参数。

建立eAccelerator需要的缓存存储目录:

mkdir -p /var/cache/eaccelerator
chmod 0777 /var/cache/eaccelerator

重启lighttpd,在info.php应该可以看到带有“eAccelerator”的字样。

出于服务器安全考虑,在安装eAccelerator成功后,会去除服务器上的软件编译环境:

apt-get remove --purge autoconf automake automake1.4 autotools-dev binutils build-essential cpp cpp-4.3 dpkg-dev g++ g++-4.3 gcc gcc-4.3 libc6-dev libgomp1 libltdl3-dev libmpfr1ldbl libssl-dev libstdc++6-4.3-dev libtimedate-perl libtool linux-libc-dev patch php5-dev shtool zlib1g-dev

4.5  在lighty下使用wp-super-cache

详细步骤说明文档见:在Lighttpd上使用wp-super-cache

5.  启用WebDAV

5.1  服务器端配置

以下步骤在Debian Lenny版本下测试通过(参考了How To Set Up WebDAV With Lighttpd On Debian Etch):

除lighttpd包外,还需要安装lighttpd-mod-webdav apache2-utils两个包,后者主要是要用到里面的htpasswd配置工具。

激活lighty的认证模块:

 lighty-enable-mod auth

编辑/etc/lighttpd/lighttpd.conf文件,确认mod_alias和mod_webdav都已经激活。

新建一个passwd.dav文件来存储认证用的用户名和密码,并设定适当的权限。这里test是用作示例的用户名,-c参数表示不管passwd.dav文件是否已经存在,都重新建立这个文件(这里我是把dav文件存储在了/var/www下,在实际应用中需要确保所在目录不会被公开访问到):

htpasswd -c /var/www/passwd.dav test
chown root:www-data /var/www/passwd.dav
chmod 640 /var/www/passwd.dav

然后我们再回来编辑/etc/lighttpd/lighttpd.conf文件,搞一个启用了WebDAV的虚拟站点:

$HTTP["host"] == "www.example.com" {
  server.document-root = "/var/www/web1"
  alias.url = ( "/webdav" => "/var/www/web1" )
  $HTTP["url"] =~ "^/webdav($|/)" {
    webdav.activate = "enable"
    webdav.is-readonly = "disable"
    webdav.sqlite-db-name = "/var/run/lighttpd/lighttpd.webdav_lock.db"
    auth.backend = "htpasswd"
    auth.backend.htpasswd.userfile = "/var/www/passwd.dav"
    auth.require = ( "" => ( "method" => "basic",
                             "realm" => "webdav",
                             "require" => "valid-user" ) )
  }
}

如果按照这个配置文件,那么站点的根目录是只读的(也就是普通的http访问),而/webdav/目录是可写的WebDAV访问方式。这是靠配置文件中alias.url和$HTTP["url"] =~ "^/webdav($|/)"这两句来实现的。但我在这里遇到了一个问题,我的客户端似乎与alias.url不兼容,所以最后我只好把WebDAV配置到站点的根目录了。。

都搞好以后重启lighty,WebDAV应该就已经生效了:

 /etc/init.d/lighttpd restart

5.2  WebDAV的访问客户端

  • cadaver是一个命令行的客户端,常被用于配置完成后的基本功能测试。
  • Windows下可以在网络邻居中新建连接,将WebDAV服务映射成一个本地路径(当然还有DreamWeaver等很多应用程序支持WebDAV);或者用AnyClient这个Java的图形化客户端也相当不错。
  • Mac下有很多程序都有WebDAV的连接功能,比如Transmit、ForkLift等等。
GlossyBlue theme adapted by David Gilbert
Powered by PmWiki