如何在Lighttpd服务器上使用W3TotalCache设置WordPress
介绍
本文将向您展示如何使用流行的缓存插件 W3 Total Cache 在 Lighttpd Web 服务器上设置 WordPress。 假设您已经设置了一个 LLMP 堆栈 并且 PHP 与 Lighttpd 一起运行。 我们将进行大量手动配置以使 minify 和页面缓存与 Lighttpd 一起使用,因为 W3 Total Cache 不支持该 Web 服务器开箱即用(与 Apache 和 Nginx 一样) .
启用所需模块
WordPress 需要 mod_rewrite
用于永久链接,但该模块在 Lighttpd 配置文件中被注释掉。 所以编辑文件并删除 #
nano /etc/lighttpd/lighttpd.conf server.modules = ( "mod_access", "mod_alias", "mod_compress", "mod_redirect", # "mod_rewrite", )
改变
# "mod_rewrite",
到
"mod_rewrite",
我们还需要网站的访问日志,因此启用 accesslog 模块。
lighttpd-enable-mod accesslog
创建虚拟主机
为 WordPress 站点添加一个虚拟主机——确保将 example.com 替换为您自己的域名。
nano /etc/lighttpd/lighttpd.conf $HTTP["host"] =~ "(^|www\.)example.com$" { server.document-root = "/var/www/example.com" accesslog.filename = "/var/log/lighttpd/example.com-access.log" server.error-handler-404 = "/index.php" }
将“error-handler-404”设置为“index.php”就足以让永久链接正常工作。 重新加载 lighttpd 服务。
service lighttpd force-reload
下载并安装 WordPress
在将 WordPress 下载到您的 VPS 之前,您将创建一个 MySQL 数据库和一个对该数据库具有权限的用户。
echo "CREATE DATABASE wordpress" | mysql -u root -p echo "GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost' IDENTIFIED BY 'S3cRet_pass'" | mysql -u root -p
将 wpuser 和 S3cRet_pass 替换为您自己的值。 下载最新版本的 WordPress。
wget http://wordpress.org/latest.tar.gz
提取虚拟主机的 document-root 内的文件。 您现在将在此位置拥有一个名为“wordpress”的目录。 将其重命名为您的域名称以匹配 server.document-root 指令的值。
cd /var/www tar -xf ~/latest.tar.gz mv wordpress example.com
将此目录中所有文件的所有权更改为“www-data”
chown www-data:www-data -R example.com/
打开浏览器,输入你的域名,完成WordPress的安装。 我们必须启用并选择一个永久链接结构。 但在此之前我们有一个问题要解决:WordPress 在启用永久链接之前会检查 Apache mod_rewrite,这将在 lighttpd 上失败。 所以我们必须强制 WordPress 启用永久链接。
创建一个“必须使用”插件目录。
mkdir /var/www/example.com/wp-content/mu-plugins
在里面创建一个文件
nano /var/www/example.com/wp-content/mu-plugins/rewrite.php
使用以下代码。
<?php add_filter( 'got_rewrite', '__return_true' );
结束 PHP 标记 ?>
已被故意省略。
登录到 wp-admin,导航到 设置 > 永久链接 并选择永久链接结构。
设置 W3 总缓存插件
在 lighttpd 中配置这个插件是不同的,因为 W3TC 只支持 Apache 和 Nginx,所以我们将手动进行大部分配置。 从 Plugins > Add New 安装此插件,激活它并在此处停止。 我们最初不会使用这个插件的选项页面来设置它。
编辑 lighttpd 配置文件并为 minification 和页面缓存添加重写指令。 附加配置将在 error-handler-404 之后进入虚拟主机块。
nano /etc/lighttpd/lighttpd.conf $HTTP["host"] =~ "(^|www\.)example.com$" { server.document-root = "/var/www/example.com" accesslog.filename = "/var/log/lighttpd/example.com-access.log" server.error-handler-404 = "/index.php" #Rewrite rules for minified files url.rewrite-if-not-file = ( "^/wp-content/cache/minify/(.+\.(css|js))$" => "/wp-content/plugins/w3-total-cache/pub/minify.php?file=$1" ) #Rewrite rules for page cache enhanced #This is to prevent page cache rules from messing up minify rules $HTTP["url"] !~ "(.+\.(css|js|xml|html))" { #Bypass cache if the request contains any of these cookies $HTTP["cookie"] !~ "(comment_author|wp\-postpass|w3tc_logged_out|wordpress_logged_in|wptouch_switch_toggle)" { #Bypass cache for POST requests $HTTP["request-method"] != "POST" { #Bypass cache if query string isn't empty $HTTP["querystring"] !~ "(.*)" { url.rewrite-if-not-file = ( "(.*)" => "/wp-content/cache/page_enhanced/example.com/$1/_index.html" ) } } } } }
将 /wp-content/cache/page_enhanced/example.com/$1/_index.html
路径中的 example.com 替换为您安装 WordPress 时使用的确切域。
保存文件并重新加载 lighttpd
service lighttpd force-reload
转到 WordPress 管理面板 (wp-admin),导航到 Plugins > Add New,搜索并安装插件。
激活插件并返回 SSH 控制台而不更改任何设置。
W3 Total Cache 插件的浏览器缓存模块从页面缓存和缩小缓存中创建压缩文件,这些文件将根据“Accept-Encoding”请求标头提供给用户。 但是 lighttpd 可以使用 mod_compress 模块即时压缩内容,因此我们将禁用此选项。
使用 sed 命令,查找和替换配置条目。
cd /var/www/example.com/ sed -i "s/'browsercache.cssjs.compression' => true/'browsercache.cssjs.compression' => false/" wp-content/w3tc-config/master.php sed -i "s/'browsercache.html.compression' => true/'browsercache.html.compression' => false/" wp-content/w3tc-config/master.php sed -i "s/'browsercache.other.compression' => true/'browsercache.other.compression' => false/" wp-content/w3tc-config/master.php sed -i "s/'browsercache.cssjs.compression' => true/'browsercache.cssjs.compression' => false/" wp-content/cache/config/master.php sed -i "s/'browsercache.html.compression' => true/'browsercache.html.compression' => false/" wp-content/cache/config/master.php sed -i "s/'browsercache.other.compression' => true/'browsercache.other.compression' => false/" wp-content/cache/config/master.php
缩小
众所周知,此选项会破坏主题和插件的设计,因此只有在您知道它适合您的情况下才使用它。 这篇文章使用了 TwentyThirteen 主题,它在缩小时效果很好。
在启用此选项之前,必须禁用“自动缩小测试”。 这是因为插件需要一组重写规则才能成功完成 Minify Auto 测试。 虽然我们可以尝试将它们转换为 lighttpd(来自 .htaccess 或 nginx.conf),但不值得花时间,因为即使没有这些测试,自动缩小也可以在站点上工作。
cd /var/www/example.com/ sed -i "s/'minify.auto.disable_filename_length_test' => false/'minify.auto.disable_filename_length_test' => true/" wp-content/w3tc-config/master.php sed -i "s/'minify.auto.disable_filename_length_test' => false/'minify.auto.disable_filename_length_test' => true/" wp-content/cache/config/master.php
回到 wp-admin 导航到 性能 > 常规设置 并启用缩小。
在浏览器上打开您的 WordPress 网站并查看'部分。 你会发现缩小的 CSS 和 JS 像这样:
<!DOCTYPE html> <!--[if IE 7]> <html class="ie ie7" lang="en-US"> <![endif]--> <!--[if IE 8]> <html class="ie ie8" lang="en-US"> <![endif]--> *** <html lang="en-US"> *** <head><link rel="stylesheet" type="text/css" href="http://example.com/wp-content/cache/minify/000000/M9AvKU_NK6ksycgsKklNzdNPy88rKdZPT81LLcpMzs8r1jFAV1FcUpmTCgA.css"media="all" /> <script type="text/javascript" src="http://example.com/wp-content/cache/minify/000000/M9bPKixNLarUMYYydHMz04sSS1L1cjPz4IJ6uYnF-XkgGihooF9SnppXUlmSkVlUkpqap59VrJ9WmpdckpmfVwwA.js"></script>
如果网站的设计看起来很糟糕,这可能意味着 lighttpd.conf
中的缩小重写规则不正确,或者您忘记重新加载 lighttpd。
页面缓存
页面缓存创建内容的静态 HTML 文件,并通过重写规则将它们提供给用户。 由于我们已经添加了重写规则,我们可以通过转到 wp-admin > Performance > General Settings 来启用页面缓存。
默认的 Page Cache Method 是 Disk: Enhanced 但是,如果您不小心将其更改为其他内容,则无法将其更改回来,因为此选项已禁用。
所以我们需要通过编辑文件来手动修改它。
cd /var/www/example.com sed -i "s/'pgcache.engine' => '\([a-z]\+\)'/'pgcache.engine' => 'file_generic'/" wp-content/w3tc-config/master.php sed -i "s/'pgcache.engine' => '\([a-z]\+\)'/'pgcache.engine' => 'file_generic'/" wp-content/cache/config/master.php
这将启用带有 磁盘增强 的页面缓存。 要测试它是否有效,请使用 curl
请求未缓存的页面。
# curl -v -s -o /dev/null http://example.com/about/ * About to connect() to example.com port 80 (#0) * Trying 1.1.1.1... connected > GET /about/ HTTP/1.1 > User-Agent: curl/7.23.1 > Host: example.com > Accept: */* > < HTTP/1.1 200 OK < Link: <http://example.com/?p=28>; rel=shortlink < Last-Modified: Tue, 05 Nov 2013 15:55:53 GMT < Vary: < X-Pingback: http://example.com/xmlrpc.php < Content-Type: text/html; charset=UTF-8 < Transfer-Encoding: chunked < Date: Tue, 05 Nov 2013 15:55:53 GMT < Server: lighttpd/1.4.31 < { [data not shown] * Connection #0 to host example.com left intact * Closing connection #0
再次执行相同的请求。
# curl -v -s -o /dev/null http://example.com/about/ * About to connect() to example.com port 80 (#0) * Trying 1.1.1.1... connected > GET /about/ HTTP/1.1 > User-Agent: curl/7.23.1 > Host: example.com > Accept: */* > < HTTP/1.1 200 OK < Vary: Accept-Encoding < Content-Type: text/html < Accept-Ranges: bytes < ETag: "94995388" < Last-Modified: Tue, 05 Nov 2013 15:55:53 GMT < Content-Length: 23659 < Date: Tue, 05 Nov 2013 15:55:55 GMT < Server: lighttpd/1.4.31 < { [data not shown] * Connection #0 to host example.com left intact * Closing connection #0
注意两个标题之间的区别。 第一个响应包含由 PHP 添加的标头 Link: 和 X-Pingback。 第二个响应纯粹是 HTML,所以它没有那些标题。 您还可以查看磁盘上的缓存页面。
root@wp-lighttpd:~# ls -lR /var/www/example.com/wp-content/cache/page_enhanced/www.example.com/ /var/www/example.com/wp-content/cache/page_enhanced/www.example.com/: total 12 drwxr-xr-x 2 www-data www-data 4096 Nov 5 21:25 about drwxr-xr-x 2 www-data www-data 4096 Nov 5 21:21 front-page drwxr-xr-x 2 www-data www-data 4096 Nov 5 21:23 sample-page /var/www/example.com/wp-content/cache/page_enhanced/www.example.com/about: total 24 -rw-r--r-- 1 www-data www-data 23659 Nov 5 21:25 _index.html /var/www/example.com/wp-content/cache/page_enhanced/www.example.com/front-page: total 28 -rw-r--r-- 1 www-data www-data 25100 Nov 5 21:21 _index.html /var/www/example.com/wp-content/cache/page_enhanced/www.example.com/sample-page: total 28 -rw-r--r-- 1 www-data www-data 25837 Nov 5 21:23 _index.html
要检查站点是否支持压缩,请使用 curl 的 –compressed 选项。
# curl -v -s -o /dev/null/ --compressed http://example.com/about/ * About to connect() to example.com port 80 (#0) * Trying 1.1.1.1... connected > GET /about/ HTTP/1.1 > User-Agent: curl/7.23.1 > Host: www.example.com > Accept: */* > Accept-Encoding: deflate, gzip > < HTTP/1.1 200 OK < Vary: Accept-Encoding < Content-Encoding: gzip < Last-Modified: Tue, 05 Nov 2013 15:55:53 GMT < ETag: "2062104151" < Content-Type: text/html < Accept-Ranges: bytes < Content-Length: 4819 < Date: Tue, 05 Nov 2013 16:01:03 GMT < Server: lighttpd/1.4.31 < { [data not shown] * Connection #0 to host www.example.com left intact * Closing connection #0
注意 Content-Length 和 Content-Encoding 标头:内容长度以前是 23659,但现在只有 4819。
浏览器缓存
这种类型的缓存告诉浏览器它可以在自己的缓存中保留对象(如图像、CSS 和 JS)多长时间。 这需要添加 Expires 和 Cache-Control 标头,这是使用 mod_expire
模块完成的。
启用此模块
lighttpd-enable-mod expire
并在虚拟主机中添加必要的配置。
nano /etc/lighttpd/lighttpd.conf
#Browser Cache $HTTP["cookie"] !~ "(wordpress_logged_in)" { $HTTP["url"] =~ "^/(.+\.(css|js|png|jpg|bmp|ico)\??.*)$" { expire.url = ( "" => "access plus 365 days" ) } }
在这个块中,我们首先检查用户是否没有登录,然后匹配具有提到的扩展名的文件。 您还可以在以“|”分隔的括号内添加更多扩展名。 重新加载 lighttpd
service lighttpd force-reload
并使用 curl 检查新的标题。
# curl -I example.com/wp-content/themes/twentythirteen/style.css HTTP/1.1 200 OK Expires: Wed, 05 Nov 2014 16:31:33 GMT Cache-Control: max-age=31536000 Content-Type: text/css Accept-Ranges: bytes ETag: "2905279475" Last-Modified: Thu, 24 Oct 2013 19:39:10 GMT Content-Length: 52290 Date: Tue, 05 Nov 2013 16:31:33 GMT Server: lighttpd/1.4.31
更新插件
此配置是在带有 W3 Total Cache 0.9.3 的 WordPress 3.7.1 上完成的,并且适用于这些。 将来对 W3 Total 缓存的任何更改都会更改重写目录结构的更新将破坏缩小和页面缓存(尽管后者不可见)。 因此,在升级此插件之前,请在 Ubuntu 12.10 映像上使用 WordPress 启动一个 droplet,安装 W3 Total Cache 并查看 .htaccess 文件以了解新的重写规则。
将它们迁移到 lighttpd 更容易。 目前 Apache 使用以下规则进行缩小
RewriteBase /wp-content/cache/minify/ RewriteRule ^(.+\.(css|js))$ ../../plugins/w3-total-cache/pub/minify.php?file=$1 [L]
在 lighttpd 中,这条规则变为
url.rewrite-final = ( "^/wp-content/cache/minify/(.+\.(css|js))$" => "/wp-content/plugins/w3-total-cache/pub/minify.php?file=$1" )
至于页面缓存 Apache 有
RewriteRule .* "/wp-content/cache/page_enhanced/%{HTTP_HOST}/%{REQUEST_URI}/_index.html" [L]
Lighttpd 不允许在重写位置使用服务器变量,因此我们对其进行了硬编码。
url.rewrite-if-not-file = ( "(.*)" => "/wp-content/cache/page_enhanced/example.com/$1/_index.html" )