由于现在很多人仍然使用共享主机,所以我决定写这篇教程,教你如何设置自己的虚拟专用服务器(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 托管商,为了让你的选择变得更加简单,我已经挑选出了一些最好的选项,其中 HostwindsVultr 支持支付宝付款。

在这篇文章中,我以 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

搭建教程到此结束,如果不能连接的,请检查自己的每一步操作。

版权声明:本文为xiaobeijianzhan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xiaobeijianzhan/p/11152054.html