第三章 —— WordPress部署 · LNMP环境搭建

📝 简单介绍一下 WordPress

WordPress 是全球使用最广泛的建站系统(CMS),功能强大、上手简单,既适合个人博客,也能扩展为企业官网、电商平台等。
它基于 PHP 和数据库运行,访问方式则依赖于 Web 服务程序(如 Nginx 或 Apache)。


📦 安装 WordPress 前,你需要准备哪些组件?

WordPress 本身不是一个“独立程序”,它需要依托完整的网站运行环境。你需要:

组件作用简述
Nginx(或 Apache)处理网页请求,提供 HTTP/HTTPS 服务(建议启用 SSL)
PHP解析 WordPress 的后台逻辑代码
数据库(如 MariaDB/MySQL)存储文章、用户、评论等网站数据
邮件服务(推荐,也可以用第三方邮件服务)支持用户注册通知、密码重置等功能

Nginx、PHP、MariaDB数据库和Linux系统就构成了LNMP环境。


⚙️ 配置 WordPress 环境的基本流程

搭建支持WordPress服务器环境并不复杂,只要按照以下步骤一步步来:

  1. 域名解析
    将你购买的域名指向服务器 IP,让访问者能通过地址找到你的网站。
  2. 安装软件包
    安装 Nginx、PHP、数据库(如 MariaDB)、SSL 工具等核心组件。
  3. 申请 SSL 证书
    使用 Let’s Encrypt 等服务,为你的网站开启 HTTPS 加密访问。
  4. 初始化数据库
    使用mysql_secure_installation程序初始化数据库。
  5. 配置 Nginx
    设置server块,重定向,SSL等,使 Nginx 能正确运行。
  6. 配置防火墙规则
    开放必要端口(如 80、443)。
  7. 测试网站访问
    打开浏览器,输入域名,确认是否能正常打开测试界面。

📌 以上步骤将构建出一个稳定、安全、支持 HTTPS 的 WordPress 环境。我们将逐步完成每一步操作,哪怕你是第一次搭建网站,也能轻松跟上。

配置域名解析

进入域名管理后台,添加一条A记录,主机名为www。这样用户用www.example.comexample.com就能访问到你的服务器了。

软件安装

安装必要的软件包

$ sudo dnf install nginx php mariadb-server
$ sudo dnf install python3 augeas-libs #后续申请ssl证书要用

申请SSL证书

🌐 什么是SSL?

SSL全称是 Secure Sockets Layer,中文叫“安全套接字层”,是一种用于加密互联网通信的技术。目前说的SSL是指它的继承者TLS1.2和TLS1.3

SSL 就像给你在互联网上传递的信息装上一把锁,确保别人看不到你传的内容,也不能偷偷篡改。

🔐 SSL的主要作用?
  • 加密数据 —— 把你发的数据(用户名、密码、聊天内容)变成一堆乱码,别人截获也看不懂
  • 验证身份 —— 确保你连的是“真正的”服务器,而不是一个伪装的网站(防钓鱼)
  • 保证数据完整 —— 确保传输过程中数据不会被篡改
🔐 SSL的工作原理?

我们以浏览器访问一个HTTPS网站为例:你访问https://example.com,这个过程涉及到身份验证密钥协商对称加密通信等多个阶段。

✅ 第 1 步:客户端发起连接(Client Hello)

浏览器(客户端)发送ClientHello给服务器,包含:

  • 支持的加密算法列表(例如RSA、ECDHE)
  • 支持的TLS版本(如TLS 1.2)
  • 一个随机数ClientRandom
  • 支持的压缩方式、扩展字段等

✅ 第 2 步:服务器响应(Server Hello)

服务器回应ServerHello,内容包括:

  • 选定的加密算法(比如RSA + AES + SHA256)
  • 服务器的数字证书(包含公钥、公钥算法、域名、签名等)
  • 一个随机数ServerRandom

此时客户端就拿到了服务器的公钥


✅ 第 3 步:客户端验证证书合法性

浏览器会:

  • 检查证书是否由受信任的CA 签发
  • 检查证书是否过期、是否吊销
  • 检查证书中的域名是否匹配当前网站

若验证失败,会弹出“不安全网站”警告。


✅ 第 4 步:客户端生成预主密钥(Pre-Master Secret)
  • 客户端生成一个随机值:PreMasterSecret
  • 用服务器的公钥加密它,发给服务器

注意:这一步使用了“非对称加密”:客户端用公钥加密,只有服务器用私钥能解密


✅ 第 5 步:服务器解密Pre-Master Secret
  • 服务器用自己的私钥解密出PreMasterSecret

✅ 第 6 步:双方计算“主密钥”和对称加密密钥
  • 使用三部分共同生成:Master Secret = function(ClientRandom, ServerRandom, PreMasterSecret)
  • 接下来,浏览器和服务器用相同的Master Secret生成对称加密用的密钥(比如AES)

✅ 第 7 步:开始用对称加密通信

握手完成后:

  • 所有后续数据(如网页内容、表单、密码)都会用 对称加密(AES) 加密传输
  • 通信变得既安全又高效

❓ SSL证书如何申请?

我们采用Let’s Encrypt的免费证书,每三个月需要续一次。

$ sudo python3 -m venv /opt/certbot/
$ ls /opt/certbot/ #这里会看到上面的命令生成了一些文件和目录。
$ sudo /opt/certbot/bin/pip install --upgrade pip
$ sudo /opt/certbot/bin/pip install certbot
$ sudo /opt/certbot/bin/pip install certbot-nginx #安装nginx插件,申请证书的同时会自动修改nginx.conf的配置。(可选)
$ sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot
$ sudo certbot certonly --standalone #standalone模式会启动一个http server,与let's encrypt通信。

在shell中输入你自己的域名,可以输入多个域名,一般来说www.example.comexample.com都写上。这样用户在访问你网站的时候,无论用www.example.com还是example.com都能正确获得网站的SSL证书,提高网站的可信度。

Let’s Encrypt 颁发证书的原理基于自动化的证书管理,主要使用 ACME(Automated Certificate Management Environment)协议进行身份验证和证书签发。其核心流程如下:

(1) 申请证书

你的服务器(运行 Let’s Encrypt 客户端,如certbot)会向 Let’s Encrypt 发送申请,表明希望获取某个域名的证书。

(2) 域名所有权验证

Let’s Encrypt 需要验证你对该域名的控制权。它提供两种主要的挑战方式:

  • HTTP-01(最常用)
  • DNS-01(适用于 Wildcard 证书)
① HTTP-01 验证
  • Let’s Encrypt 服务器会要求你的服务器在 http://example.com/.well-known/acme-challenge/ 目录下放置一个特殊的 token 文件。
  • Let’s Encrypt 服务器会访问 http://example.com/.well-known/acme-challenge/<token>,并检查该 token 是否正确。
  • 如果 Let’s Encrypt 服务器能正确获取 token,则证明你对该域有管理权。
② DNS-01 验证(主要用于通配符证书)
  • Let’s Encrypt 服务器要求你在 DNS 记录中添加一个 TXT 记录(通常以 _acme-challenge.example.com 为前缀)。
  • Let’s Encrypt 服务器会查询该 TXT 记录,如果值与要求的 token 匹配,则验证成功。
(3) 证书签发

验证成功后,Let’s Encrypt 会使用其私钥为你的域名生成并签署 SSL 证书,并将其返回给你的客户端(如 certbot)。

申请到的证书位于:

/etc/letsencrypt/live/example.com/fullchain.pem #公钥
/etc/letsencrypt/live/example.com/privkey.pem #私钥
或
/etc/letsencrypt/live/www.example.com/fullchain.pem #公钥
/etc/letsencrypt/live/www.example.com/privkey.pem #私钥
具体的路径取决于申请证书时哪个域名在前面

验证一下是否证书包含了你输入的域名:

$ sudo openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -text | grep DNS:

之后配置nginx的时候将引用这些证书。

初始化数据库

shell中执行:

$ sudo mysql_secure_installation

该程序可以通过以下方式提高MariaDB的安全性:

  • 为root帐户设置密码。
  • 删除可从本地主机外部访问的root帐户。
  • 删除anonymous-user帐户。
  • 删除test数据库。

完成后启动数据库。

$ sudo systemctl enable mariadb
$ sudo systemctl start mariadb

配置nginx

安装nginx后,其默认的配置文件位于/etc/nginx/nginx.conf。本章中我们主要针对80 server块和443 server块进行配置。

  • 80 server块配置
server_name  www.example.com example.com; #当用户用http://example.com或者http://www.example.com访问你时,会加载该server块中的指令。

# Redirect all HTTP requests to HTTPS
return 301 https://$host$request_uri; 
#当前几乎所有网站都要支持SSL/TLS,以提高可信度,确保通信内容不被中间人截获。该指令将所有的http流量重定向到https。
#即用户通过http://example.com访问你,会被重定向到https://example.com
  • 443 server块配置
server_name  www.example.com example.com;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout  10m;
ssl_ciphers PROFILE=SYSTEM;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2 TLSv1.3;

完成后启动nginx。

$ sudo systemctl enable nginx
$ sudo systemctl start nginx

配置防火墙规则

防火墙规则是许多人容易忘记的步骤,很容易发生明明配置正确,却访问不了服务器的问题。导致兜兜转转一大圈才想起来原来防火墙没放行。切记切记。

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
$ sudo firewall-cmd --reload

这里不用放行数据库流量,因为只有一台服务器,应用对于数据库的访问都在本地进行。

测试

现在打开浏览器访问自己的域名,会显示nginx的测试页面。检查浏览器地址栏是否是https连接。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注