搭建LEMP的全过程

By | February 8, 2018

本次任务需要搭建centos 7 + nginx + mysql + php-fpm 这一架构,同时进行性能优化来运行 wordpress。

安装 nginx + ngx_pagespeed

  1. 安装编译所需要的依赖

  2. 下载 nginx 以及 ngx_pagespeed 并进行安装

    到了这一步:

  3. 输入 nginx 的编译选项

    之后会有几次选择,都填 yes/y 就是了。

  4. 安装完成

  5. 创建 nginx 运行用户

  6. 新建系统启动初始化脚本

  7. 对 nginx 运行环境的设置

  8. 对 nginx 配置文件进行必要的修改:vim /etc/nginx/nginx.conf
    • 打开 user 指令的注释并將值修改为 nginx。
    • 打开 pid 的注释并修改为 /run/nginx.pid。
    • 將域名 server_name 指令的值改为绑定的域名。
    • 由于现时要访问的是 nginx 的缺省页面,所以要把不必要的都注释掉。
  9. 放开防火墙的端口
    • 80 端口:

    • 443 端口(接下来用得上):
    • 443 端口(接下来用得上):

  10. 使用开放的端口永久生效:

  11. 现时禁用一下 ngx_pagespeed 模块,到优化阶段再打开:在 http 块中加入 pagespeed off; 一行。
  12. 启动 nginx 服务:

  13. 让 nginx 服务开机自启动:

nginx 以及 nginx 模块 ngx_pagespeed 安装完成。

安装 php-fpm

  1. 配置 yum 仓库

  2. 安装 php 及其模块

安装 mysql 5.6

因为可用的系统资源少,所以就选了 5.6 社区版本的 mysql。
1. 安装软件库

  1. 查看现时的本地仓库

执行结果:

  1. 执行安装 mysql 5.6

配置 mysql

  1. 启动 mysql:

  2. 开机启动 mysql:

  3. mysql 设置向导:

    执行结果:

  4. 然后试登录 mysql:

    enter password: 输入先前设定的密码登录

  5. 登录成功之后在 mysql shell 执行’show variables like ‘%char%’;’ 获取数据库相关的编码信息:

    由上面的执行结果可以看到有两项编码为 latin1,这显然不支持我们的中文,所以要配置一下 mysql 使之变成 utf-8 编码。

  6. 修改 mysql 的配置文件以支持中文
    追加以下内容到 /etc/my.cnf 文件

    重启 mysql

  7. 登录 mysql,再次查询编码信息:

    这时的结果为:

    这就达到了目的。
    至此,mysql 已经配置完成。

配置 php-fpm

我们还要配置 php-fpm 才能使其正常运行

打开 /etc/php-fpm.d/www.conf 文件,并按以下要求编辑:

  1. 首先將 user 和 group 两个设置项的值设为 nginx。
    原来的配置:

    配置后:

  2. 取消以下项的注释符:

  3. 重启 php-fpm,并开机启动

mysql 配置完成。
接下来是 nginx 的配置:

配置 nginx

nginx 配置文件位于 /etc/nginx/nginx.conf

  1. nginx 关于 php 的配置:
    在 http 块中加上:

  2. 测试 php-fpm
    为了证明 php-fpm 是否运行正常,在 server 块中加入以下内容:

    • 递归新建 /www/test 目录:mkdir -p /www/test
    • 在 test 目录下新建 index.php 文件,并且添加以下内容:

    • 修改 /www/test 目录及其里面文件的属主,和相关的 selinux 上下文。

      重启 nginx

    • 访问域名,如果打开的是 php 的配置信息页面,就表示 php-fpm 正常工作 。

部署 wordpress

首先需要建立好数据库以及访问数据库的用户名和密码。

建立数据库并赋予 wp 程序访问的权限

  1. 登录 mysql,进入 mysql shell。
  2. 创建数据库

  3. 创建用户

  4. 赋予权限

  5. 刷新权限

wordpress 数据库的配置完成。

下载最新版本的 wordpress

解压及更改网站根目录的位置

配置 nginx 以访问 wordpress

我们使用 nginx 官网上的配置(访问 https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/)

重启 nginx。

访问域名。如果转向到的是 /wp-admin/setup-config.php 这个 wp 的配置页面,表示 nginx 配置成功。

安装 wordpress

  1. 选择网站后台所用的语言,这也可能会影响到前台页面的语言,由模版决定。至于为什么我要选择英文,那就是我的事了,想学多点单词而已,英语学好对学好编程很重要。
  2. 点击“let’s go!”按钮,开始配置数据库信息。
  3. 填入上一步设置的数据库信息
  4. 如果第 3 步填入了正确的数据库地址、名称和密码,那么就会到这一步。点击“run the installation”开始 wp 的数据库初始化,并会在网站根目录生成 wp-config.php 文件,此文件是 wp 的配置文件,所有数据库信息都会在这个文件中。
  5. 设置网站信息,最后一项填的是是否允许搜索引擎或者爬虫爬取网站上的东西。一般不勾选,表示允许搜索引擎收录。
  6. 出现这个信息表示 wordpress 安装并初始化成功,点击“log in”就导航到网站后台登录页面。
  7. 在登录页面中输入用户名和密码即可登录管理后台。
    管理后台长这样:

由于这次任务是迁移原博客到新服务器,所以已经有了在旧服务器中写好的日志,并且导出到文件中,现在只须导入即可。那么怎样导入?请看:

导入旧日志

路径:dashboard -> tools -> import -> wordpress -> install now -> run importer ,进入 import wordpress 页面,这里上传旧 wp 导出的日志等东西。


这里的最大文件大小是2mb,其实可以在php的配置文件 /etc/php.ini 中把这个值设置为更大,我就设为 50mb:

修改完重启一下 php-fpm:systemctl restart php-fpm,然后刷新页面。发现最大文件大小变为 0 了,好,现在选择文件并上传。这种文件后缀是 .xml。

到这步点“submit”就可以了。

我却出现了下图的这种情况,应该是刚才没有选择当前已有用户的原因。

暂且看看对导入的数据有没有影响。

目前看起来没什么问题。

设置永久链接(permalink)

坐标:settings -> permalink
我喜欢將它设置为日志的 id加上 .html,像这样:

然后点“save changes”。

设置时区

坐标: setting -> general -> timezone ,因为在中国,所以选择东八区。

lemp 架构上 wordpress 的基本部署至此完成。

安装新主题

然后安装一款自己喜欢的主题,我喜欢比较大气简洁的那一类,例如 iconic-one 这个,就以这个为例。

坐标: appearance -> themes -> add new ,然后搜索 iconic-one。

  1. 安装
    安装:把鼠标移上查找到的主题微略图上面,然后点击“install”。

  2. 激活(更换为此款主题),点击“active”。

    然后是安装插件,插件系统是 wordpress 最为重要的一个方面,有很多很多好用的插件,安装插件和安装主题类似,都有两种方式,一是在管理后台,一是登录服务器下载到服务器本地相应的文件夹。这里有我用的一些插件:

至于插件怎样用,其实挺简单的,不懂的就问搜索引擎,以后我可能会写一些关于插件用法的博文。

复制旧服务器与日志相关的图片和附件等

把文件和目录复制到新服务器就可以了,再修改下属主和selinux 上下文,但要保证能读写。

接下来增加 https 访问

https 增强网站安全

目标:

运用 certbot 工具自动部署 nginx 的 https,因为 https 免费证书有有效期,所以要设置自动更新证书。
为了使 https 更具安全性,这里要配置 hsts,也即“http严格传输安全”。还有前向安全性(可能在 certbot 安装证书时已经默认开启)、ocsp装订、启用 hpkp(即http公钥固定扩展)。

安装 certbot

  1. 准备工作:
    • 安装 pip:

    • 升级一下 pip:

  2. 安装 certbot:pip install certbot-nginx --upgrade

安装 https 证书:

执行命令:

直到出现以下的消息打印在屏幕上就表示成功安装 https 证书了:

先到 https://www.ssllabs.com/ssltest/ 测试一下 ssl 的安全性和进行评分。然后以 http 协议访问一下网站,看看是否跳转到 htttps。

增强 https 的安全性

  1. 配置 hsts:將add_header strict-transport-security "max-age=31536000;includesubdomains";这个语句加入到 server 块中。
  2. 前向安全性:已经默认配置好了。
  3. 启用 ocsp 装订:
    • 生成证书链文件:

    • 配置 nginx ,在 https 块中添加:

  4. 配置hpkp
    hpkp 要生成三个指纹:
    步骤一:
    第一个指纹:

    得到指纹:1xh16wmcwsbfosmeb/ufcsr0latbk024xewial43kxc=
    步骤二:

    步骤三:
    生成第二个指纹:

    得到第二个指纹:sfh1btmheodncg38cu35fcvmv/eeo5nky69i8zgyzy4=
    生成第三个指纹:

    得到第三个指纹:sfh1btmheodncg38cu35fcvmv/eeo5nky69i8zgyzy4=
    编辑 nginx 的配置文件 /etc/nginx/nginx.conf :

  5. 重启 nginx 服务。

https 部署完毕。

对 lemp 进行性能调优

首先,是 mysql 因为 mysql 占用过多的系统资源

优化 mysql

编辑 /etc/my.cnf 文件,并追加以下内容:

优化前(内存按占用空间的大小倒序排列):
优化前
优化后:
优化后

优化 php-fpm

其实优化 php-fpm 就是减少工作进程数目以及优化生成工作进程的机制,还有一个方法就是增加内存,这里就增加虚拟内存。
编辑 /etc/php-fpm.d/www.conf 文件,修改或者追加以下内容:

修改 /etc/php-fpm.conf 文件:

优化 php-fpm 之虚拟内存

  1. 创建文件:touch /var/swap.img
  2. 填充:dd if=/dev/zero of=/swapfile bs=1m count=2048
  3. 格式化为 swap 分区:mkswap /var/swap.img
  4. 启用 swap 分区:swapon /var/swap.img
  5. 查看 swap 分区:swapon --show
    执行结果:

    由于优先级为 -1,所以要改变其优先级。

    执行结果:

  6. 將这个 swap 分区配置为开机启动。

  7. 权衡物理内在与 swap,设为 50%

    执行结果:

    虚拟内存设置完毕。

优化 php (/etc/php.ini)

opcache 是一个缓存 php 预编译码的模块,它可以很好很容易地提升 php 的性能,只要经由它缓存,就不必再访问代码文件再次进行预编译。

  1. 安装 opcache 模块:yum -y install php72w-opcache
  2. 配置 opcache:

重启 php-fpm 进程,出现错误,不能启动。
错误日志中有以下片段:

新建 /var/opcache 目录,并且保证可读写:

重启 php-fpm 进程。

php 优化完成。

重头戏:

优化 nginx 之 ngx_pagespeed 模块

在 server 块中加入以下内容作为 pagespeed 的配置内容:

优化 nginx 之 gzip

优化 nginx

编辑 /etc/nginx/nginx.conf 文件:

nginx + mysql + php-fpm 的性能调优就至此结束。

接下来是 wordpress 的优化,当然是通过缓存插件。

通过 wp-ffpc 插件实现页面静态化

即是把所有要把前台访问的页面都缓存为静态文件,并且保存到内存。

应用 memcached 来提升 wordpress 的性能

  1. 安装 memcached

  2. 修改 memcached 的配置文件 /etc/sysconfig/memcached 以提高其缓存性能:

  3. 安装 php 的 pecl memcached 模块:yum install -y php-memcached
  4. 安装 pecl memcache 扩展模块:

  5. 將扩展的动态文件名添加到 /etc/php.ini 文件中:extension=memcache.so
  6. 重启 php-fpm 进程
    这里要特别感谢这两位网友的贡献:
    > 在centos7中部署php7.1及开启mysql扩展
    > centos 下编译安装memcache

直接从内存中取出静态页面

这里有三个需要的 nginx 配置文件。

  1. wpffpc.conf

  1. wpnocache.conf

  1. wpsecure.conf

感谢这位网友的慷慨奉献:nginx wordpress + wp-ffpc plugin setup + ngx_pagespeed
修改 nginx 配置文件 /etc/nginx/nginx.conf :

重启 nginx 进程。
完成 lemp 配置,并且得到一定的优化效果,网页的访问响应时间为毫秒级别。

memcached 配置成功后显示的后端状态是以下这样的,否则就是配置不成功(如果打开 selinux 的 enforcing 模式,则需要相应的上下文设置,否则用不了。对于此,本人还没有研究出来):
driver: memcached
backend status:
127.0.0.1:11211 => up & running

还有 wp-ffpc 插件的配置挺简单的,其本不用改太多的默认值,只需要將那几个默认值为 300 的缓存过期时间改为 0,然后选择缓存失效的触发条件(cache invalidation method),我选的是“modified post and all related taxonomies”这个,再而在 “precache & precache log“ 标签选择“预缓存计划”(precache schedule)的时间,按需设置。然后保存设置,再清除已有的缓存(clear cache),最后进行预缓存(pre-cache)。

created on: 2018/02/04

要在这里声明一点:在这个部署的过程中,本人从网上搜索了大量的资料,这些资料数量庞大,东拼西凑成了这篇实践性很强的文章。那些增加或者修改的配置文件内容,有网上很多博客作者的功劳,由于本人自己都无法保证哪些是原创,哪些是借鉴(抄袭?),所以并没有將相关原文的作者和出处贴出来。

本人对那些在网上无私贡献着高质量博客文章的作者表示尊敬和崇拜。

如果您觉得本文中有对您和您的组织有任何侵权的地方,请联系本人!

本人的联系方式:admin@navinxu.com


© 2018 – 2019, Navin. All rights reserved.

鉴于本人的相关知识储备以及能力有限,本博客的观点或者描述如有错漏或是有考虑不周到的地方还请多多包涵,也欢迎指正,一起学习,共同进步。

0