NGINX.COM
Web Server Load Balancing with NGINX Plus

WordPress 的安装方法数不胜数,在撰写本文之时,Google 搜索“WordPress 安装”的条目多达 488,000 条。虽然如此,但能够全面解释如何以支持长期维护的方式安装 WordPress 和底层操作系统的教程却寥寥无几。原因可能是正确的配置很大程度上取决于具体的需求,也可能是全面的安装教程无法通过简单几句话解释清楚。

在这篇文章中,我们将试着就此给出解决办法。我们提供了在 Ubuntu 上自动执行 WordPress 安装的 bash 脚本,并详细解释了各部分的作用以及我们的考量取舍。(如果您是一名高级用户,则可跳过这篇文章,直接进入脚本部分,下载并根据您的环境进行修改。)最终的 WordPress 安装文件是一份可编写脚本,支持 Let’s Encrypt,使用 NGINX Unit,并已针对生产环境完成设置。

我们延续了上一篇博客中介绍的通过 NGINX Unit 部署 WordPress 的基本架构,另外还安装和配置了上一篇博客(或许多其他教程)中没有涵盖的特性:

  • The WordPress CLI
  • Let’s Encrypt 和 TLS/SSL 证书
  • Let’s Encrypt 证书自动更新
  • NGINX 缓存
  • NGINX 压缩
  • NGINX HTTPS 和 HTTP/2
  • 流程自动化

本篇文章描述了在同时托管静态资源 Web 服务器、PHP 处理服务器和数据库的单个节点上设置 WordPress 的方法。未来,我们将介绍多主机、多服务的 WordPress 配置安装。您还希望我们讨论什么主题?请在文末评论区告诉我们!

前提条件

  • 计算实例:容器(LXCLXD)、虚拟机或裸机,至少具有 512 MB 可用内存,运行 Ubuntu 18.04 或更高版本
  • 计算实例的 80 和 443 端口向 Internet 开放
  • 已经与计算实例的公共 IP 地址相关联的域名
  • root权限或通过 sudo 获取的同等访问权限

架构概述

应用架构为三层 Web 应用,与上一篇博客中描述的应用架构相同。其中包括必须由 PHP 处理器执行的 PHP 脚本和必须由 Web 服务器传递的静态文件。

一般原则

  • 为了实现幂等,脚本中的许多配置命令都包含在条件语句(if语句)中,:脚本可以多次运行,并且不会更改正确的设置。
  • 脚本首选通过存储库安装软件,以支持您通过单个命令(例如 Ubuntu 的apt upgrade)安装系统安全补丁。
  • 这些命令将检测其运行环境是否是容器,并相应地进行配置更改。
  • 当指定配置中运行的进程或线程数时,脚本会提供适用于容器、虚拟机或裸机的最佳自动配置参数(NGINX Unit 在第 278 行NGINX 在第 306 行)。
  • 我们使用自动化为先的方法编写配置,希望可以为您创建自己的可重用基础架构即代码提供参考模型。
  • 所有命令都以 root 身份运行,因为它们更改了核心系统配置,但在运行时状态下,WordPress 以常规用户身份运行。

设置环境变量

请在运行脚本之前设置以下环境变量。

  • WORDPRESS_DB_PASSWORD – WordPress 数据库的密码。
  • WORDPRESS_ADMIN_USER – WordPress 管理员的用户名。
  • WORDPRESS_ADMIN_PASSWORD – WordPress 管理员的密码。
  • WORDPRESS_ADMIN_EMAIL – WordPress 管理员的电子邮件地址。
  • WORDPRESS_URL – WordPress 网站的完整 URL,以https://开头。
  • LETS_ENCRYPT_STAGING – 默认为空,但如果使用 Lets Encrypt 暂存服务器,则设为 1,频繁测试新的部署配置时必需进行此操作。否则,Let’s Encrypt 可能会因请求数量过多而暂时拦截您的 IP 地址。

脚本将检查是否已设置与 WordPress 相关的变量,如果未设置,则退出(第 8–42 行,此处未显示)。第 572-576 行 将检查LETS_ENCRYPT_STAGING的值。

设置派生环境变量

脚本(第 55-61 行,此处未显示)将以下环境变量设置为硬编码值或上一节中设置的变量的派生值。

  • DEBIAN_FRONTEND="noninteractive" – 指示应用自动化脚本正在执行命令,无法进行用户交互。
  • WORDPRESS_CLI_VERSION="2.4.0" – WordPress CLI 的下载版本。
  • WORDPRESS_CLI_MD5= "dedd5a662b80cda66e9e25d44c23b25c" – WordPress CLI 2.4.0 二进制文件(WORDPRESS_CLI_VERSION变量指定的版本)的加密校验和第 162 行 使用该值验证下载的 WordPress CLI 版本是否正确。
  • UPLOAD_MAX_FILESIZE="16M" – WordPress 支持上传的最大文件体积。此设置在配置中的多个位置使用,可以对其进行集中定义。
  • TLS_HOSTNAME= "$(echo ${WORDPRESS_URL} | cut -d'/' -f3)" – 从 WORDPRESS_URL 变量中提取的系统可寻址主机名。用于从 Lets Encrypt 获取适当的 TLS/SSL 证书,以及 WordPress 自身的 ping 操作(请参见 将 WordPress 网站主机名添加到 /etc/hosts)。
  • NGINX_CONF_DIR="/etc/nginx" – 包含 NGINX 配置和主配置文件 strong>nginx.conf 的目录路径。
  • CERT_DIR="/etc/letsencrypt/live/${TLS_HOSTNAME}" – WordPress 网站主机名(派生自 TLS_HOSTNAME 变量)Let’s Encrypt 证书的路径。

将 WordPress 网站主机名分配给计算实例

脚本将计算实例的主机名设置为与 WordPress 网站的域名相匹配。并非所有配置都需要进行此设置,但在单主机设置(如脚本配置的设置)中通过 SMTP 发送出站电子邮件时此设置将非常有帮助。

将 WordPress 网站主机名添加到 /etc/hosts

WordPress 使用 WP‑Cron 插件运行计划任务,前提是 WordPress 可以通过 HTTP 进行 ping 操作。为了确保 WP-Cron 能够在所有环境中正常运行,脚本在/etc/hosts中添加了一个条目,从而让 WordPress 可以通过本地环回接口路由至自身。

后续步骤所需的安装工具

后面的脚本部分将使用某些实用程序,并假定存储库索引已更新。我们更新存储库索引(第 77 行)并即刻安装所需工具 (第 78-84 行)

添加 NGINX Unit 和 NGINX 开源库

脚本通过 NGINX 官方存储库安装 NGINX Unit 和 NGINX 开源库,以确保我们始终拥有最新的安全更新和补丁修复程序。

此处,脚本通过为系统添加签名密钥并为 apt 配置(定义 Internet 上的存储库位置)添加文件来安装 NGINX Unit 库(第 87–91 行)和 NGINX 开源库(第 94–98 行)

NGINX Unit 和 NGINX 开源库实际在下一部分才开始安装。为避免多次更新元数据,我们预先添加了存储库,加快了整体安装速度。

安装 NGINX、NGINX Unit、PHP MariaDB、Certbot (Let’s Encrypt) 和依赖 (Dependencies)

安装完所有存储库后,我们将更新存储库元数据并安装应用。脚本安装的软件包包括运行 WordPress 时推荐的PHP 扩展插件

为 NGINX Unit 和 WordPress 配置 PHP

脚本在 PHP conf.d 目录 (第 136-174 行)中创建一个配置文件。该文件设置了 PHP 上传文件的最大体积(第 142 行),将 PHP 错误定向到STDERR (第 145 行),以便将它们记录在 NGINX Unit 日志中,及重启 NGINX Unit(第 151 行)。

初始化 WordPress MariaDB 数据库

我们选择使用 MariaDB 而不是 MySQL 作为 WordPress 数据库。MariaDB 背后有一个更活跃的开源社区,可以说它能够提供更出色的开箱即用性能

脚本初始化新数据库,并为 WordPress 创建凭证,以通过本地环回地址进行访问。

安装 WordPress CLI 实用程序

现在,脚本将安装WP-CLI 实用程序。使用该程序安装和管理 WordPress 可以让您完全控制 WordPress 配置,而无需手动修改文件,更新数据库或导航到 WordPress 管理员面板。 您还可以使用该程序安装主题或插件及升级 WordPress。

安装和配置 WordPress

脚本将最新版本的 WordPress 安装在/var/www/wordpress目录下,并进行以下设置:

  • 数据库通过 Unix 域套接字环回接口而不是 TCP 环回接口连接,以减少 TCP 通信量(第 175 行)。
  • 当客户端通过 HTTPS 连接到 NGINX 时,WordPress 将向 URL 添加https:// 前缀,并将远程主机名(由 NGINX 提供)传递 给 PHP。我们为此配置使用一段 PHP 代码(第 180-189 行).
  • WordPress 需要使用 HTTPS 进行登录(第 194 行)。
  • WordPress 的默认 URL 结构是资源型结构(第 201 行)。
  • 为 WordPress 目录设置正确的文件系统权限(第 207-210 行)

配置 NGINX Unit

脚本将 NGINX Unit 配置为运行 PHP 和处理 WordPress 路径、隔离 PHP 进程命名空间,并调谐性能设置。以下三个特性需要注意:

  1. 命名空间支持根据脚本是否正在容器中运行有条件地进行定义(第 213-224 行)。必需采用这种定义方式,原因是大多数容器配置都不支持在其内部运行其他容器。

  2. 启用命名空间支持后,network 命名空间将被禁用(第 218 行)。要支持 WordPress 访问自己的端点并连接 Internet 必需禁用 network 命名空间。

  3. 使用以下算法计算最大进程数(第 226-228 行):(运行 MariaDB 和 NGINX Unit 的可用内存)/(PHP 内存限制 + 5)。 然后在第 277-280 行的 NGINX Unit 配置中设置该值。

    此值可确保始终至少有两个 PHP 进程在运行,这一点很重要,因为 WordPress 自身会进行多次异步调用,并且如果没有其他进程运行,WP-Cron 等操作将会失败。由于此处生成的设置是保守设置,因此您可能需要根据特定的 WordPress 配置增减此设置。许多生产系统设置通常在 10 到 100 之间。

配置 NGINX

配置核心 NGINX 参数

该脚本为 NGINX 缓存目录创建了一个目录(第 301 行),并创建了 NGINXnginx.conf 主配置文件 (第 304–341 行)。配置设置中包括 NGINX 工作进程数(第 306 行)和上传文件的最大体积(第 325 行)。第 329 行导入了 下一部分中定义的压缩配置,第 332–337 行设置了缓存参数。

配置 NGINX 压缩设置

在将内容发送给客户端之前动态压缩内容能够有效提高网站性能,但前提是压缩配置正确无误。脚本使用 GitHub 上 h5bp 存储库 中的配置(第 346–414 行)

为 WordPress 配置 NGINX 参数

接下来,脚本在 conf.d 目录下创建一个名为default.conf 的 NGINX 配置文件,并设置 WordPress(第 417–541 行)。配置如下:

  • 启用通过 Certbot 从 Let’s Encrypt 获得的 TLS 证书(第 445-447 行;有关 Certbot 的配置问题,请参见下一部分)。
  • 实施由 Let’s Encrypt 定义为最佳实践的 TLS 安全设置(第 449-454 行
  • 默认情况下,启用代理请求的缓存时间为 1 小时(第 458 行)
  • 禁用两个常见请求文件favicon.icorobots.txt 的访问日志记录,以及在找不到资产时的错误日志记录(第 465-474 行)。
  • 拒绝访问隐藏文件和某些.php文件,以防止非法访问或无意执行(第 476–500 行)
  • 禁用静态文件内容和字体文件的访问日志记录(第 503-510 行)
  • 设置字体文件的Access-Control-Allow-Origin header (第 508 行)。
  • 将路由设置应用于index.php 文件和其他静态文件(第 512–539 行)

配置 Certbot 以处理 Let’s Encrypt 证书和自动更新

Certbot 是电子前沿基金会 (EFF) 推出的一款免费工具,可从 Let’s Encrypt 获取并自动更新 TLS 证书。脚本将执行以下操作,配置 Certbot 为 NGINX 处理Let’s Encrypt 证书:

  • 关闭 NGINX(第 544 行)
  • 使用当前推荐的设置下载 TLS 参数(第 550–564 行)
  • 运行 Certbot 为站点检索 TLS 证书(第 578–585 行)
  • 重启 NGINX 以使用 TLS 证书(第 588-589 行)
  • 将 Certbot 配置为每天凌晨 3:24 运行,并检查是否需要更新 TLS 证书;如果需要更新,则将下载新的证书并重新加载 NGINX(第 591-594 行)

自定义您的 WordPress 网站/h2>

以上为您介绍了我们的bash脚本如何配置 NGINX 开源版和 NGINX Unit,以托管一个启用 TLS/SSL 的生产就绪型网站。您可能想要根据自己的需求进一步定制您的网站:

为了获得更出色的网站性能,建议您升级到我们基于 NGINX 开源版的企业级商业支持产品NGINX Plus。NGINX Plus 用户可享受动态加载的 Brotli module,和 NGINX ModSecurity WAF(需额外付费)。我们还为您提供了基于 F5 业界领先安全技术的 NGINX Plus WAF 模块 NGINX App Protect

想要通过 NGINX Plus 试用脚本?立即下载30 天免费试用版,或与我们联系以讨论您的用例

Hero image
免费白皮书:
NGINX 企阅版全解析

助力企业用户规避开源治理风险,应对开源使用挑战

关于作者

Elijah Zupancic

Solution Architect

关于 F5 NGINX

F5, Inc. 是备受欢迎的开源软件 NGINX 背后的商业公司。我们为现代应用的开发和交付提供一整套技术。我们的联合解决方案弥合了 NetOps 和 DevOps 之间的横沟,提供从代码到用户的多云应用服务。访问 nginx-cn.net 了解更多相关信息。