阿里云搭建WordPress实录

很久之前就有自己建站的想法,但是一直在犹豫。这次终于下定决心买了一个顶级域名,又用学生优惠在阿里云买了一台轻量应用服务器。虽说国内的主机会有备案的要求,多一些步骤,但是毕竟价格优惠+访问速度快+不赶时间,所以还是选择了国内的机房。

第一次,我照着教程手动编译安装了LAMP,花了一晚上编译和安装,但不幸在配置HTTPS的时候把httpd搞坏了,自己又没有能力修理,无奈只好重置了系统。第二次,我试用了一下LNMP一键包,才发现它十分强大,不仅支持无人值守安装,就连更新组件,添加虚拟主机和部署HTTPS都是傻瓜式的,只需一行命令,很适合Linux小白。所以如果对于Linux不是特别的熟悉,建议使用LNMP一键包来减少工作量。下面我会罗列出几个遇到的问题和分别的解决方案(本文有些参数可能因机而异,请灵活变通)。

修改服务器主机名和SSH端口

阿里云的与主机安装CentOS后默认的主机名是一串随机字符,这使得强迫症(这是种病,得改)的人看了很不爽,遂修改之(这里new_hostname改成你想要的主机名)。

hostnamectl set-hostname new_hostname

另外,为了安全,最好修改一下SSH的端口。运行以下命令编辑配置文件:

nano /etc/ssh/sshd_config

找到#Port 22字样,在下面添加一行Port 2222(这里2222替换为你想要的端口),保存退出。运行以下命令 重启SSH服务即可生效:

systemctl restart sshd.service

如果无法访问,那可能是被阿里云的防火墙阻挡了,请前往控制面板打开相应端口。

切换到阿里云软件源

首先,运行以下命令备份原配置:

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

然后,下载阿里云的配置:

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

最后,重新生成缓存:

yum clean all
yum makecache

WordPress不能安装、不能下载主题和插件

这种情况我之前也遇到过,原因都是web目录的权限设置不当——没有把属主和属组设置为www(也有时候是daemon),导致web应用没有写入的权限。我们可以利用chmodchown命令解决这个问题。我使用了LNMP一键包,因此web根目录是/home/wwwroot/default,Nginx使用的用户和用户组是www:www,那么需要运行以下命令:

chmod -R 755 /home/wwwroot/default
chown -R www:www /home/wwwroot/default

另外值得一提的是,虽然权限设置错误时,WordPress会遇到各种问题,但PhpMyAdmin却依旧能正常运行,我猜测这是因为PhpMyAdmin的功能是操作数据库,并不需要写入目录,所以不受影响。

卸载阿里云盾和云监控

卸载阿里云盾:

wget http://update.aegis.aliyun.com/download/uninstall.sh && chmod +x uninstall.sh && ./uninstall.sh
wget http://update.aegis.aliyun.com/download/quartz_uninstall.sh && chmod +x quartz_uninstall.sh && ./quartz_uninstall.sh
pkill aliyun-service
rm -fr /etc/init.d/agentwatch /usr/sbin/aliyun-service
rm -rf /usr/local/aegis*
iptables -I INPUT -s 140.205.201.0/28 -j DROP
iptables -I INPUT -s 140.205.201.16/29 -j DROP
iptables -I INPUT -s 140.205.201.32/28 -j DROP
iptables -I INPUT -s 140.205.225.192/29 -j DROP
iptables -I INPUT -s 140.205.225.200/30 -j DROP
iptables -I INPUT -s 140.205.225.184/29 -j DROP
iptables -I INPUT -s 140.205.225.183/32 -j DROP
iptables -I INPUT -s 140.205.225.206/32 -j DROP
iptables -I INPUT -s 140.205.225.205/32 -j DROP
iptables -I INPUT -s 140.205.225.195/32 -j DROP
iptables -I INPUT -s 140.205.225.204/32 -j DROP

卸载云监控(不建议,卸载后将无法在管理面板查看内存和硬盘信息):

/usr/local/cloudmonitor/wrapper/bin/cloudmonitor.sh stop
/usr/local/cloudmonitor/wrapper/bin/cloudmonitor.sh remove && \
rm -rf /usr/local/cloudmonitor

exec()被禁用

如果在安装插件时,出现exec()函数被禁用的提示,只需要编辑php.ini,找到disable_functions,去掉exec,重启Nginx即可。

更新失败。错误信息:此响应不是合法的JSON响应。

一切妥当,想要写一篇文章测试一下,却发现无法保存草稿,也无法提交。WordPress报错:“更新失败。错误信息:此响应不是合法的JSON响应。”

根据这篇文章的解释,我需要配置Nginx的伪静态。但是在LNMP的脚本中,伪静态只能在添加虚拟主机(vhost)时设置,由于备案还未完成,我的WordPress暂时使用了默认主机(default server)。所以稍微研究了一下Nginx的配置文件规则。

稍稍阅读Nginx的配置文件,发现虚拟主机和默认主机的配置其实是非常的相似,都是server {...}的格式。我的理解,就是虚拟主机就是默认主机之外的web服务器,可以设置不同的web根目录、不同的域名过滤条件、不同的端口、不同的SSL证书之类的;因为都在同一个Nginx里面,是虚拟出来的,所以叫虚拟主机。

参考这篇文章,可以发现只要在默认主机的配置里面加一个include来引用LNMP自带的WordPress规则就可以实现默认主机的伪静态。我顺便看了一下rewrite/wordpress.conf这个规则,发现里面只有短短几行:

location / {
	try_files $uri $uri/ /index.php?$args;
}

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

所以我就干脆把这几行直接复制到了Nginx配置文件中,重启Nginx,发现WordPress不报错了。问题解决!

那么伪静态是什么?知乎上已经解释得很白话了,这里就不再赘述。

添加HTTPS支持、设置自动跳转

过了大概两个礼拜,网站终于通过了ICP备案,可以通过域名访问了,我开始配置SSL证书。SSL证书的话我选择的是免费的Let’s Encrypt证书,支持自动签发,LNMP支持全自动配置。但是这有一个前提,就是你的服务器的80端口能够通过域名访问(这是为了证明服务器和域名确实是你的)。因为备案通过前服务器不能用域名访问,所以部署HTTPS也得在备案后进行。

备案通过后我就开始部署HTTPS。首先利用LNMP脚本创建虚拟主机:

lnmp vhost add

在接下来的向导中,domain一栏我写了www.tomzhu.sitemore domain name一栏我写了tomzhu.site。Nginx能够通过HTTP Header中的信息判断出请求的域名,并以此选择匹配的主机来响应。我这样填写,是因为我希望带有www和不带www的请求都可以访问WordPress。接下来的几项按照截图填写即可:

添加虚拟主机

这里的Rewrite Rules其实就是include了之前我们复制到主配置文件的那些rewrite/wordpress.conf的规则。这次我们让LNMP自动引用规则就行了,不需要自己去include或者复制了。最后我们看到LNMP已经准备好了,按下任意按键就会开始自动申请SSL证书并部署。

很快虚拟主机就部署好了,我们这个时候需要把/home/wwwroot/default里的所有文件(注意,需要排除.user.ini这个文件)复制到/home/wwwroot/www.tomzhu.site中。

另外,我还希望HTTP能够自动跳转到HTTPS,请求域名不带www能够自动加上www。所以我对Nginx主配置文件(nginx.conf)和虚拟主机配置文件(vhost/www.tomzhu.site.conf)进行了如下修改。

在 Nginx主配置文件(nginx.conf) 中找到唯一的server {}片段,在最后加上一句:

rewrite ^(.*)$ https://www.tomzhu.site/$1 permanent;

如果一个请求不匹配任何虚拟主机的条件(比如用IP访问),它就会被默认主机处理。这个语句意思就是直接跳转到https://www.tomzhu.site/

再来到虚拟主机配置文件(vhost/www.tomzhu.site.conf),找到第一个server {}片段,从listen 80可以看出这是HTTP协议的虚拟主机,在最后加上一句:

rewrite ^(.*)$ https://www.tomzhu.site/$1 permanent;

与上面的情况相似,这个语句能够把所有HTTP请求重定向到HTTPS上,也就是所说的强制HTTPS。

最后,找到第二个server {}片段,从listen 443 ssl可以看出这是HTTPS协议的虚拟主机(Nginx如何判断一个主机是HTTP还是HTTPS?请参照官方文档),在最后加上一句:

if ($host != 'www.tomzhu.site' ){ 
    rewrite ^/(.*)$  https://www.tomzhu.site/$1  permanent;
}

这个语句检查请求的域名,如果不带www,就会重定向到带有www的域名上来,也就是自动添加www。

保险起见,最后重启一下Nginx。 最后一步,打开WordPress->设置->常规,设置一下URL。

关于Nginx中各个主机的优先级,可以阅读这篇文章