从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存储库中找到