众所周知,Wordpress以其臃肿丰富的功能而著称,但是这也导致了访问页面时需要大量读取数据库,拖慢加载进度,所以作为祖传缓存工具的Memcached就不得不装了。
但是! 网上一众教程要么早就过时,要么互相抄袭,害得我整整折腾了一天才装上。
这篇文章用来记录一下安装时踩到的坑,顺便写一个完整能用的教程。
- 序
首先明确一下安装的顺序:
- 安装lib-event
- 编译安装Memcached
- 配置启动Memcached
- 编译安装libmemcached依赖库
- 编译安装memcached-php扩展
- 修改php.ini配置文件
- 在Wordpress中启用
如果在安装时遇到任何问题可以跳到最后的问题排查部分查看,如果没有请上网检索。
- 安装Lib-event
#查看系统是否已经安装libevent
rpm -qa|grep libevent
#如果有,先删除再编译安装
yum -y remove libevent
#编译安装libevent
wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
tar -zxvf libevent-2.1.12-stable.tar.gz
cd libevent-2.1.12
./configure --prefix=/usr/local/libevent
make -j4 && make test && make install
#安装libevent-devel
yum install -y libevent-devel
- 编译安装Memcached
wget http://www.memcached.org/files/memcached-1.6.10.tar.gz
tar -zxvf memcached-1.6.10.tar.gz
cd memcached-1.6.10
./configure --prefix=/usr/local/memcached/
make -j4 && make install
#"-j4"请调整为你的服务器CPU核心数
- 配置memcached
前往/etc/sysconfig目录中,新建一个文件,命名为memcached,编辑其内容,填入以下参数
PORT="11211"
#memcached监听的端口
USER="root"
#运行memcached的用户
MAXCONN="1024"
#最大连接数
CACHESIZE="128"
#最大内存,不推荐小于64
OPTIONS=""
#其他参数,请参考官方文档
随后前往之前下载的Memcached源码文件夹,找到scripts文件夹中的 memcached.sysv 文件,将其重命名为memcached 并复制到 /etc/init.d 文件夹中。
随后编辑此文件,在其中找到下列代码(大约在第33行的位置)并对其进行更改。
#原来是这样的
chown $USER /var/run/memcached
daemon memcached -d -p $PORT -u $USER -m $CACHESIZE -c $MAXCONN -P /var/run/memcached/memcached.pid $OPTIONS
#请改成这样
chown $USER /usr/local/memcached/bin/memcached
daemon /usr/local/memcached/bin/memcached -d -p $PORT -u $USER -m $CACHESIZE -c $MAXCONN -P /var/run/memcached/memcached.pid $OPTIONS
随后使用以下命令启动Memcached并设置开机自启动
#重载systemd服务,我忘了命令是啥了所以直接重启服务器
reboot
#启动
systemctl start memcached
systemctl enable memcached
#查看状态
systemctl status memcached
请注意,如果担心遭遇DDOS攻击或者出于某种原因关闭了防火墙,可以在配置文件的 OPTIONS 字段里加入以下代码
OPTIONS="-l 127.0.0.1 -U 0"
#仅允许本地连接
- 编译安装libmemcached依赖库
这是坑最多的一部分,请务必按照以下教程进行,如有问题请在评论区提出。
首先请明确自己的编译环境,GCC版本推荐升级到最新,以下是我的环境
GCC版本:10.2.0
GCC编译配置为:/root/gcc-10.2.0/configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
服务器系统:Centos7,内核为5.10.2-BBR
确认环境后我们来编译安装,依次执行以下命令
cd /root
wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar -zxvf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --prefix=/usr/local/libmemcached --with-memcached=/usr/local/memcached/bin/memcached
make -j4 && make test && make install
此时如果你发现提示了这样一个错误
...
CXX memflush.o 不能比较指针与整数的值
...
make[1]: *** [clients/memflush.o] Error 1
这是libmemcached一个bug,原因是GCC的新版本调整了语法,最简单解决方法如下:
将 clients/memflush.cc 中 42和52 行的 opt_servers == false 改为 opt_servers == NULL
或者你也可以自己改写一下他的 temp 指针的声明,不过很容易改坏掉所以不推荐。
然后重新编译,不出意外的话虽然会一片一片的弹warning出来,但是可以完成编译了。
- 编译安装Memcached-PHP扩展
cd /root
wget https://pecl.php.net/get/memcached-3.1.5.tgz
tar -zxvf memcached-3.1.5.tgz
cd memcached-3.0.3
/usr/bin/phpize
#用 phpize 命令生成 configure 配置文件
./configure --with-php-config=/usr/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached
#请将php-config和libmemcached的目录换为你自己的安装目录
make -j4 && make test && make install
需要注意的是,根据每个人PHP的安装方式的不同,phpize 文件的位置也不同,如果你不知道 phpize 文件到底在哪,可以使用以下命令来查找,上面的 php-config 文件也是同理。
whereis phpize
#示例输出:phpize:/usr/bin/phpize /usr/share/man/man1/phpize.1.gz
#加粗部分即为phpize的路径
编译全部结束后会输出 memcached.so 这个文件安装的位置,请检查这个路径,如果你发现这个目录并不是php扩展的正确目录,请将memcached.so文件复制到你的php扩展文件夹。
- 修改PHP.ini文件
php.ini 文件通常位于 /etc 目录下,在你完成以上所有步骤后请在这个文件末尾加上这样一句:
extension=memcached.so
随后请重启你的php服务和nginx服务
systemctl reload php-fpm
systemctl restart php-fpm
systemctl restart ngnix
接下来就需要在Wordpress中启用服务了
- 在Wordpress中启用memcached
wordpress其实原生已经支持一个名为 wp_object() 的函数,所以不需要安装任何插件,只需要将一个 object-cache.php的文件放入wp-content 目录里就可以了,我这里提供一个自己修改过的版本,当然你也可以去网上下载其他人编写的版本。
如果你需要检查一下memcached是否已经安装并启用成功,可以安装一个名为 WPJAM-Basic 的插件,转到”系统信息”选项卡,如果看到有一个 Memcached 标签,则说明已经启动成功。
以下是一张启动成功后的Memcached状态截图
- 问题排查
如果我在WPJAM-Basic里看不到Memcached怎么办?
- 检查你的Memcached服务是否已经正常运行
- 检查你的PHP扩展是否已经正确安装(可通过php_info查看)
- 检查你下载的object_cache.php是否适配,文件是否上传到了正确的目录。
- 如果修改了Memcached的运行端口,需要手动修改object_cache.php中的配置
在编译时遇到报错,提示缺少某个依赖库(如zlib等)
yum install https://centos7.iuscommunity.org/ius-release.rpm -y
#安装一个公认不错的yum源
yum update
#升级现有软件包
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel \
libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel \
zlib zlib-devel glibc glibc-devel glib2 glib2-devel \
bzip2 bzip2-devel ncurses ncurses-devel \
curl curl-devel e2fsprogs e2fsprogs-devel \
krb5 krb5-devel libidn libidn-devel \
openssl openssl-devel openldap openldap-devel \
nss_ldap openldap-clients openldap-servers gd gd2 \
gd-devel gd2-devel perl-CPAN pcre-devel
#一股脑把所有可能用到的依赖包全部装上
如果还有问题,欢迎在评论区提出(虽然我也可能解决不了,说实话这玩意挺玄学的)
完