如何在VPS上搭建WordPress博客网站(史上最全图文教程)
由于现在很多人仍然使用共享主机,所以我决定写这篇教程,教你如何设置自己的虚拟专用服务器(VPS),以便为启动一个 WordPress 网站准备好所有必要的服务。
为什么共享托管不是最好的选择?
- 你的 WordPress 网站必须与其他用户争夺服务器资源;
- 你无法自己加速网站;
- 你不能自定义一些安全策略。
共享主机为你提供了一个基本的仪表盘,来对域名、网站、邮件等进行设置,提供这种服务的托管公司包括: WP Engine、Flywheel、SiteGround、Kinsta 等等,他们确保你的网站经过优化和更新,因此你可以高枕无忧。
但是,如果在 VPS 上搭建 WordPress 网站,那么你可以了解成功运行 WordPress 网站所需的整个流程。然后,你还能学到如何设置和优化,从 Linux(操作系统)到 Nginx(Web服务器)再到 FTP(以及更安全的SFTP)、SSH、数据库等等,最后你将学习如何设置 HTTPS、优化资源和整体安全性。
在 VPS 上启动 WordPress 网站的 12 个步骤
1、注册域名
2、准备 SSH 和 SFTP 客户端
3、购买 VPS
4、配置域名 DNS
5、连接 VPS
6、安装 WordPress
7、安装 PHP
8、安装 MySQL
9、安装 Nginx
10、安装 SSL 证书
11、启动 WordPress 网站
12、最后的安全设置
1、注册域名
为了让访客更方便地找到和识别你的网站,你需要给网站绑定一个域名。我建议使用最受欢迎的GoDaddy 来注册域名,这是全球最大的域名注册商,目前管理着超过 7500 万个域名。
注册域名很简单,但是要找到一个令人满意的结果可能需要很长时间,如果你在这方面遇到了麻烦,请查看我的这篇文章:怎样挑选域名。
2、准备 SSH 和 SFTP 客户端
为了与 VPS 进行通信,首先需要准备 SSH 和 SFTP 客户端。SSH 客户端可以用来处理与 VPS 相关的所有工作,包括查看信息、系统升级、安装软件、安全配置、权限管理等等;SFTP 客户端则主要用来上传/下载目录和文件。
2.1、SSH 客户端
我推荐的 SSH 客户端是 Termius ,这是一个跨平台的软件,可以在 Windows、macOS、Linux、iOS、Android 系统中运行。转到官方网站,注册一个账号即可免费使用:
这是一款广受赞誉的跨平台软件,在各大应用商店都获得了极高的评价,高级版的价格为 $6.99/月,或者 $59.88/年,提供更多功能,包括:
- 多设备之间数据同步
- SFTP
- 密码粘贴
- 代码自动完成
- 代理转发
- 代码片段
- 以及更多…
对于大部分人来说,免费版的功能已经绰绰有余。但如果预算允许,那么高级版会为你节省大量敲键盘的时间。
2.2、SFTP 客户端
SFTP 客户端我建议使用免费开源的 FileZilla ,这也是一款跨平台软件,兼容 Windows、macOS、Linux 系统,或者你也可以下载源代码,自行编译安装。
请将 Termius 和 FileZilla 安装在自己的电脑中,我们进入下一步。
3、购买 VPS
市场上充斥着大量的 VPS 托管商,为了让你的选择变得更加简单,我已经挑选出了一些最好的选项,其中 Hostwinds 和 Vultr 支持支付宝付款。
在这篇文章中,我以 Hostwinds 为例,转到 官方网站,查看他们提供的非管理型 VPS 托管套餐:
最便宜的计划只需 $4.49/月,但需要注意的是,这是首次购买价格,续费价格稍微要贵一些,为 $4.99/月,不过这仍然非常便宜。我们选择最便宜的套餐,然后点击绿色的 ORDER 按钮注册账号:
Hostwinds 提供 30 天退款保证,并承诺高达 99.9999% 的正常运行时间。输入姓名、邮箱和密码之后,点击 Submit 按钮完成注册,这时候会转到订单确认页面
请根据自己的实际情况进行填写,主要注意以下几个地方:
- Country:国家,中国大陆用户选择 China
- Operating System:操作系统,选择 CentOS 7
- Payment Information:付款方式,根据自己的需要进行选择,值得一提的是,你可以使用支付宝付款
- 默认勾上的附加服务,全部取消勾选
确认所有信息填写正确之后,勾上页面底部的 I have read and agree to the Terms of Service and Privacy Policy,然后点击 Complete Order 按钮完成付款,成功之后的页面是这样的:
点击 Continue To Client Area 按钮进入仪表盘:
仪表盘首页列出了刚才购买的 VPS,点击列表右侧的 Manage 按钮可以查看详细信息。这个时候,你应该收到了 Hostwinds 发送的欢迎邮件,里面也列出了 VPS 的详细信息。如下图所示,左侧是仪表盘信息,右侧是邮件内容:
从图中我们可以看到,VPS 的 IP 地址是 23.254.164.198,现在我们使用 Ping 命令检测这个 IP 地址能够连通:
按住 Windows + R 键调出运行命令,然后输入 cmd:
按回车键,在弹出的命令行窗口中输入以下命令:
ping 23.254.164.198
如图所示,结果中出现 来自 23.254.164.198 的回复 信息表示网络没有问题,少量的 请求超时 并没有什么大碍。
如果IP地址无法连通,那么你可以在 Hostwinds 的控制面板中更换 IP:
4、配置域名 DNS
你可以在 Hostwinds 仪表盘或欢迎邮件中找到域名的 Nameserver 信息,例如,我的两个Nameserver 分别是:
- mdns7.hostwindsdns.com
- mdns8.hostwindsdns.com
现在,我们转到域名注册商处修改 DNS,如果你在我推荐的 GoDaddy 注册了域名,那么请打开菜单 主页 → 域名:
找到你要修改的域名,点击旁边的 …,然后在弹出菜单中选择 管理 DNS:
域名服务器类型改成自定义,然后按照 Hostwinds 提供的 Nameserver 来配置 DNS:
确认无误之后,点击 保存 按钮。然后转到 Hostwinds 仪表盘,点击菜单 Domains → Manage DNS:
在新打开的页面中,点击屏幕底部的 + Domain 按钮:
输入你注册的域名,在这个示例中,我们使用 xiaobei-demo.com,添加完之后,状态显示为 Pending。不要担心,这是因为修改域名 DNS 之后,需要一段时间才能正式生效,一般几个小时即可,最长不会超过 48 小时。如果你比较着急,可以选择域名列表右侧的 Action 菜单,点击 Check 按钮来检查一下:
幸运的话,DNS 记录可能已经生效,域名状态也变成 Active。我们继续选择域名列表右侧的 Action 菜单,点击 Record 按钮进行一些设置:
只需要输入两条记录即可,如下图所示:
完成之后,你的页面应该类似于这样:
现在,我们已经设置好了 DNS,域名和 IP 地址的对应关系也已经建立。需要注意的是,这个设置需要一段时间才能正式生效。接下来,我们将远程连接到 VPS,安装一些特定的软件以启动网站。
5、连接 VPS
首先获取 VPS 的连接信息,你可以在 Hostwinds 发送的邮件中找到:
或者 Hostwinds 的仪表盘中:
打开我们前面第二步安装的 SSH 客户端 Termius,选择菜单 Hosts,然后点击 NEW HOST 按钮以添加主机:
在新打开的侧边栏中,需要填写以下信息:
- Label:主机名称,可以随便填写,我们填写的是 Hostwinds
- Address:主机IP地址,我们的是 23.254.164.198
- SSH开关:打开
- Username:SSH 用户名,填写 root
- Password:SSH 密码,我们的是 mCcV7DUEPMN8
填写完成,并保存之后,双击即可连接。首次连接时,Termius 会弹出确认提示框,点击 Yes 即可。
然后就与 VPS 连接成功:
现在,我们打开 SFTP 客户端 FileZilla,点击左上角的 站点管理器 图标来添加主机:
按照下图所示进行填写:
填写完成之后点击 连接 按钮,这时候 FileZilla 会弹出确认提示框,点击确认,然后与 VPS 连接成功。下图左侧是本地电脑的目录结构,右侧是 VPS 的目录结构:
6、安装WordPress
现在,我们已经与 VPS 建立了连接。由于托管商提供的主机系统非常精简,缺少很多应用程序,所以我们先要安装一些基础框架,以便后续程序能够良好运行。
转到 Termius,输入以下命令安装基础框架。
yum -y install pcre-devel zlib-devel flex bison ncurses libncurses-dev ncurses-devel mysql-devel gdb wget gcc unzip patch libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel mysql pcre-devel curl-devel libxslt-devel openssl openssl-devel
你可以直接复制粘贴,在 Termius 中是这样的:
输入完之后按回车键,VPS 会自动下载/更新基础框架,这个过程可能需要几分钟,完成之后的界面是这样的:
接下来,我们在根目录创建一个文件夹 /wordpress,执行以下命令:
mkdir /wordpress
或者,你可以转到 FileZilla,切换到根目录下,直接右键,点击创建目录:
创建完成之后,我们可以通过 FileZilla 看到新增的目录,如果你没有看到,那么请右键点击刷新:
回到 Termius,我们执行命令进入目录 /wordpress 中:
cd /wordpress
现在我们要下载 WordPress,打开官方网站,查看下面 .tar.gz 文件的下载链接:https://wordpress.org/latest.tar.gz
在 Termius 中执行以下命令:
wget https://wordpress.org/latest.tar.gz
现在你的 Termius 应该类似于这样:
输入完命令之后,按回车键,一般几秒钟就可以下载完成。这是一个压缩包,现在执行以下命令将其解压:
tar zxvf latest.tar.gz
现在你的 Termius 应该类似于这样:
解压很快就可以完成,我们现在得到了一个 wordpress 文件夹,执行以下命令将其重命名为 xiaobei-demo.com(你修改成自己的域名):
mv wordpress xiaobei-demo.com
现在你的 Termius 应该类似于这样:
转到 FileZilla,我们可以直观地查看一下目录结构:
到这一步,WordPress 已经安装完成了,但是现在还无法运行。为了使其运行,我们还要安装 PHP 环境。
7、安装 PHP
打开 PHP 官方网站: http://php.net/
我们看到最新的版本是 7.3.2,但在我们的测试中,这个版本有点问题,所以选择更为稳定的 7.2.15。转到 Termius,执行以下命令切换到 /wordpress 目录,然后下载 PHP:
cd /wordpress
wget http://php.net/distributions/php-7.2.15.tar.gz
解压文件,然后切换到 /wordpress/php-7.2.15 目录:
tar zxvf php-7.2.15.tar.gz
cd php-7.2.15
由于我们下载的是源代码文件,所以需要进行编译安装,下面的命令是在安装之前做一些检查。需要注意的是,这其实是一条命令,你应该全部复制下来,然后粘贴到 Termius 上执行:
./configure --prefix=/usr/local/php \
--with-curl \
--with-freetype-dir \
--with-gd \
--with-gettext \
--with-iconv-dir \
--with-kerberos \
--with-libdir=lib64 \
--with-libxml-dir \
--with-mysqli \
--with-openssl \
--with-pcre-regex \
--with-pdo-mysql \
--with-pdo-sqlite \
--with-pear \
--with-png-dir \
--with-xmlrpc \
--with-xsl \
--with-zlib \
--enable-fpm \
--enable-bcmath \
--enable-libxml \
--enable-inline-optimization \
--enable-gd-native-ttf \
--enable-mbregex \
--enable-mbstring \
--enable-opcache \
--enable-pcntl \
--enable-shmop \
--enable-soap \
--enable-sockets \
--enable-sysvsem \
--enable-xml \
--enable-zip
大约一分钟之后,./configure 命令执行完毕,成功之后的界面应该是这样的,会打印出 License 信息:
现在我们开始安装 PHP,这个过程需要很长时间,可能会超过 10 分钟,请耐心等待。执行以下命令安装:
make && make install
在安装的过程中,你很可能会遇到下面的错误:
请不要担心,这个错误是指系统的内存不足。出现这个问题其实很好理解,因为前面我们购买的是最便宜的 VPS,内存一共只有 1GB,编译安装PHP是一件对内存消耗很大的任务。解决这个问题很简单,只需要增加一些虚拟内存即可,执行以下命令查看系统的虚拟内存:
free -m
从图中可以看到,我们的虚拟内存(Swap)是 0:
执行下面4条命令来创建1GB的虚拟内存:
fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
对于大部分 CentOS 7 系统来说,这个增加虚拟内存的命令都能执行成功。但是,仍然有些架构不一样的 VPS 可能执行失败,出现下面这样的错误:
如果不幸你也遇到了这个错误,那么只需执行下面的命令来重新创建:
dd if=/dev/zero of=/swapfile count=1024 bs=1MiB
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
执行成功之后的界面应该如下所示:
再次执行下面的命令查看系统内存:
free -m
可以看到,我们已经成功创建了 1GB 的虚拟内存(Swap):
接下来,我们继续安装 PHP,首先进入目录 /wordpress/php-7.2.15,然后执行安装操作。现在,你可以放心地休息一下,或者去喝杯茶了,因为安装过程通常会超过 10 分钟 ?
cd /wordpress/php-7.2.15
make && make install
经过漫长的等待之后,PHP 终于安装好了,安装成功的界面应该是这样的:
执行下面几条命令,将 PHP 的配置文件拷贝到系统目录中:
cp php.ini-development /usr/local/php/lib/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
现在,我们要将 PHP 添加到全局环境变量中,执行下面的命令修改 /etc/profile 文件:
vi /etc/profile
注意将输入法切换为英文,然后按住键盘上的 ↓(或Shift+G)键滚动到文件底部,然后按 i 键进入编辑状态,在文件最后面追加以下内容:
export PATH="/usr/local/php/bin:$PATH"
这时候你的SSH界面看起来应该是这样的:
再按键盘上的 Esc 键退出编辑模式,然后输入以下命令保存文件:
:wq
SSH 界面示例:
执行命令使得刚才的配置生效:
source /etc/profile
现在 PHP 已经安装成功,并且配置完毕,执行下面的命令就可以将其启动:
sudo /usr/local/php/sbin/php-fpm
PHP 启动之后会在后台运行,并占用 9000 端口,我们输入下面的命令来确认一下:
netstat -ant | grep 9000
从下图可以看到,9000 端口确实在使用中,这说明 PHP 运行正常:
现在,PHP 已经顺利启动,但我们还差一个步骤,那就是让它开机自动运行。首先输入以下命令来编辑 /etc/rc.local 文件:
vi /etc/rc.local
在文件末尾添加 PHP 的启动命令:
sudo /usr/local/php/sbin/php-fpm
SSH 界面示例:
完成之后,按键盘上的 Esc 键退出编辑模式,然后输入以下命令保存文件:
:wq
最后一步,执行下面的命令使得 /etc/rc.local 拥有执行权限:
chmod +x /etc/rc.local
这是一项艰巨的任务,很高兴你已经顺利完成。接下来,我们将安装 MySQL 数据库,这是 WordPress 网站存储数据的地方。
8、安装 MySQL
打开MySQL官方网站,滚动到页面下方,查看仓库中的最新版本:
你可以点击列表右侧的 Download 按钮来获得下载链接,但这需要注册账号并登录。实际上,还有一种更简单的方法,上图中最新的rpm文件是 mysql80-community-release-el7-2.noarch.rpm,按照以往的经验,这个文件的下载链接应该就是:https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm
依次执行下面的 4 条命令,注意:# 符号表示这一行是解释说明,不是命令语句:
# 进入 /wordpress 目录
cd /wordpress
# 下载mysql源安装包
wget https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm
# 安装mysql源
yum -y localinstall mysql80-community-release-el7-2.noarch.rpm
# 安装MySQL
yum -y install mysql-community-server
大概几分钟之后,MySQL 就安装好了,SSH 界面应该类似于这样:
执行下面的 3 条命令,让 MySQL 可以开机启动,并立即启动 MySQL 服务:
# 开机启动
systemctl enable mysqld
systemctl daemon-reload
# 启动MySQL服务
systemctl start mysqld
MySQL 已经启动,并且生成了一个超级用户 root(以及临时密码),我们需要使用 root 用户登录数据库,以便做一些操作。临时密码在日志文件中,我们可以执行下面的命令查看文件最后 50 行,来获得临时密码:
tail -n 50 /var/log/mysqld.log
SSH界面示例:
从上图可以看到,root 用户的临时密码是 /fSi(UG?J0rh,我们使用这个密码登录数据库,执行下面的命令:
mysql -u root -p
这时候会要求输入密码,你可以直接复制并粘贴上去,为了安全起见,密码并不会在SSH控制台显示出来。成功登录之后,SSH 界面应该是这样的,MySQL 服务端的版本为 8.0.15:
接下来,我们需要修改登录密码,并创建一个数据库,用来存放网站的数据。需要注意的是,MySQL 对密码的安全性要求很高,你不能随便设置一个过于简单的密码,有一个比较简单的解决办法:你只需在临时密码后面加几个字母。例如,我们将把新密码设置为 /fSi(UG?J0rhABC
# 选择数据库
use mysql;
# 将root用户的密码设置为 /fSi(UG?J0rhABC
alter user 'root'@'localhost' identified by '/fSi(UG?J0rhABC' password expire never;
alter user 'root'@'localhost' identified with mysql_native_password by '/fSi(UG?J0rhABC';
# 修改root可以远程访问
create user 'root'@'%' identified by '/fSi(UG?J0rhABC' password expire never;
alter user 'root'@'%' identified with mysql_native_password by '/fSi(UG?J0rhABC';
# 刷新用户权限
flush privileges;
# 创建数据库,使用域名为数据库的名称
create database `xiaobei-demo.com` default character set = utf8;
# 退出MySQL
quit;
现在,MySQL 已经安装成功,用户和数据库也设置完毕。为了启动 WordPress 网站,现在还差最后一步,那就是安装反向代理 Nginx,我们继续前进吧!
9、安装 Nginx
打开 Nginx 官方网站,找到最新的稳定版本,目前是 1.14.2:
安装 Nginx 很容易,执行下面几条命令即可:
# /wordpress 目录
cd /wordpress
# 创建待用目录
mkdir /opt/nginx
# 下载nginx源代码
wget http://nginx.org/download/nginx-1.14.2.tar.gz
# 解压并进入解压后的目录
tar zxvf nginx-1.14.2.tar.gz
cd nginx-1.14.2
# 编译
./configure --prefix=/opt/nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module
# 安装
make && make install
等待 1-2 分钟之后,Nginx 安装完成,这时你的 SSH 终端应该类似于这样:
Nginx 已经安装完成,接下来,我们要修改默认的配置文件 /opt/nginx/conf/nginx.conf。由于修改的地方比较多,所以我们建议通过 FileZilla 将服务器上的文件下载到本地,修改完成之后再上传到 VPS 上面:
请将 nginx.conf 文件修改成下面这样,或者 点击这里(nginx-1.conf)下载我们的示例文件:
# 这一行是注释,请将文件中的xiaobei-demo.com修改成你自己的域名
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
client_header_buffer_size 128k;
client_max_body_size 50m;
large_client_header_buffers 4 128k;
server_names_hash_bucket_size 128;
sendfile on;
keepalive_timeout 60;
tcp_nodelay on;
tcp_nopush on;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_connect_timeout 300;
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_temp_file_write_size 128k;
fastcgi_intercept_errors on;
gzip on;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_disable "MSIE [1-6]\.";
gzip_min_length 1k;
gzip_types text/plain text/css text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;
server {
listen 80;
server_name www.xiaobei-demo.com xiaobei-demo.com;
root /wordpress/xiaobei-demo.com/;
index index.php;
charset utf-8;
location ~ /.well-known {
allow all;
}
location ~* .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|json|css|ttf|woff|woff2|eot|svg|flv|swf|map|xsl|zip)${
add_header Access-Control-Allow-Origin *;
expires max;
}
location / {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
try_files $uri $uri/ /index.php?$args;
}
}
}
修改完成之后,将文件上传到 VPS,然后执行下面的命令启动 Nginx:
sudo /opt/nginx/sbin/nginx
与前面介绍的 PHP 一样,我们需要让 Nginx 开机自动启动。为此,只需要编辑 /etc/rc.local 文件,在末尾新起一行,然后添加 sudo /opt/nginx/sbin/nginx 即可,完成之后文件内容应该像下面这样:
现在我们打开浏览器,输入网址 xiaobei-demo.com,将会看到令人欣慰的页面:
在做完这么多工作之后,我们终于看到了一丝曙光。但是请不要着急,因为你的网站现在使用不安全的 HTTP 协议,我们需要将其修改成 HTTPS。
10、安装 SSL 证书
我们使用 Let’s Encrypt 提供的免费 SSL 证书,只需执行下面几条命令:
# 进入 /wordpress 目录
cd /wordpress
# 安装 certbot
yum -y install certbot
# 获取证书,请把域名和邮箱修改成你自己的
certbot certonly --webroot -w /wordpress/xiaobei-demo.com -d xiaobei-demo.com -d www.xiaobei-demo.com --agree-tos -m example@xiaobei.com --agree-tos
# 在安装过程中,会询问你是否愿意公开自己的邮件地址,输入Y,然后按回车即可
证书现在已经获取成功,存放在目录 /etc/letsencrypt/live/ 中,你的 SSH 控制台看起来应该像下面这样:
如果你不幸遇到了下面的错误,请不要担心,这只是域名 DNS 没有生效而已,只需等几个小时再来获取 SSL 证书就可以了:
现在我们已经拥有 SSL 证书,接下来对 /opt/nginx/conf/nginx.conf 配置文件做一些调整,现在你有两种选择:
- 将 https://xiaobei-demo.com 作为网站首页,网站链接不带 www
- 将 https://www.xiaobei-demo.com 作为网站首页,网站链接带 www
两者的区别在于网站链接是否以 www 开头,nginx.conf 的文件内容稍微有点不同:
https://xiaobei-demo.com 作为网站首页
请将 nginx.conf 文件修改成下面这样:
# 这一行是注释,请将文件中的xiaobei-demo.com修改成你自己的域名
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
client_header_buffer_size 128k;
client_max_body_size 50m;
large_client_header_buffers 4 128k;
server_names_hash_bucket_size 128;
sendfile on;
keepalive_timeout 60;
tcp_nodelay on;
tcp_nopush on;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_connect_timeout 300;
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_temp_file_write_size 128k;
fastcgi_intercept_errors on;
gzip on;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_disable "MSIE [1-6]\.";
gzip_min_length 1k;
gzip_types text/plain text/css text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;
server {
listen 80;
server_name www.xiaobei-demo.com xiaobei-demo.com;
rewrite ^ https://xiaobei-demo.com$request_uri permanent;
}
server {
listen 443 ssl;
server_name www.xiaobei-demo.com;
ssl on;
ssl_certificate /etc/letsencrypt/live/xiaobei-demo.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xiaobei-demo.com/privkey.pem;
ssl_ciphers "CHACHA20:GCM:HIGH:!DH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
rewrite ^ https://xiaobei-demo.com$request_uri permanent;
}
server {
listen 443 ssl;
server_name xiaobei-demo.com;
root /wordpress/xiaobei-demo.com/;
index index.php;
charset utf-8;
ssl on;
ssl_certificate /etc/letsencrypt/live/xiaobei-demo.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xiaobei-demo.com/privkey.pem;
ssl_ciphers "CHACHA20:GCM:HIGH:!DH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location ~ /.well-known {
allow all;
}
(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|json|css|ttf|woff|woff2|eot|svg|flv|swf|map|xsl|zip)${
add_header Access-Control-Allow-Origin *;
expires max;
}
location / {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
try_files $uri $uri/ /index.php?$args;
}
}
}
https://www.xiaobei-demo.com 作为网站首页
请将 nginx.conf 文件修改成下面这样:
# 这一行是注释,请将文件中的xiaobei-demo.com修改成你自己的域名
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
client_header_buffer_size 128k;
client_max_body_size 50m;
large_client_header_buffers 4 128k;
server_names_hash_bucket_size 128;
sendfile on;
keepalive_timeout 60;
tcp_nodelay on;
tcp_nopush on;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_connect_timeout 300;
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_temp_file_write_size 128k;
fastcgi_intercept_errors on;
gzip on;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_disable "MSIE [1-6]\.";
gzip_min_length 1k;
gzip_types text/plain text/css text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;
server {
listen 80;
server_name www.xiaobei-demo.com xiaobei-demo.com;
rewrite ^ https://www.xiaobei-demo.com$request_uri permanent;
}
server {
listen 443 ssl;
server_name xiaobei-demo.com;
ssl on;
ssl_certificate /etc/letsencrypt/live/xiaobei-demo.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xiaobei-demo.com/privkey.pem;
ssl_ciphers "CHACHA20:GCM:HIGH:!DH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
rewrite ^ https://www.xiaobei-demo.com$request_uri permanent;
}
server {
listen 443 ssl;
server_name www.xiaobei-demo.com;
root /wordpress/xiaobei-demo.com/;
index index.php;
charset utf-8;
ssl on;
ssl_certificate /etc/letsencrypt/live/xiaobei-demo.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xiaobei-demo.com/privkey.pem;
ssl_ciphers "CHACHA20:GCM:HIGH:!DH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location ~ /.well-known {
allow all;
}
(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|json|css|ttf|woff|woff2|eot|svg|flv|swf|map|xsl|zip)${
add_header Access-Control-Allow-Origin *;
expires max;
}
location / {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
try_files $uri $uri/ /index.php?$args;
}
}
}
修改完成之后,执行以下命令应用新的配置文件:
/opt/nginx/sbin/nginx -s reload
在这篇文章中,我们使用 https://xiaobei-demo.com 作为网站首页,在浏览器中输入 xiaobei-demo.com,然后按回车,网址会自动跳转到 HTTPS 协议:
前期工作已经全部准备完成,接下来我们开始启动 WordPress 网站。但还有一件事需要注意, Let’s Encrypt 提供的免费 SSL 证书有效期只有 90 天,在证书到期之前,你需要对其进行更新,这个操作很简单,只需执行一条命令:
certbot renew --force-renew
更新完成之后,再让 Nginx 应用新的证书即可,执行以下命令:
/opt/nginx/sbin/nginx -s reload
11、启动 WordPress 网站
终于到了最后一步,请在浏览器中输入你的域名,选择你喜欢的网站语言(我们以简体中文为例),然后点击 继续 按钮进入下一步。你会看到一个提示页面,需要准备数据库连接信息:
如果你找不到数据库连接信息,请查看前面的安装 MySQL 小节,请按照下面所示输入相关信息:
数据库名 xiaobei-demo.com
用户名 root
密码 /fSi(UG?J0rhABC
数据库主机 127.0.0.1
表前缀 wp_
确认无误后,点击 提交 按钮。
如果信息全部正确,你将会看到下面这个页面:
点击 现在安装 按钮,在下一个页面中输入网站的一些必要信息:
上图是一些必要的信息,其中密码已经自动生成好。
- 站点标题:这个相当于网站名称,例如我们的站点标题是十佳评测,这个以后可以随时修改;
- 用户名和密码:用于登录网站的管理后台,用户名无法修改,密码以后可以修改;
- 你的电子邮件:用于接收网站的相关信息,例如核心更新、访客留言等等;
- 对搜索引擎的可见性:如果你现在不希望自己的网站出现在谷歌、百度或搜狗的搜索结果中,那么请勾选这个选项。不要担心,这个以后可以随时修改。
确保已经将密码保存在安全的地方,然后点击 安装WordPress 按钮,你将会看到令人欣慰的成功页面:
点击 登录 按钮,进入网站后台的登录页面:
输入刚才设定好的用户名和密码,然后点击登录 按钮,将会进入网站的管理后台:
在浏览器中输入你的域名,将会看到一个全新的外观:
现在,你的网站已经正式上线了,你可以在管理后台撰写文章、上传图片、更新主题、设计页面等等,很多工作都在等着你。
12、最后的安全设置
这一步并不是必须的,但可以让你的 VPS 和网站更加安全,如果你对此有兴趣,请继续阅读。
12.1、修改 SSH 端口
当你通过SSH客户端与 VPS 建立连接时,很可能会看到类似下面的提示:
这段话的意思是有人尝试通过 SSH 登录你的 VPS,并且已经登录失败了 3134 次,一般都是网上的自动程序发起的暴力破解。
为了降低被破解的次数,我们可以修改 SSH 的默认登录端口,为此需要编辑 /etc/ssh/sshd_config 文件,由于这个文件较大,所以我们建议下载到本地进行修改。大约在第17行,去掉前面的 # 符号,然后将默认的端口22修改为2200:
修改完成之后,将文件上传到 VPS 中,然后执行下面的命令使其生效,并重启 SSH 服务:
yum -y install policycoreutils-python.x86_64
semanage port -a -t ssh_port_t -p tcp 2200
systemctl restart sshd
注意,以后你登录 VPS 时,需要使用 2200 端口。
12.2、配置防火墙
各个 VPS 托管商对系统防火墙的处理一般分为以下三种:
- 在系统中没有预装防火墙
- 在系统中预装了防火墙,但没有启动
- 在系统中预装了防火墙,并且随系统自动启动
无论哪种方式,你都可以执行下面几条命令:
# 安装防火墙,如果系统中已存在,那就会执行更新
yum -y install firewalld
# 开机启动防火墙
systemctl enable firewalld
# 立即启动防火墙
systemctl restart dbus
systemctl restart firewalld
# 查看防火墙的状态
systemctl status firewalld
# 打开2200(SSH)、80(HTTP)、443(HTTPS)端口
firewall-cmd --zone=public --add-port=2200/tcp --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
# 更新防火墙规则
firewall-cmd --complete-reload
# 查看所有打开的端口和服务
firewall-cmd --zone=public --list-ports
firewall-cmd --list-services
防火墙已经安装并配置完毕,你的 SSH 控制台看起来应该是这样的:
12.3、封禁尝试破解密码的 IP
前面我们已经修改了 SSH 的登录端口,事实上,还有一种更安全的方法,那就是将失败次数达到 5 次(你可以修改这个数字)的 IP 进行封禁。
首先,在本地创建一个名为 secure_ssh.sh 的文件,输入以下内容:
#!/bin/sh
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /wordpress/log/secure_ssh_black.txt
for i in `cat /wordpress/log/secure_ssh_black.txt`
do
IP=`echo $i |awk -F= '{print $1}'`
NUM=`echo $i|awk -F= '{print $2}'`
if [ $NUM -ge 3 ]; then
grep $IP /etc/hosts.deny > /dev/null
if [ $? -gt 0 ] && [ $IP != "session:" ]; then
echo "sshd:$IP:deny" >> /etc/hosts.deny
fi
fi
done
然后,将本地的 secure_ssh.sh 的文件上传到 VPS 上的 /wordpress 目录中。注意,由于我们已经修改了 SSH 端口,所以你需要在 FileZilla 客户端中修改 VPS 的配置。上传成功之后,你的目录结构应该类似于这样:
转到SSH控制台,执行以下命令:
# 创建日志目录
mkdir /wordpress/log
# 给secure_ssh.sh添加执行权限
chmod +x /wordpress/secure_ssh.sh
创建一个定时任务,让 secure_ssh.sh 每分钟执行一次,输入以下命令:
crontab -e
注意将输入法切换为英文,按 i 键进入编辑模式,然后输入以下内容:
*/1 * * * * sh /wordpress/secure_ssh.sh
再按 Esc 键退出编辑模式,输入命令
:wq
保存并退出。这时候你的 SSH 控制台看起来应该像这样:
等几分钟之后,查看 VPS 上的 /etc/hosts.deny 文件,会看到有很多 IP 地址已被封禁。你既可以通过 FileZilla 将文件下载到本地,也可以使用下面这条命令来查看:
tail -f /etc/hosts.deny
# 按 Ctrl+C 可以退出查看模式
SSH 界面示例:
12.4、提升网站安全性
HTTP 协议有 9 种方法:
- HEAD:请求指定的资源,但服务器不会返回内容部分,通常用于检查网站是否正常在线;
- GET:请求指定的资源,服务器会返回内容部分,当访客浏览你的网站时,将通过这个方法获得页面内容;
- POST:向指定资源提交数据,请求服务器进行处理,通常用于数据提交、文件上传等等;
- PUT:向服务器上传最新内容,黑客喜欢用这个方法上传脚本文件;
- DELETE:删除服务器上的指定内容,也是黑客喜欢的方法;
- CONNECT:通常用于 SSL 加密服务器的链接与非加密的 HTTP 代理服务器的通信,很少使用;
- OPTIONS:与 HEAD 类似,一般用于查看服务器的性能,但黑客喜欢执行一些破坏操作;
- TRACE:主要用于 HTTP 请求的测试或诊断;
- PATCH:与 PUT 请求类似,用于资源的更新,黑客喜欢。
对于 99.99% 的网站来说,只需开启 HEAD、GET 和 POST,其他方法不仅很少使用,而且还会留下安全隐患。接下来,我们对 Nginx 做一些调整,将文件 /opt/nginx/conf/nginx.conf 改成下面这样(第 74~76 行为新增内容:
# 这一行是注释,请将文件中的xiaobei-demo.com修改成你自己的域名
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
client_header_buffer_size 128k;
client_max_body_size 50m;
large_client_header_buffers 4 128k;
server_names_hash_bucket_size 128;
sendfile on;
keepalive_timeout 60;
tcp_nodelay on;
tcp_nopush on;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_connect_timeout 300;
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_temp_file_write_size 128k;
fastcgi_intercept_errors on;
gzip on;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_disable "MSIE [1-6]\.";
gzip_min_length 1k;
gzip_types text/plain text/css text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;
server {
listen 80;
server_name www.xiaobei-demo.com xiaobei-demo.com;
rewrite ^ https://xiaobei-demo.com$request_uri permanent;
}
server {
listen 443 ssl;
server_name www.xiaobei-demo.com;
ssl on;
ssl_certificate /etc/letsencrypt/live/xiaobei-demo.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xiaobei-demo.com/privkey.pem;
ssl_ciphers "CHACHA20:GCM:HIGH:!DH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
rewrite ^ https://xiaobei-demo.com$request_uri permanent;
}
server {
listen 443 ssl;
server_name xiaobei-demo.com;
root /wordpress/xiaobei-demo.com/;
index index.php;
charset utf-8;
ssl on;
ssl_certificate /etc/letsencrypt/live/xiaobei-demo.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xiaobei-demo.com/privkey.pem;
ssl_ciphers "CHACHA20:GCM:HIGH:!DH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
if ($request_method !~ ^(HEAD|GET|POST)$) {
return 403;
}
location ~ /.well-known {
allow all;
}
(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|json|css|ttf|woff|woff2|eot|svg|flv|swf|map|xsl|zip)${
add_header Access-Control-Allow-Origin *;
expires max;
}
location / {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
try_files $uri $uri/ /index.php?$args;
}
}
}
修改完成之后,执行以下命令,让 Nginx 重新加载配置文件即可:
/opt/nginx/sbin/nginx -s reload
搭建教程到此结束,如果不能连接的,请检查自己的每一步操作。