PHP7.0+Apache2.4.18+Ubuntu16.04环境适配方案技术问询
适配Ubuntu 16.04 + PHP7.0-FPM + Apache2.4.18的WordPress缓存全栈配置
我刚帮客户搞定过几乎一模一样的环境部署,那些针对PHP5.x、Apache2.3或Ubuntu14.04的老文档真的坑人——PHP7.0和Apache2.4.18在FastCGI联动、扩展兼容上有不少细节变化,直接套用旧方案要么报错要么完全不生效。下面是我亲测可行的完整步骤,每一步都针对你的环境做了适配:
一、先搞定Apache2与PHP7.0-FPM的正确联动
这是很多旧方案失效的核心,Apache2.4.18对FastCGI的配置逻辑和旧版本不一样:
- 启用必需的Apache模块:
sudo a2enmod proxy proxy_fcgi setenvif sudo a2enconf php7.0-fpm - 检查并更新WordPress站点的虚拟主机配置,替换掉旧的
mod_php规则,确保PHP请求正确转发到FPM:<FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost/" </FilesMatch> - 重启服务让配置生效:
sudo systemctl restart apache2 php7.0-fpm
二、Redis配置(数据库查询缓存+对象缓存)
PHP7.0不能用旧的php5-redis包,必须用适配的版本:
- 安装Redis服务器和PHP7.0兼容的Redis扩展:
sudo apt-get install redis-server php7.0-redis - 配置WordPress对象缓存:
- 获取兼容PHP7.0的Redis对象缓存核心文件(对应Redis Cache插件2.0.x版本分支),上传到
/var/www/html/wp-content/目录下,命名为object-cache.php。 - 编辑
wp-config.php添加Redis配置:define('WP_REDIS_HOST', '127.0.0.1'); define('WP_REDIS_PORT', 6379); define('WP_REDIS_DATABASE', 0); // 给WordPress单独分配一个Redis数据库,避免和其他应用冲突 define('WP_CACHE', true);
- 获取兼容PHP7.0的Redis对象缓存核心文件(对应Redis Cache插件2.0.x版本分支),上传到
- 数据库查询缓存优化:
推荐使用Redis Cache插件(选2.0.x版本,兼容PHP7.0)的查询缓存功能,它会自动把WordPress的重复MySQL查询缓存到Redis里,替代已经废弃的MySQL查询缓存。
三、Memcached后端加速(用于PHP会话存储)
注意:PHP7.0已经废弃了旧的memcache扩展,必须用memcached扩展:
- 安装Memcached服务器和PHP7.0兼容的扩展:
sudo apt-get install memcached php7.0-memcached - 配置PHP-FPM使用Memcached存储会话:
- 编辑
/etc/php/7.0/fpm/php.ini,修改以下参数:session.save_handler = memcached session.save_path = "127.0.0.1:11211" - 重启PHP-FPM生效:
sudo systemctl restart php7.0-fpm
- 编辑
四、Varnish 4.x反向代理配置(适配Apache2.4.18)
Ubuntu16.04默认的Varnish是4.1版本,刚好适配你的环境:
- 安装Varnish:
sudo apt-get install varnish - 调整端口,让Varnish监听80端口,Apache监听8080端口:
- 编辑
/etc/default/varnish,修改DAEMON_OPTS里的监听端口为80:DAEMON_OPTS="-a :80 \ -T localhost:6082 \ -f /etc/varnish/default.vcl \ -S /etc/varnish/secret \ -s malloc,256m" - 编辑
/etc/apache2/ports.conf,把Listen 80改成Listen 8080,同时修改WordPress站点的虚拟主机配置,把<VirtualHost *:80>改成<VirtualHost *:8080>。
- 编辑
- 配置Varnish的
default.vcl,适配WordPress的缓存规则:backend default { .host = "127.0.0.1"; .port = "8080"; } sub vcl_recv { # 跳过WordPress后台和登录页面的缓存 if (req.url ~ "^/wp-admin/" || req.url ~ "^/wp-login.php") { return (pass); } # 缓存静态资源(图片、CSS、JS等) if (req.url ~ "\.(png|gif|jpg|jpeg|css|js|ico|svg)$") { set req.ttl = 1d; return (hash); } # 清理不必要的Cookie,避免缓存失效 if (req.http.Cookie) { set req.http.Cookie = ";" + req.http.Cookie; set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";"); # 只保留WordPress必需的Cookie set req.http.Cookie = regsuball(req.http.Cookie, ";(wp_[a-f0-9]+|wordpress_logged_in_[a-f0-9]+|comment_author_[a-f0-9]+)", "; \1"); set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", ""); set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", ""); if (req.http.Cookie == "") { unset req.http.Cookie; } } } sub vcl_backend_response { # 给静态资源设置长缓存时间 if (bereq.url ~ "\.(png|gif|jpg|jpeg|css|js|ico|svg)$") { set beresp.ttl = 1d; } # 后台和登录页面不缓存 if (bereq.url ~ "^/wp-admin/" || bereq.url ~ "^/wp-login.php") { set beresp.ttl = 0s; return (deliver); } } - 重启所有服务让配置生效:
sudo systemctl restart apache2 varnish
五、验证配置是否生效
- Redis缓存:执行
redis-cli info stats,查看keyspace_hits和keyspace_misses数值,访问WordPress页面后这两个数值应该会变化,说明缓存正在工作。 - Memcached:执行
echo "stats" | nc 127.0.0.1 11211,查看curr_items等数值,登录WordPress后数值应该增加,说明会话存储正常。 - Varnish:执行
curl -I http://你的域名,查看响应头里的X-Varnish和Age字段,如果Age大于0,说明静态内容已经被Varnish缓存。
内容的提问来源于stack exchange,提问作者Arpita Singh
相关产品推荐
相关产品推荐

