wordpress搭建和优化Centos+LNMP
由于更新需要,需要把旧有的网站重新搭建,我选择了最新的服务器软件版本和流行的网站优化技术。基于阿里云ECS Centos 7.5,nigix,MariaDB, PHP搭建wordpress程序,并且优化了缓存memcached,并使用了opcache优化php加载。优化后速度有很大提升
1.更新操作系统
首先用ssh登陆服务器并执行yum update更新系统
升级命令:yum update
2.安装LNMP基础环境
LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RHEL/Fedora/Aliyun/Amazon Linux、Debian/Ubuntu/Raspbian/Deepin/Mint Linux VPS或独立主机安装LNMP(Nginx/MySQL/PHP)、LNMPA(Nginx/MySQL/PHP/Apache)、LAMP(Apache/MySQL/PHP)生产环境的Shell程序。
支持自定义Nginx、PHP编译参数及网站和数据库目录、支持生成Let’seEcrypt免费证书及自备证书、LNMP模式支持多PHP版本、支持单独安装Nginx/MySQL/MariaDB/Pureftpd服务器、支持无人值守安装,同时提供一些实用的辅助工具如:虚拟主机管理、FTP用户管理、Nginx/MySQL/MariaDB/PHP/PHPMyAdmin的升级、常用缓存组件Redis/Xcache等的安装、重置MySQL root密码、502自动重启、日志切割、SSH防护DenyHosts/Fail2Ban、备份等许多实用脚本。
官网lnmp.org,可以查看安装说明。
我选择安装LNMP ,LNMP无人值守命令生成器https://lnmp.org/auto.html
由于是wordpress应用,所以勾选不启用InnoDB,MyISAM引擎最适合。
各软件版本尽量使用最高版本,毕竟更新迭代提升了性能。
内存分配器选择jemalloc性能优异,使用其内存优化管理程序。
2.1 内存不足的问题
安装过程中,如果报错:
Memory less than 1GB, can't install MySQL 5.6+ or MairaDB 10+!
这是因为该一键安装脚本会自动检测你的服务器内存大小,并且要求系统可用最小内存不低于1GB,你可以尝试删掉该一键安装包中 lnmp1.5/include/main.sh 文件的第62~65行内容:
if [[ "${DBSelect}" =~ ^[345789]$ ]] && [ `free -m | grep Mem | awk '{print $2}'` -le 1024 ]; then
echo "Memory less than 1GB, can't install MySQL 5.6+ or MairaDB 10+!"
exit 1
fi
然后创建一个交换分区(用作虚拟内存,CentOS 7默认情况下并没有创建交换分区),依次执行以下命令(需使用root用户执行):
fallocate -l 2G /swapfile # 创建一个2GB大小的文件,用作交换分区
chmod 600 /swapfile # 修改文件权限,只允许root用户读写操作
mkswap /swapfile # 创建交换分区
swapon /swapfile # 激活/启用该交换分区
swapon -s # 查看交换分区是否生效
free -m # 查看内存使用情况
最后重新安装lnmp。
安装完成后,如果你不想保留该交换分区,可以使用以下命令进行清除:
swapoff /swapfile # 释放交换分区
rm -f /swapfile # 删除上述用作交换分区的文件
2.2 PureFtpd安装
cd lnmp1.5
./pureftpd.sh
使用lnmp ftp edit 编辑功能修改pureftp默认目录。
2.3 LNMP添加虚拟主机、FTP、数据库、伪静态
参考https://lnmp.org/faq/lnmp-vhost-add-howto.html
Nginx虚拟默认主机配置
/usr/local/nginx/conf/nginx.conf 注释server块。虽然只有一个网站,但我还是配置了虚拟主机配置,nginx.conf 后面有代码include vhost/*conf加载网站配置。
nginx检查配置 /usr/local/nginx/sbin/nginx -t
nginx修改配置后重载 /usr/local/nginx/sbin/nginx -s reload
3.上传wordpress网站程序
网站程序上传到wwwroot目录后,执行以下。
对网站目录进行权限设置 ,
目录以及目录下的文件授权
chown -R 755 /home/wwwroot
将目录的所有者分给www组下的www用户。
chown -R www:www /home/wwwroot/
4.PHP缓存加速
缓存操作码(opcode)
Opcode,PHP编译后的中间文件,缓存给用户访问
当客户端请求一个PHP程序时,服务器的PHP引擎会解析该PHP程序,并将其编译为特定的操作码文件,该文件是执行PHP代码后的一种二进制文件表现形式。默认情况下,这个编译好的操作码文件由PHP引擎执行后丢弃;而操作码缓存的原理就是将编译后的操作码保存下来,并放入到共享内存里,以便再下一次调用该PHP页面时重用它,避免了相同代码的重复编译。节省了PHP引擎重复编译的时间,降低了服务器负载,同时减少了CPU和内存的开销.
参考文章让PHP7达到最高性能的几个提示http://www.laruence.com/2015/12/04/3086.html
4.1 Opcache
编辑php.ini
[opcache]
zend_extension=opcache.so
;启用Zend Optimizer优化开关
opcache.enable=1
opcache.enable_cli=1
;共享内存的大小, 总共能够存储多少预编译的 PHP 代码(单位:MB)
opcache.memory_consumption=64
;暂存池中字符串的占内存总量.(单位:MB)
opcache.interned_strings_buffer=4
;最大缓存的文件数目 200 到 100000 之间
opcache.max_accelerated_files=10000
;2s检查一次文件更新 注意:0是一直检查不是关闭
opcache.revalidate_freq=7200
opcache.validate_timestamps=1
;是否保存文件/函数的注释 如果apigen、Doctrine、 ZF2、 PHPUnit需要文件注释,推荐 0
opcache.save_comments=0
; 让Opcache把opcode缓存缓存到外部文件中
opcache.file_cache=/tmp
最后,让配置生效,重新加载php-fpm。
service php-fpm restart
4.2 opcache常用配置说明
;开关打开
opcache.enable=1
;开启CLI
opcache.enable_cli=1
;可用内存, 酌情而定, 单位为:Mb
opcache.memory_consumption=528
;Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB)
opcache.interned_strings_buffer=8
;对多缓存文件限制, 命中率不到 100% 的话, 可以试着提高这个值
opcache.max_accelerated_files=10000
;Opcache 会在一定时间内去检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 定位为秒
opcache.revalidate_freq=1
;打开快速关闭, 打开这个在PHP Request Shutdown的时候回收内存的速度会提高
opcache.fast_shutdown=1
;检查脚本时间戳是否有更新的周期,以秒为单位。设置为 0 会导致针对每个请求, OPcache 都会检查脚本更新。
opcache.revalidate_freq=0
;开启源文件时间戳验证
;如果启用,那么 OPcache 会每隔 opcache.revalidate_freq 设定的秒数 检查脚本是否更新。
;如果禁用此选项,你必须使用 opcache_reset() 或者 opcache_invalidate() 函数来手动重置 OPcache,也可以 通过重启 Web 服务器来使文件系统更改生效。
opcache.validate_timestamps=1
注意:如果设置opcache的opcache.validate_timestamps的指令设成0,那么zend opcache就察觉不到PHP脚本的变化,我们必须手动清空zend opcache缓存的字节码,让他发现php脚本的变动.这个设置适合在生产环境中设置成0,在开发环境下最好还是设置成1.
我们可以这样配置,启用自动重新验证缓存功能:
opcache.validate_timestamps=1
opcache.revalidate_freq=0
视具体生产环境来设定opcache.revalidate_freq值,倘若php代码很少变动,建议该值设置的大一些,可减少opcahce由于检查php文件变动而带来的额外开销,比如7200
关于Opcache file cache
开启Opcache File Cache(实验性), 通过开启这个, 我们可以让Opcache把opcode缓存缓存到外部文件中, 对于一些脚本, 会有很明显的性能提升.
在php.ini中加入:
opcache.file_cache=/tmp
这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件, 可以跨PHP生命周期存在。
4.3 使用新的编译器
使用新一点的编译器, 推荐GCC 4.8以上, 因为只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能提升(Wordpres的QPS角度衡量)
其实GCC 4.8以前的版本也支持, 但是我们发现它支持的有Bug, 所以必须是4.8以上的版本才会开启这个特性.
4.5 Opcache file cache
开启Opcache File Cache(实验性), 通过开启这个, 我们可以让Opcache把opcode缓存缓存到外部文件中, 对于一些脚本, 会有很明显的性能提升.在php.ini中加入:
opcache.file_cache=/tmp
这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件, 可以跨PHP生命周期存在.
5.Memcached安装配置(不建议)
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。
1、安装memcached和memcache php扩展。
进入lnmp解压后的目录,执行:./addons.sh install memcached
可以根据自己的需求选择php-memcache或php-memcached扩展,目前discuz x使用的是前者,功能上php-memcached更强大一些。
建议选择php-memcached,然后自动安装memcached php扩展和memcached。
2、安装wordpress插件
需要你的服务器支持,就是你的 PHP 需要安装上 Memcached 相关的扩展,注意 PHP 有两个扩展:PHP Memcache 扩展 和 PHP Memcached 扩展,两者仅仅相差一个字母 D,你可以通过 phpinfo() 这个 PHP 函数来检测,你安装的是哪个扩展。或者通过进程查看。
根据不同的 PHP 扩展下载不同的 WordPress Memcached 插件(这个很重要): PHP Memcache 扩展:http://wordpress.org/extend/plugins/memcached/ PHP
因为上面安装的Memcached,所以我的wordpress选择Memcached 扩展插件:https://wordpress.org/plugins/memcached-is-your-friend/
6.Memcached监控面板
从官方下载探针:
http://pecl.php.net/get/memcache-3.0.8.tgz
解压后,里面有一个 memcache.php 文件,编辑并找到如下代码:
define('ADMIN_USERNAME','memcache'); // Admin Username
define('ADMIN_PASSWORD','password'); // Admin Password
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);
$MEMCACHE_SERVERS[] = 'mymemcache-server1:11211'; // add more as an array
$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
修改如下:
define('ADMIN_USERNAME','memcache'); // Admin Username 登录名称,自行修改
define('ADMIN_PASSWORD','password'); // Admin Password 登录密码,自行修改
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);
//下面是定义memcached服务器,一般我们是单机部署,所以注释掉一行,并将服务器地址根据实际修改,比如本文是127.0.0.1
$MEMCACHE_SERVERS[] = '127.0.0.1:11211'; // add more as an array
//$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
上传到网站私密目录(临时测试可以放到根目录),然后通过前台访问 memcache.php 这个文件,输入上面的用户名和密码即可看到 memcached 状态
7.WP Super Cache设置
安装 WP Super Cache插件,在高级页面启用专家模式。
勾选 使用对象缓存系统来存储缓存文件。 (实验室功能)
勾选后使用memcached缓存,如果不用memcached则不需要。
1.WP Super Cache有两种缓存机制
WP Super Cache 设置->内容里面,点击列出所有已缓存的文件网页会刷新出一个显示框,里面有“最新的 WP-Cached 文件”和“最新的 Super Cached 文件”。之前以为都是没有什么区别,或者说没弄明白有什么区别。
经过一番研究终于搞明白,WP Super Cache缓存的内容有两种,一种是对已知用户的,一种是对未知用户的。这两种缓存文件放置的位置和格式都不相同。
WP Super Cache 缓存机制有两种,WP Cache 和 Super Cache。
WP Cache 缓存时,会在你的“wordpress 安装文件夹/wp-content/cache/”文件夹下生成一系列wp-cache-xxxxxx.php格式的文件。而且,每个不同的已知用户即使他们访问同一个页面,都为单独的为他们缓存一个新的文件,因为他们的昵称、邮箱、网址是不同的;
当你一个访问者来的你的站点,他没有登录或者也没有留言,这样他得到是一个在 WordPress cache 文件夹下的 supercache 子文件夹下的纯静态文件,其实你都可以自己到上面的 supercache 目录下去查看同样的永久链接的 HTML 文件的备份。
如果要判断一个页面是否已经被缓存了,在页面中右键查看该页面的源代码,最后一行会有“Cached page generated by WP-Super-Cache+缓存时间”这行字。
2.WP Super Cache高级设置杂项中的两个设置的作用
“不要为已知用户缓存”的作用。「勾选」
明显,不勾选管理员后台无法登录。也就是说登录用户或已评论用户,不缓存,每次都能得到最新页面。
“让已知用户匿名使他们浏览的内容是缓存文件”的作用。
开启CDN缓存HTML文件后,缓存期内,谁第一个访问一个页面,后来者显示的都是他打开后显示的页面。而产生这个问题的原因,就是WordPress会记住评论者的信息,这些人就成为了WP Super Cache中的已知用户,他们在打开文章的时候,会自动填上昵称、邮箱等内容。而勾选了这个选项之后,这些已知用户访问页面的时候,会强制匿名,让他们也成为未知用户。
8.配置文件
LNMP相关配置文件位置
Nginx主配置(默认虚拟主机)文件:/usr/local/nginx/conf/nginx.conf
添加的虚拟主机配置文件:/usr/local/nginx/conf/vhost/域名.confMySQL
配置文件:/etc/my.cnfPHP
配置文件:/usr/local/php/etc/php.iniphp-fpm
配置文件:/usr/local/php/etc/php-fpm.conf
PureFtpd配置文件:/usr/local/pureftpd/pure-ftpd.conf 1.3及更高版本:/usr/local/pureftpd/etc/pure-ftpd.conf
PureFtpd MySQL配置文件:/usr/local/pureftpd/pureftpd-mysql.conf
Proftpd配置文件:/usr/local/proftpd/etc/proftpd.conf 1.2及之前版本为/usr/local/proftpd/proftpd.conf
Proftpd 用户配置文件:/usr/local/proftpd/etc/vhost/用户名.confRedis 配置文件:/usr/local/redis/etc/redis.conf
9.信息面板
memcached面板 见前文
phpinfo信息 lnmp安装后在/home/wwwroot/default下面
opcache面板 lnmp安装后在/home/wwwroot/default下面
PHP探针 lnmp安装后在/home/wwwroot/default下面
PhpMyAdmin可以下载中文版到网站根目录
10、lnmp升级
lnmp所有相关配置
https://github.com/licess/lnmp
https://lnmp.org/
wget http://soft.vpser.net/lnmp/lnmp1.6beta.tar.gz -cO lnmp1.6beta.tar.gz && tar zxf lnmp1.6beta.tar.gz && cd lnmp1.6
nginx升级
cd lnmp1.6 && ./upgrade.sh nginx
然后按提示输入要升级的Nginx版本号,Nginx的版本号可以从http://nginx.org/en/download.html查询。输入版本号后回车,再次回车确认即可开始安装
升级php注意:升级php后,需要重新配置php.ini里面的opcache配置。
2018-11-30 xinyuan