从Nginx迁移回到Lighttpd以及相关配置 — High5!


我们的基础设施中有一些运行NGINX的FreeBSD机器。在F5 最近宣布购买NGINX之后,我们决定回到Lighttpd
我们看到很多开源项目在被收购后表现并不是那么良好,我们认为这次收购不会对项目有利。
几年前Lighttpd项目停滞不前,它让我们转向NGINX。最近几年它再次活跃起来,我们决定退回去。
在这篇文章中,我们描述了Lighttpd配置,以涵盖NGINX上的所有用途。

Lighttpd中的许多选项都是通过使用模块启用的。这些是我们在所有Lighttpd服务器上启用的模块

server.modules = (
  "mod_auth",
  "mod_expire",
  "mod_compress",
  "mod_rewrite",
  "mod_redirect",
  "mod_alias",
  "mod_access",
  "mod_setenv",
  "mod_evhost",
  "mod_fastcgi",
  "mod_accesslog",
  "mod_openssl"
)

指定Lighttpd侦听的IP和端口是以几种不同的方式定义的。对于IPv4 server.port和server.bind。对于IPv6,您必须使用$ SERVER [“socket”]。SSL配置也是如此。

server.port = "80"
server.bind = "0.0.0.0"
$SERVER["socket"] == "[::]:80" { }
$SERVER["socket"] == "[::]:443" { }
$SERVER["socket"] == ":443" {
  ssl.engine = "enable"
  ssl.pemfile = "/usr/local/etc/ssl/certs/example.com/combined.pem"
  ssl.ca-file = "/usr/local/etc/ssl/certs/example.com/chain.pem"
  ssl.cipher-list = "EECDH+AESGCM:EDH+AESGCM:AES128+EECDH:AES128+EDH"
  ssl.dh-file = "/usr/local/etc/ssl/certs/dhparam.pem"
  ssl.ec-curve = "secp384r1"
  setenv.add-response-header = ("Strict-Transport-Security" => "max-age=31536000; includeSubdomains")
}

Lighttpd需要PEM证书。您可以轻松创建:
# cat domain.key domain.crt > combined.pem

您可以使用以下命令创建dhparam.pem文件:
# openssl dhparam -out dhparam.pem 4096

这些是我们在FreeBSD上使用的与服务器设置相关的全局设置。

server.username = "www"
server.groupname = "www"
server.pid-file = "/var/run/lighttpd.pid"
server.event-handler = "freebsd-kqueue"
server.stat-cache-engine = "disable"
server.max-write-idle = 720
server.tag = "lighttpd"
server.document-root = "/usr/local/www/default/"
server.error-handler-404 = "/404.html"
accesslog.filename = "/usr/local/www/logs/lighttpd.access.log"
server.errorlog = "/usr/local/www/logs/lighttpd.error.log"
server.dir-listing = "disable"

一些适用于Lighttpd服务的所有网站的全局设置。

index-file.names = ("index.php", "index.html", "index.htm")
url.access-deny = ("~", ".inc", ".sh", "sql", ".htaccess")
static-file.exclude-extensions = (".php", ".pl", ".fcgi")

让我们加密的别名。

alias.url += ("/.well-known/acme-challenge/" => "/usr/local/www/acme/")

为某些文件类型启用压缩。

compress.cache-dir = "/tmp/lighttpdcompress/"
compress.filetype = ("text/plain", "text/css", "text/xml", "text/javascript")

需要身份验证时,您可以指定如下。支持不同的后端。

auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "/usr/local/etc/lighttpd/htpasswd"

某些文件类型的常规Expire和Cache-Control标头。

$HTTP["url"] =~ "\.(js|css|png|jpg|jpeg|gif|ico)$" {
  expire.url = ( "" => "access plus 1 months" )
}

当您运行Wordpress网站时,您可能想要拒绝访问某些网址。

$HTTP["url"] =~ "/(?:uploads|files|wp-content|wp-includes).*\.(php|phps|txt|md|exe)$" {
  url.access-deny = ("")
}
$HTTP["url"] =~ "/(wp-config|xmlrpc)\.php$" {
  url.access-deny = ("")
}

定义需要身份验证的主机和URL。
$HTTP["host"] =~ "www1.example.com" {
  auth.require = ( "/admin/" => (
    "method" => "basic",
    "realm" => "Restricted",
    "require" => "valid-user" )
  )
}

将某些主机从http重定向到https。
$HTTP["host"] =~ "(www\.)?example.com" {
  url.redirect = ("^/(.*)" => "https://www.example.com/$1")
}

有一个可用的模块可以帮助为虚拟主机分配正确的server.document-root。这可以使用mod_evhost完成,我们使用以下模式:

$HTTP["host"] =~ "^(www.)?[^.]+\.[^.]+$" {
  evhost.path-pattern = "/usr/local/www/www.%2.%1/"
}

为了能够使用Wordpress的漂亮网址,您可以使用以下mod_rewrite规则。

url.rewrite = (
  "^/(.*)\.(.+)$" => "$0",
  "^/(.+)/?$" => "/index.php/$1"
)

当您使用PHP-FPM时,最后一块拼图可以使用以下配置。

fastcgi.server = ( ".php" =>
  ( "localhost" =>
    (
      "host" => "127.0.0.1",
      "port" => 9000
    )
  )
)

完整的配置可以在我们的Git存储库中找到