由于现在很多人仍然使用共享主机,所以我决定写这篇教程,教你如何设置自己的虚拟专用服务器(VPS),以便为启动一个 WordPress 网站准备好所有必要的服务。

为什么共享托管不是最好的选择?

  • 你的 WordPress 网站必须与其他用户争夺服务器资源;
  • 你无法自己加速网站;
  • 你不能自定义一些安全策略。

共享主机为你提供了一个基本的仪表盘,来对域名、网站、邮件等进行设置,提供这种服务的托管公司包括: WP Engine、Flywheel、SiteGround、Kinsta 等等,他们确保你的网站经过优化和更新,因此你可以高枕无忧。

但是,如果在 VPS 上搭建 WordPress 网站,那么你可以了解成功运行 WordPress 网站所需的整个流程。然后,你还能学到如何设置和优化,从 Linux(操作系统)到 Nginx(Web服务器)再到 FTP(以及更安全的SFTP)、SSH、数据库等等,最后你将学习如何设置 HTTPS、优化资源和整体安全性。

1、注册域名

2、准备 SSH 和 SFTP 客户端

3、购买 VPS

4、配置域名 DNS

5、连接 VPS

6、安装 WordPress

7、安装 PHP

8、安装 MySQL

9、安装 Nginx

10、安装 SSL 证书

11、启动 WordPress 网站

12、最后的安全设置

为了让访客更方便地找到和识别你的网站,你需要给网站绑定一个域名。我建议使用最受欢迎的GoDaddy 来注册域名,这是全球最大的域名注册商,目前管理着超过 7500 万个域名。

注册域名很简单,但是要找到一个令人满意的结果可能需要很长时间,如果你在这方面遇到了麻烦,请查看我的这篇文章:怎样挑选域名

为了与 VPS 进行通信,首先需要准备 SSH 和 SFTP 客户端。SSH 客户端可以用来处理与 VPS 相关的所有工作,包括查看信息、系统升级、安装软件、安全配置、权限管理等等;SFTP 客户端则主要用来上传/下载目录和文件。

我推荐的 SSH 客户端是 Termius ,这是一个跨平台的软件,可以在 Windows、macOS、Linux、iOS、Android 系统中运行。转到官方网站,注册一个账号即可免费使用:

这是一款广受赞誉的跨平台软件,在各大应用商店都获得了极高的评价,高级版的价格为 $6.99/月,或者 $59.88/年,提供更多功能,包括:

  • 多设备之间数据同步
  • SFTP
  • 密码粘贴
  • 代码自动完成
  • 代理转发
  • 代码片段
  • 以及更多…

对于大部分人来说,免费版的功能已经绰绰有余。但如果预算允许,那么高级版会为你节省大量敲键盘的时间。

SFTP 客户端我建议使用免费开源的 FileZilla ,这也是一款跨平台软件,兼容 Windows、macOS、Linux 系统,或者你也可以下载源代码,自行编译安装。

请将 Termius 和 FileZilla 安装在自己的电脑中,我们进入下一步。

市场上充斥着大量的 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:

按回车键,在弹出的命令行窗口中输入以下命令:

  1. ping 23.254.164.198

如图所示,结果中出现 来自 23.254.164.198 的回复 信息表示网络没有问题,少量的 请求超时 并没有什么大碍。

如果IP地址无法连通,那么你可以在 Hostwinds 的控制面板中更换 IP:

你可以在 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,安装一些特定的软件以启动网站。

首先获取 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 的目录结构:

现在,我们已经与 VPS 建立了连接。由于托管商提供的主机系统非常精简,缺少很多应用程序,所以我们先要安装一些基础框架,以便后续程序能够良好运行。

转到 Termius,输入以下命令安装基础框架。

  1. 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,执行以下命令:

  1. mkdir /wordpress

或者,你可以转到 FileZilla,切换到根目录下,直接右键,点击创建目录:

创建完成之后,我们可以通过 FileZilla 看到新增的目录,如果你没有看到,那么请右键点击刷新:

回到 Termius,我们执行命令进入目录 /wordpress 中:

  1. cd /wordpress

现在我们要下载 WordPress,打开官方网站,查看下面 .tar.gz 文件的下载链接:https://wordpress.org/latest.tar.gz

在 Termius 中执行以下命令:

  1. wget https://wordpress.org/latest.tar.gz

现在你的 Termius 应该类似于这样:

输入完命令之后,按回车键,一般几秒钟就可以下载完成。这是一个压缩包,现在执行以下命令将其解压:

  1. tar zxvf latest.tar.gz

现在你的 Termius 应该类似于这样:

解压很快就可以完成,我们现在得到了一个 wordpress 文件夹,执行以下命令将其重命名为 xiaobei-demo.com(你修改成自己的域名):

  1. mv wordpress xiaobei-demo.com

现在你的 Termius 应该类似于这样:

转到 FileZilla,我们可以直观地查看一下目录结构:

到这一步,WordPress 已经安装完成了,但是现在还无法运行。为了使其运行,我们还要安装 PHP 环境。

打开 PHP 官方网站: http://php.net/

我们看到最新的版本是 7.3.2,但在我们的测试中,这个版本有点问题,所以选择更为稳定的 7.2.15。转到 Termius,执行以下命令切换到 /wordpress 目录,然后下载 PHP:

  1. cd /wordpress
  2. wget http://php.net/distributions/php-7.2.15.tar.gz

解压文件,然后切换到 /wordpress/php-7.2.15 目录:

  1. tar zxvf php-7.2.15.tar.gz
  2. cd php-7.2.15

由于我们下载的是源代码文件,所以需要进行编译安装,下面的命令是在安装之前做一些检查。需要注意的是,这其实是一条命令,你应该全部复制下来,然后粘贴到 Termius 上执行:

  1. ./configure --prefix=/usr/local/php \
  2. --with-curl \
  3. --with-freetype-dir \
  4. --with-gd \
  5. --with-gettext \
  6. --with-iconv-dir \
  7. --with-kerberos \
  8. --with-libdir=lib64 \
  9. --with-libxml-dir \
  10. --with-mysqli \
  11. --with-openssl \
  12. --with-pcre-regex \
  13. --with-pdo-mysql \
  14. --with-pdo-sqlite \
  15. --with-pear \
  16. --with-png-dir \
  17. --with-xmlrpc \
  18. --with-xsl \
  19. --with-zlib \
  20. --enable-fpm \
  21. --enable-bcmath \
  22. --enable-libxml \
  23. --enable-inline-optimization \
  24. --enable-gd-native-ttf \
  25. --enable-mbregex \
  26. --enable-mbstring \
  27. --enable-opcache \
  28. --enable-pcntl \
  29. --enable-shmop \
  30. --enable-soap \
  31. --enable-sockets \
  32. --enable-sysvsem \
  33. --enable-xml \
  34. --enable-zip

大约一分钟之后,./configure 命令执行完毕,成功之后的界面应该是这样的,会打印出 License 信息:

现在我们开始安装 PHP,这个过程需要很长时间,可能会超过 10 分钟,请耐心等待。执行以下命令安装:

  1. make && make install

在安装的过程中,你很可能会遇到下面的错误:

请不要担心,这个错误是指系统的内存不足。出现这个问题其实很好理解,因为前面我们购买的是最便宜的 VPS,内存一共只有 1GB,编译安装PHP是一件对内存消耗很大的任务。解决这个问题很简单,只需要增加一些虚拟内存即可,执行以下命令查看系统的虚拟内存:

  1. free -m

从图中可以看到,我们的虚拟内存(Swap)是 0:

执行下面4条命令来创建1GB的虚拟内存:

  1. fallocate -l 1G /swapfile
  2. chmod 600 /swapfile
  3. mkswap /swapfile
  4. swapon /swapfile

对于大部分 CentOS 7 系统来说,这个增加虚拟内存的命令都能执行成功。但是,仍然有些架构不一样的 VPS 可能执行失败,出现下面这样的错误:

如果不幸你也遇到了这个错误,那么只需执行下面的命令来重新创建:

  1. dd if=/dev/zero of=/swapfile count=1024 bs=1MiB
  2. chmod 600 /swapfile
  3. mkswap /swapfile
  4. swapon /swapfile

执行成功之后的界面应该如下所示:

再次执行下面的命令查看系统内存:

  1. free -m

可以看到,我们已经成功创建了 1GB 的虚拟内存(Swap):

接下来,我们继续安装 PHP,首先进入目录 /wordpress/php-7.2.15,然后执行安装操作。现在,你可以放心地休息一下,或者去喝杯茶了,因为安装过程通常会超过 10 分钟 ?

  1. cd /wordpress/php-7.2.15
  2. make && make install

经过漫长的等待之后,PHP 终于安装好了,安装成功的界面应该是这样的:

执行下面几条命令,将 PHP 的配置文件拷贝到系统目录中:

  1. cp php.ini-development /usr/local/php/lib/php.ini
  2. cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
  3. cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf

现在,我们要将 PHP 添加到全局环境变量中,执行下面的命令修改 /etc/profile 文件:

  1. vi /etc/profile

注意将输入法切换为英文,然后按住键盘上的 ↓(或Shift+G)键滚动到文件底部,然后按 i 键进入编辑状态,在文件最后面追加以下内容:

  1. export PATH="/usr/local/php/bin:$PATH"

这时候你的SSH界面看起来应该是这样的:

再按键盘上的 Esc 键退出编辑模式,然后输入以下命令保存文件:

  1. :wq

SSH 界面示例:

执行命令使得刚才的配置生效:

  1. source /etc/profile

现在 PHP 已经安装成功,并且配置完毕,执行下面的命令就可以将其启动:

  1. sudo /usr/local/php/sbin/php-fpm

PHP 启动之后会在后台运行,并占用 9000 端口,我们输入下面的命令来确认一下:

  1. netstat -ant | grep 9000

从下图可以看到,9000 端口确实在使用中,这说明 PHP 运行正常:

现在,PHP 已经顺利启动,但我们还差一个步骤,那就是让它开机自动运行。首先输入以下命令来编辑 /etc/rc.local 文件:

  1. vi /etc/rc.local

在文件末尾添加 PHP 的启动命令:

  1. sudo /usr/local/php/sbin/php-fpm

SSH 界面示例:

完成之后,按键盘上的 Esc 键退出编辑模式,然后输入以下命令保存文件:

  1. :wq

最后一步,执行下面的命令使得 /etc/rc.local 拥有执行权限:

  1. chmod +x /etc/rc.local

这是一项艰巨的任务,很高兴你已经顺利完成。接下来,我们将安装 MySQL 数据库,这是 WordPress 网站存储数据的地方。

打开MySQL官方网站,滚动到页面下方,查看仓库中的最新版本:

你可以点击列表右侧的 Download 按钮来获得下载链接,但这需要注册账号并登录。实际上,还有一种更简单的方法,上图中最新的rpm文件是 mysql80-community-release-el7-2.noarch.rpm,按照以往的经验,这个文件的下载链接应该就是:https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm

依次执行下面的 4 条命令,注意:# 符号表示这一行是解释说明,不是命令语句:

  1. # 进入 /wordpress 目录
  2. cd /wordpress
  3. # 下载mysql源安装包
  4. wget https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm
  5. # 安装mysql源
  6. yum -y localinstall mysql80-community-release-el7-2.noarch.rpm
  7. # 安装MySQL
  8. yum -y install mysql-community-server

大概几分钟之后,MySQL 就安装好了,SSH 界面应该类似于这样:

执行下面的 3 条命令,让 MySQL 可以开机启动,并立即启动 MySQL 服务:

  1. # 开机启动
  2. systemctl enable mysqld
  3. systemctl daemon-reload
  4. # 启动MySQL服务
  5. systemctl start mysqld

MySQL 已经启动,并且生成了一个超级用户 root(以及临时密码),我们需要使用 root 用户登录数据库,以便做一些操作。临时密码在日志文件中,我们可以执行下面的命令查看文件最后 50 行,来获得临时密码:

  1. tail -n 50 /var/log/mysqld.log

SSH界面示例:

从上图可以看到,root 用户的临时密码是 /fSi(UG?J0rh,我们使用这个密码登录数据库,执行下面的命令:

  1. mysql -u root -p

这时候会要求输入密码,你可以直接复制并粘贴上去,为了安全起见,密码并不会在SSH控制台显示出来。成功登录之后,SSH 界面应该是这样的,MySQL 服务端的版本为 8.0.15:

接下来,我们需要修改登录密码,并创建一个数据库,用来存放网站的数据。需要注意的是,MySQL 对密码的安全性要求很高,你不能随便设置一个过于简单的密码,有一个比较简单的解决办法:你只需在临时密码后面加几个字母。例如,我们将把新密码设置为 /fSi(UG?J0rhABC

  1. # 选择数据库
  2. use mysql;
  3. # 将root用户的密码设置为 /fSi(UG?J0rhABC
  4. alter user 'root'@'localhost' identified by '/fSi(UG?J0rhABC' password expire never;
  5. alter user 'root'@'localhost' identified with mysql_native_password by '/fSi(UG?J0rhABC';
  6. # 修改root可以远程访问
  7. create user 'root'@'%' identified by '/fSi(UG?J0rhABC' password expire never;
  8. alter user 'root'@'%' identified with mysql_native_password by '/fSi(UG?J0rhABC';
  9. # 刷新用户权限
  10. flush privileges;
  11. # 创建数据库,使用域名为数据库的名称
  12. create database `xiaobei-demo.com` default character set = utf8;
  13. # 退出MySQL
  14. quit;

现在,MySQL 已经安装成功,用户和数据库也设置完毕。为了启动 WordPress 网站,现在还差最后一步,那就是安装反向代理 Nginx,我们继续前进吧!

打开 Nginx 官方网站,找到最新的稳定版本,目前是 1.14.2:

安装 Nginx 很容易,执行下面几条命令即可:

  1. # /wordpress 目录
  2. cd /wordpress
  3. # 创建待用目录
  4. mkdir /opt/nginx
  5. # 下载nginx源代码
  6. wget http://nginx.org/download/nginx-1.14.2.tar.gz
  7. # 解压并进入解压后的目录
  8. tar zxvf nginx-1.14.2.tar.gz
  9. cd nginx-1.14.2
  10. # 编译
  11. ./configure --prefix=/opt/nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module
  12. # 安装
  13. make && make install

等待 1-2 分钟之后,Nginx 安装完成,这时你的 SSH 终端应该类似于这样:

Nginx 已经安装完成,接下来,我们要修改默认的配置文件 /opt/nginx/conf/nginx.conf。由于修改的地方比较多,所以我们建议通过 FileZilla 将服务器上的文件下载到本地,修改完成之后再上传到 VPS 上面:

请将 nginx.conf 文件修改成下面这样,或者 点击这里(nginx-1.conf)下载我们的示例文件:

  1. # 这一行是注释,请将文件中的xiaobei-demo.com修改成你自己的域名
  2. worker_processes 1;
  3. events {
  4. worker_connections 1024;
  5. }
  6. http {
  7. include mime.types;
  8. default_type application/octet-stream;
  9. client_header_buffer_size 128k;
  10. client_max_body_size 50m;
  11. large_client_header_buffers 4 128k;
  12. server_names_hash_bucket_size 128;
  13. sendfile on;
  14. keepalive_timeout 60;
  15. tcp_nodelay on;
  16. tcp_nopush on;
  17. fastcgi_buffer_size 64k;
  18. fastcgi_buffers 4 64k;
  19. fastcgi_busy_buffers_size 128k;
  20. fastcgi_connect_timeout 300;
  21. fastcgi_read_timeout 300;
  22. fastcgi_send_timeout 300;
  23. fastcgi_temp_file_write_size 128k;
  24. fastcgi_intercept_errors on;
  25. gzip on;
  26. gzip_buffers 4 16k;
  27. gzip_comp_level 2;
  28. gzip_disable "MSIE [1-6]\.";
  29. gzip_min_length 1k;
  30. gzip_types text/plain text/css text/javascript application/x-httpd-php image/jpeg image/gif image/png;
  31. gzip_vary off;
  32. server {
  33. listen 80;
  34. server_name www.xiaobei-demo.com xiaobei-demo.com;
  35. root /wordpress/xiaobei-demo.com/;
  36. index index.php;
  37. charset utf-8;
  38. location ~ /.well-known {
  39. allow all;
  40. }
  41. location ~* .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|json|css|ttf|woff|woff2|eot|svg|flv|swf|map|xsl|zip)${
  42. add_header Access-Control-Allow-Origin *;
  43. expires max;
  44. }
  45. location / {
  46. fastcgi_pass 127.0.0.1:9000;
  47. fastcgi_index index.php;
  48. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  49. include fastcgi_params;
  50. try_files $uri $uri/ /index.php?$args;
  51. }
  52. }
  53. }

修改完成之后,将文件上传到 VPS,然后执行下面的命令启动 Nginx:

  1. sudo /opt/nginx/sbin/nginx

与前面介绍的 PHP 一样,我们需要让 Nginx 开机自动启动。为此,只需要编辑 /etc/rc.local 文件,在末尾新起一行,然后添加 sudo /opt/nginx/sbin/nginx 即可,完成之后文件内容应该像下面这样:

现在我们打开浏览器,输入网址 xiaobei-demo.com,将会看到令人欣慰的页面:

在做完这么多工作之后,我们终于看到了一丝曙光。但是请不要着急,因为你的网站现在使用不安全的 HTTP 协议,我们需要将其修改成 HTTPS。

我们使用 Let’s Encrypt 提供的免费 SSL 证书,只需执行下面几条命令:

  1. # 进入 /wordpress 目录
  2. cd /wordpress
  3. # 安装 certbot
  4. yum -y install certbot
  5. # 获取证书,请把域名和邮箱修改成你自己的
  6. 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
  7. # 在安装过程中,会询问你是否愿意公开自己的邮件地址,输入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 文件修改成下面这样:

  1. # 这一行是注释,请将文件中的xiaobei-demo.com修改成你自己的域名
  2. worker_processes 1;
  3. events {
  4. worker_connections 1024;
  5. }
  6. http {
  7. include mime.types;
  8. default_type application/octet-stream;
  9. client_header_buffer_size 128k;
  10. client_max_body_size 50m;
  11. large_client_header_buffers 4 128k;
  12. server_names_hash_bucket_size 128;
  13. sendfile on;
  14. keepalive_timeout 60;
  15. tcp_nodelay on;
  16. tcp_nopush on;
  17. fastcgi_buffer_size 64k;
  18. fastcgi_buffers 4 64k;
  19. fastcgi_busy_buffers_size 128k;
  20. fastcgi_connect_timeout 300;
  21. fastcgi_read_timeout 300;
  22. fastcgi_send_timeout 300;
  23. fastcgi_temp_file_write_size 128k;
  24. fastcgi_intercept_errors on;
  25. gzip on;
  26. gzip_buffers 4 16k;
  27. gzip_comp_level 2;
  28. gzip_disable "MSIE [1-6]\.";
  29. gzip_min_length 1k;
  30. gzip_types text/plain text/css text/javascript application/x-httpd-php image/jpeg image/gif image/png;
  31. gzip_vary off;
  32. server {
  33. listen 80;
  34. server_name www.xiaobei-demo.com xiaobei-demo.com;
  35. rewrite ^ https://xiaobei-demo.com$request_uri permanent;
  36. }
  37. server {
  38. listen 443 ssl;
  39. server_name www.xiaobei-demo.com;
  40. ssl on;
  41. ssl_certificate /etc/letsencrypt/live/xiaobei-demo.com/fullchain.pem;
  42. ssl_certificate_key /etc/letsencrypt/live/xiaobei-demo.com/privkey.pem;
  43. ssl_ciphers "CHACHA20:GCM:HIGH:!DH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
  44. ssl_session_cache shared:SSL:10m;
  45. ssl_session_timeout 10m;
  46. rewrite ^ https://xiaobei-demo.com$request_uri permanent;
  47. }
  48. server {
  49. listen 443 ssl;
  50. server_name xiaobei-demo.com;
  51. root /wordpress/xiaobei-demo.com/;
  52. index index.php;
  53. charset utf-8;
  54. ssl on;
  55. ssl_certificate /etc/letsencrypt/live/xiaobei-demo.com/fullchain.pem;
  56. ssl_certificate_key /etc/letsencrypt/live/xiaobei-demo.com/privkey.pem;
  57. ssl_ciphers "CHACHA20:GCM:HIGH:!DH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
  58. ssl_session_cache shared:SSL:10m;
  59. ssl_session_timeout 10m;
  60. location ~ /.well-known {
  61. allow all;
  62. }
  63. ​(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|json|css|ttf|woff|woff2|eot|svg|flv|swf|map|xsl|zip)${
  64. add_header Access-Control-Allow-Origin *;
  65. expires max;
  66. }
  67. location / {
  68. fastcgi_pass 127.0.0.1:9000;
  69. fastcgi_index index.php;
  70. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  71. include fastcgi_params;
  72. try_files $uri $uri/ /index.php?$args;
  73. }
  74. }
  75. }

https://www.xiaobei-demo.com 作为网站首页

请将 nginx.conf 文件修改成下面这样:

  1. # 这一行是注释,请将文件中的xiaobei-demo.com修改成你自己的域名
  2. worker_processes 1;
  3. events {
  4. worker_connections 1024;
  5. }
  6. http {
  7. include mime.types;
  8. default_type application/octet-stream;
  9. client_header_buffer_size 128k;
  10. client_max_body_size 50m;
  11. large_client_header_buffers 4 128k;
  12. server_names_hash_bucket_size 128;
  13. sendfile on;
  14. keepalive_timeout 60;
  15. tcp_nodelay on;
  16. tcp_nopush on;
  17. fastcgi_buffer_size 64k;
  18. fastcgi_buffers 4 64k;
  19. fastcgi_busy_buffers_size 128k;
  20. fastcgi_connect_timeout 300;
  21. fastcgi_read_timeout 300;
  22. fastcgi_send_timeout 300;
  23. fastcgi_temp_file_write_size 128k;
  24. fastcgi_intercept_errors on;
  25. gzip on;
  26. gzip_buffers 4 16k;
  27. gzip_comp_level 2;
  28. gzip_disable "MSIE [1-6]\.";
  29. gzip_min_length 1k;
  30. gzip_types text/plain text/css text/javascript application/x-httpd-php image/jpeg image/gif image/png;
  31. gzip_vary off;
  32. server {
  33. listen 80;
  34. server_name www.xiaobei-demo.com xiaobei-demo.com;
  35. rewrite ^ https://www.xiaobei-demo.com$request_uri permanent;
  36. }
  37. server {
  38. listen 443 ssl;
  39. server_name xiaobei-demo.com;
  40. ssl on;
  41. ssl_certificate /etc/letsencrypt/live/xiaobei-demo.com/fullchain.pem;
  42. ssl_certificate_key /etc/letsencrypt/live/xiaobei-demo.com/privkey.pem;
  43. ssl_ciphers "CHACHA20:GCM:HIGH:!DH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
  44. ssl_session_cache shared:SSL:10m;
  45. ssl_session_timeout 10m;
  46. rewrite ^ https://www.xiaobei-demo.com$request_uri permanent;
  47. }
  48. server {
  49. listen 443 ssl;
  50. server_name www.xiaobei-demo.com;
  51. root /wordpress/xiaobei-demo.com/;
  52. index index.php;
  53. charset utf-8;
  54. ssl on;
  55. ssl_certificate /etc/letsencrypt/live/xiaobei-demo.com/fullchain.pem;
  56. ssl_certificate_key /etc/letsencrypt/live/xiaobei-demo.com/privkey.pem;
  57. ssl_ciphers "CHACHA20:GCM:HIGH:!DH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
  58. ssl_session_cache shared:SSL:10m;
  59. ssl_session_timeout 10m;
  60. location ~ /.well-known {
  61. allow all;
  62. }
  63. (html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|json|css|ttf|woff|woff2|eot|svg|flv|swf|map|xsl|zip)${
  64. add_header Access-Control-Allow-Origin *;
  65. expires max;
  66. }
  67. location / {
  68. fastcgi_pass 127.0.0.1:9000;
  69. fastcgi_index index.php;
  70. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  71. include fastcgi_params;
  72. try_files $uri $uri/ /index.php?$args;
  73. }
  74. }
  75. }

修改完成之后,执行以下命令应用新的配置文件:

  1. /opt/nginx/sbin/nginx -s reload

在这篇文章中,我们使用 https://xiaobei-demo.com 作为网站首页,在浏览器中输入 xiaobei-demo.com,然后按回车,网址会自动跳转到 HTTPS 协议:

前期工作已经全部准备完成,接下来我们开始启动 WordPress 网站。但还有一件事需要注意, Let’s Encrypt 提供的免费 SSL 证书有效期只有 90 天,在证书到期之前,你需要对其进行更新,这个操作很简单,只需执行一条命令:

  1. certbot renew --force-renew

更新完成之后,再让 Nginx 应用新的证书即可,执行以下命令:

  1. /opt/nginx/sbin/nginx -s reload

终于到了最后一步,请在浏览器中输入你的域名,选择你喜欢的网站语言(我们以简体中文为例),然后点击 继续 按钮进入下一步。你会看到一个提示页面,需要准备数据库连接信息:

如果你找不到数据库连接信息,请查看前面的安装 MySQL 小节,请按照下面所示输入相关信息:

数据库名 xiaobei-demo.com

用户名 root

密码 /fSi(UG?J0rhABC

数据库主机 127.0.0.1

表前缀 wp_

确认无误后,点击 提交 按钮。

如果信息全部正确,你将会看到下面这个页面:

点击 现在安装 按钮,在下一个页面中输入网站的一些必要信息:

上图是一些必要的信息,其中密码已经自动生成好。

  • 站点标题:这个相当于网站名称,例如我们的站点标题是十佳评测,这个以后可以随时修改;
  • 用户名和密码:用于登录网站的管理后台,用户名无法修改,密码以后可以修改;
  • 你的电子邮件:用于接收网站的相关信息,例如核心更新、访客留言等等;
  • 对搜索引擎的可见性:如果你现在不希望自己的网站出现在谷歌、百度或搜狗的搜索结果中,那么请勾选这个选项。不要担心,这个以后可以随时修改。

确保已经将密码保存在安全的地方,然后点击 安装WordPress 按钮,你将会看到令人欣慰的成功页面:

点击 登录 按钮,进入网站后台的登录页面:

输入刚才设定好的用户名和密码,然后点击登录 按钮,将会进入网站的管理后台:

在浏览器中输入你的域名,将会看到一个全新的外观:

现在,你的网站已经正式上线了,你可以在管理后台撰写文章、上传图片、更新主题、设计页面等等,很多工作都在等着你。

这一步并不是必须的,但可以让你的 VPS 和网站更加安全,如果你对此有兴趣,请继续阅读。

当你通过SSH客户端与 VPS 建立连接时,很可能会看到类似下面的提示:

这段话的意思是有人尝试通过 SSH 登录你的 VPS,并且已经登录失败了 3134 次,一般都是网上的自动程序发起的暴力破解。

为了降低被破解的次数,我们可以修改 SSH 的默认登录端口,为此需要编辑 /etc/ssh/sshd_config 文件,由于这个文件较大,所以我们建议下载到本地进行修改。大约在第17行,去掉前面的 # 符号,然后将默认的端口22修改为2200:

修改完成之后,将文件上传到 VPS 中,然后执行下面的命令使其生效,并重启 SSH 服务:

  1. yum -y install policycoreutils-python.x86_64
  2. semanage port -a -t ssh_port_t -p tcp 2200
  3. systemctl restart sshd

注意,以后你登录 VPS 时,需要使用 2200 端口。

各个 VPS 托管商对系统防火墙的处理一般分为以下三种:

  • 在系统中没有预装防火墙
  • 在系统中预装了防火墙,但没有启动
  • 在系统中预装了防火墙,并且随系统自动启动

无论哪种方式,你都可以执行下面几条命令:

  1. # 安装防火墙,如果系统中已存在,那就会执行更新
  2. yum -y install firewalld
  3. # 开机启动防火墙
  4. systemctl enable firewalld
  5. # 立即启动防火墙
  6. systemctl restart dbus
  7. systemctl restart firewalld
  8. # 查看防火墙的状态
  9. systemctl status firewalld
  10. # 打开2200(SSH)、80(HTTP)、443(HTTPS)端口
  11. firewall-cmd --zone=public --add-port=2200/tcp --permanent
  12. firewall-cmd --zone=public --add-port=80/tcp --permanent
  13. firewall-cmd --zone=public --add-port=443/tcp --permanent
  14. # 更新防火墙规则
  15. firewall-cmd --complete-reload
  16. # 查看所有打开的端口和服务
  17. firewall-cmd --zone=public --list-ports
  18. firewall-cmd --list-services

防火墙已经安装并配置完毕,你的 SSH 控制台看起来应该是这样的:

前面我们已经修改了 SSH 的登录端口,事实上,还有一种更安全的方法,那就是将失败次数达到 5 次(你可以修改这个数字)的 IP 进行封禁。

首先,在本地创建一个名为 secure_ssh.sh 的文件,输入以下内容:

  1. #!/bin/sh
  2. cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /wordpress/log/secure_ssh_black.txt
  3. for i in `cat /wordpress/log/secure_ssh_black.txt`
  4. do
  5. IP=`echo $i |awk -F= '{print $1}'`
  6. NUM=`echo $i|awk -F= '{print $2}'`
  7. if [ $NUM -ge 3 ]; then
  8. grep $IP /etc/hosts.deny > /dev/null
  9. if [ $? -gt 0 ] && [ $IP != "session:" ]; then
  10. echo "sshd:$IP:deny" >> /etc/hosts.deny
  11. fi
  12. fi
  13. done

然后,将本地的 secure_ssh.sh 的文件上传到 VPS 上的 /wordpress 目录中。注意,由于我们已经修改了 SSH 端口,所以你需要在 FileZilla 客户端中修改 VPS 的配置。上传成功之后,你的目录结构应该类似于这样:

转到SSH控制台,执行以下命令:

  1. # 创建日志目录
  2. mkdir /wordpress/log
  3. # 给secure_ssh.sh添加执行权限
  4. chmod +x /wordpress/secure_ssh.sh

创建一个定时任务,让 secure_ssh.sh 每分钟执行一次,输入以下命令:

  1. crontab -e

注意将输入法切换为英文,按 i 键进入编辑模式,然后输入以下内容:

  1. */1 * * * * sh /wordpress/secure_ssh.sh

再按 Esc 键退出编辑模式,输入命令

  1. :wq

保存并退出。这时候你的 SSH 控制台看起来应该像这样:

等几分钟之后,查看 VPS 上的 /etc/hosts.deny 文件,会看到有很多 IP 地址已被封禁。你既可以通过 FileZilla 将文件下载到本地,也可以使用下面这条命令来查看:

  1. tail -f /etc/hosts.deny
  2. # 按 Ctrl+C 可以退出查看模式

SSH 界面示例:

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 行为新增内容:

  1. # 这一行是注释,请将文件中的xiaobei-demo.com修改成你自己的域名
  2. worker_processes 1;
  3. events {
  4. worker_connections 1024;
  5. }
  6. http {
  7. include mime.types;
  8. default_type application/octet-stream;
  9. client_header_buffer_size 128k;
  10. client_max_body_size 50m;
  11. large_client_header_buffers 4 128k;
  12. server_names_hash_bucket_size 128;
  13. sendfile on;
  14. keepalive_timeout 60;
  15. tcp_nodelay on;
  16. tcp_nopush on;
  17. fastcgi_buffer_size 64k;
  18. fastcgi_buffers 4 64k;
  19. fastcgi_busy_buffers_size 128k;
  20. fastcgi_connect_timeout 300;
  21. fastcgi_read_timeout 300;
  22. fastcgi_send_timeout 300;
  23. fastcgi_temp_file_write_size 128k;
  24. fastcgi_intercept_errors on;
  25. gzip on;
  26. gzip_buffers 4 16k;
  27. gzip_comp_level 2;
  28. gzip_disable "MSIE [1-6]\.";
  29. gzip_min_length 1k;
  30. gzip_types text/plain text/css text/javascript application/x-httpd-php image/jpeg image/gif image/png;
  31. gzip_vary off;
  32. server {
  33. listen 80;
  34. server_name www.xiaobei-demo.com xiaobei-demo.com;
  35. rewrite ^ https://xiaobei-demo.com$request_uri permanent;
  36. }
  37. server {
  38. listen 443 ssl;
  39. server_name www.xiaobei-demo.com;
  40. ssl on;
  41. ssl_certificate /etc/letsencrypt/live/xiaobei-demo.com/fullchain.pem;
  42. ssl_certificate_key /etc/letsencrypt/live/xiaobei-demo.com/privkey.pem;
  43. ssl_ciphers "CHACHA20:GCM:HIGH:!DH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
  44. ssl_session_cache shared:SSL:10m;
  45. ssl_session_timeout 10m;
  46. rewrite ^ https://xiaobei-demo.com$request_uri permanent;
  47. }
  48. server {
  49. listen 443 ssl;
  50. server_name xiaobei-demo.com;
  51. root /wordpress/xiaobei-demo.com/;
  52. index index.php;
  53. charset utf-8;
  54. ssl on;
  55. ssl_certificate /etc/letsencrypt/live/xiaobei-demo.com/fullchain.pem;
  56. ssl_certificate_key /etc/letsencrypt/live/xiaobei-demo.com/privkey.pem;
  57. ssl_ciphers "CHACHA20:GCM:HIGH:!DH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
  58. ssl_session_cache shared:SSL:10m;
  59. ssl_session_timeout 10m;
  60. if ($request_method !~ ^(HEAD|GET|POST)$) {
  61. return 403;
  62. }
  63. location ~ /.well-known {
  64. allow all;
  65. }
  66. (html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|json|css|ttf|woff|woff2|eot|svg|flv|swf|map|xsl|zip)${
  67. add_header Access-Control-Allow-Origin *;
  68. expires max;
  69. }
  70. location / {
  71. fastcgi_pass 127.0.0.1:9000;
  72. fastcgi_index index.php;
  73. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  74. include fastcgi_params;
  75. try_files $uri $uri/ /index.php?$args;
  76. }
  77. }
  78. }

修改完成之后,执行以下命令,让 Nginx 重新加载配置文件即可:

  1. /opt/nginx/sbin/nginx -s reload

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

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