背景
本人因为在用LNMP环境搭建WordPress博客时遇到了很多坑,本着记录下来回忆和给他人解忧的心态写下这篇博客.
LNMP环境
LNMP环境指的是Linux+Nginx+MySQL+PHP.这环境是大多数小型服务器,个人网站的模板.
这环境既可以通过云服务器商提供的免费服务镜像获得,也可以自己手动搭建.
手动搭建过程可以参考腾讯云官方指导:基于 CentOS 搭建 WordPress 个人博客
阿里云的也可以,这看个人
本人的Linux版本是CentOS7.5 64位,博客里的CentOS版本为6.8(之所以遇到那么多坑和版本相关甚密)
搭建过程中遇到的问题如下:
Nginx 环境
在CentOS 7.5下下载的Nginx 是1.12.2版本,教程所下载的Nginx是1.10.2版本
位置问题
Nginx1.12.2 没有default.conf.
而1.10.2版本的default.conf是放在/etc/nginx/conf.d下,并且有着默认的值.
配置内容问题
在Nginx1.12.2中nginx.conf中的内容多了如下这部分
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
Load configuration files for the default server block.
include /etc/nginx/default.d/**.conf; location / {
} error_page 404 /404.html;
location = /40x.html {
} error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
这段代码声明了一个默认的server,本意是想着安装之后可以看到Nginx的默认跳转页面,可是如果安装教程上的在conf.d中加入wordpress.conf就会报错,报的是启动错误,多个server占用80端口.
这是因为之前默认server是在conf.d中的default.conf中书写的,教程中会让你把默认的default.conf改成default.conf.bak,这样include /ect/nginx/conf.d/*.conf就不会引入default.conf.bak了.
但是在新版的nginx中你必须去掉nginx.conf多出来这段默认server声明才能正确运行.
PS: 这个问题并不会在nginx -t -c nginx.conf(检查配置文件是否配置正确,-c后为配置文件路径)中检查出来,因为语法是没问题的,只有运行起来才会发现.
MySQL 环境
啊啊啊啊…MySQL环境是最多坑的,因为MySQL更新到8之后很多以前的东西都废弃了或者换成另一种形式.
关于CentOS下载MySQL
因为在CentOS 7之后就不再提供MySQL的默认下载包了,yum里面是不能直接下载MySQL的.
只能通过自己装yum源才能下载,这里具体我就不细讲了,到时会专门拉一个专题讲MySQL的坑.
这里是我找到的一个解决方案
WordPress连接数据库时出错(根本原因是密码不正确)
-
因为在MySQL5.7.9时加强了密码验证机制,初始的密码会有诸多限制,例如需要有大小写英文字母,数字,特殊符号等,因为是自己的博客用,便不想设置那么高强度的密码.下面时调低密码强度的方法.
进入MySQL
查看密码校验参数 : show variables like ‘%validate%’;
需要根据自己显示的变量名来更改,例如有些时validate_password__length.
下面介绍下各个变量的含义:
-
validate_password.check_user_name 检查用户名
-
dictionary_file 插件用于验证密码强度的字典文件路径。
-
length 密码最小长度,参数默认为8,它有最小值的限制,最小值为:number_count + special_char_count + (2 * mixed_case_count)
-
mixed_case_count 大写字母和小写字母包含的个数
-
number_count 数字数量
-
special_char_count 特殊字符数量
-
policy 密码强度检查等级,0/LOW、1/MEDIUM、2/STRONG。有以下取值:
Policy Tests Performed
0 or LOW Length1 or MEDIUM Length; numeric, lowercase/uppercase, and special characters
2 or STRONG Length; numeric, lowercase/uppercase, and special characters; dictionary file
默认是1,即MEDIUM,所以刚开始设置的密码必须符合长度,且必须含有数字,小写或大写字母,特殊字符。
修改参数配置
mysql> set global validate_password.policy = 0; Query OK, 0 rows affected (0.05 sec) mysql> set global validate_password.mixed_case_count = 0; Query OK, 0 rows affected (0.00 sec) mysql> set global validate_password.special_char_count=0; Query OK, 0 rows affected (0.00 sec) mysql> set global validate_password.number_count = 3; Query OK, 0 rows affected (0.00 sec) mysql> set global validate_password.length = 3; Query OK, 0 rows affected (0.00 sec) mysql> show variables like '%validate%'; +--------------------------------------+-------+ | Variable_name | Value | +--------------------------------------+-------+ | validate_password.check_user_name | ON | | validate_password.dictionary_file | | | validate_password.length | 3 | | validate_password.mixed_case_count | 0 | | validate_password.number_count | 3 | | validate_password.policy | LOW | | validate_password.special_char_count | 0 | +--------------------------------------+-------+ 7 rows in set (0.00 sec)
-
-
修改密码
修改密码也有个大坑,这个大坑卡了我好几个小时.那时WordPress显示连接不上数据库,我以为服务没起来,看了一下发现一切正常,用命令行进入数据库也没问题,就僵住了.
最后才发现,是因为WordPress用配置文件里的账号密码连数据库时会用MySQL的密码形式加密密码,但我设置密码的时候设置的是明文.(命令行进数据库时加不加密都能进,真是日狗了)
这需要重新设置密码
MySQL 6.7设置密码
set password for 'username'@'localhost' = password('yourpassowrd');
MySQL 8设置密码
alter user 'username'@'localhost' identified with mysql_native_password by 'yourpassword'
**注意一下这里必须加with mysql_native_password **不然就会出现我上面出现的情况,写在配置文件里的密码不能通过校验.
关于运行时MySQL总是自动关闭问题
在装好所有环境并搭好WordPress后,总会出现MySQL自动关闭的问题,重启时会报不能从mysql.sock的连接MySQL.
后来一查错误日志
2018-09-23T11:37:46.830631Z 0 [ERROR] [MY-012681] [InnoDB] InnoDB: mmap(137428992 bytes) failed; errno 12 2018-09-23T11:37:46.830703Z 1 [ERROR] [MY-012956] [InnoDB] InnoDB: Cannot allocate memory for the buffer pool 2018-09-23T11:37:46.830726Z 1 [ERROR] [MY-012930] [InnoDB] InnoDB: Plugin initialization aborted with error Generic error. 2018-09-23T11:37:46.830755Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine 2018-09-23T11:37:46.830880Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed. 2018-09-23T11:37:46.830908Z 0 [ERROR] [MY-010119] [Server] Aborting
[InnoDB] InnoDB: Cannot allocate memory for the buffer pool内存不够…
我的服务器是个学生服务器,1核1G的最小型.第一次遇见内存不够引发的问题.
解决方案:
-
废话,用钱砸啊,扩大容量,上8核32G,就不会有这种问题了.能用钱解决的问题就不是问题!(想上那张"就是干"的大爷图,没找着).但都用学生服务器了,那就是没钱嘛,别拆穿别拆穿.
-
第二种方法就是操作系统里说的虚拟内存,割硬盘的一部分作内存,速度嘛肯定会低,但只能留下没钱的眼泪了.操作如下:参考博客
-
创建交换分区的文件
#dd if=/dev/zero of=/mnt/swap bs=block_size count=number_of_block
注:block_size、number_of_block 大小可以自定义,比如bs=1M count=1024 代表设置1G大小swap分区
-
设置交换分区文件
mkswap /mnt/swap
-
启用交换
swapon /mnt/swap
如果在/etc/rc.local中有swapoff -a 需要修改为swapon -a
-
设置开机自启
需要修改文件/etc/fstab中的swap行。
添加 /mnt/swap swap swap defaults 0 0
注:/mnt/swap 路径可以修改,可以根据创建的swap文件具体路径来配置。
设置后可以执行free -m命令查看效果
-
-
当然也有降低InnoDB引擎的缓冲区大小,限制MySQL的最大连接数还有Nginx优化等方法,也在参考博客里有,可自行查看.
PHP环境
php环境没遇到啥,感动常在.