nginx 和 WordPress

我的上一篇文章中,我对 nginx 进行了初步的了解。nginx 是一款高性能的开源 HTTP 服务器,它使用单进程和单线程来处理大量的请求。nginx 的设计目标是速度和可扩展性,而 Apache 的设计目标是最大化灵活性和配置性。但多年来,nginx 也变得越来越灵活,越来越多的插件和模块可以用来定制其配置。凭借其性能、日益完善的文档和便利性,nginx 越来越受欢迎也就不足为奇了。

开源博客和 CMS 平台 WordPress 也变得非常受欢迎,这并不令人意外。我曾听人说,现在有 10% 的网站是使用 WordPress 运行的。即使这个数字不完全准确,毫无疑问,有大量的网站是由 WordPress 驱动的。我是一个基本上对 WordPress 感到满意的用户,在过去一年里,我将我的主站点和两个电子书站点都转换到了 WordPress,而此前多年我一直用它来驱动我的博客。

因此,我认为演示一下如何轻松地将 WordPress 与 nginx 结合起来会很有趣,考虑到这两个系统各自以及组合在一起的受欢迎程度。在我的上一篇文章中,我描述了如何使用 nginx 设置一个普通的 PHP 系统;WordPress 稍微复杂一些,但比您想象的要简单。从一个最基本的 Linux 安装开始,让我们逐步完成启动并运行 WordPress 所需的配置。

基础知识

为了同时安装 WordPress 和 nginx,您需要安装三个基本的软件系统:WordPress、nginx 和 MySQL。考虑到本文的目标,前两个是显而易见的;第三个是使用 WordPress 的副产品,因为 WordPress 专门与 MySQL 一起工作。

因此,在我的 Ubuntu Linux 机器上,我将运行以下命令


$ sudo apt-get install mysql-server mysql-client nginx-core
 ↪php5-cli php5-fpm php5-mysql

这将安装大量的软件包,但它将为您提供启动并运行系统所需的核心组件。请注意,您在这里没有安装 WordPress,这样您可以手动使用源代码安装它。实际上,通过 apt-get 安装 WordPress 也意味着安装 Apache;虽然当然可以撤销这个选择,但自己安装 WordPress 的好处超过了通过包管理器安装的好处。

作为此安装的一部分,您需要为您的 MySQL root 用户选择一个密码。这是您系统安全的重要组成部分,因此请务必使用强密码。

一旦包管理器完成上述软件包的安装,您将拥有一个可工作的 nginx 安装。试一下;您可以将浏览器指向服务器的 80 端口,您应该会看到默认的 nginx 页面,表明它已正确安装。

安装 WordPress

安装 WordPress 非常简单;复杂的部分是将 nginx 与 FPM(PHP 版本的 FastCGI)连接起来。如果您看过我的上一篇文章(在 2016 年 6 月刊中),您会看到 FPM 是 nginx 可以在单独的进程中运行 PHP 的方法,而不会使整个 nginx 进程膨胀或大幅降低性能。

在我的 nginx 配置中,HTML 文件的默认位置是 /usr/share/nginx/html。在该目录下,有一个 index.html 文件,其内容提供了您之前看到的 nginx 默认“欢迎”页面。

问题是,最简单的方法可能是在单独的目录中安装 WordPress。因此,我下载了 WordPress 并将其解压到 /usr/share/nginx/wordpress 下,这是一个无论如何都会在解压 tar 文件时创建的目录。以下是我所做的


$ cd /usr/share/nginx
$ wget https://wordpress.org/latest.tar.gz
$ tar -zvxf latest.tar.gz

现在 WordPress 已经安装好了,您将需要运行它。但是,在您创建 MySQL 数据库之前,您无法执行此操作,因为 WordPress 安装的一部分要求您的数据库能够工作并准备就绪。

那么,让我们创建一个新的 MySQL 数据库!有几种方法可以做到这一点。我通常更喜欢使用 mysqladmin 程序,它接受与 MySQL 客户端类似的选项,包括 -u 来指示您要使用的用户,以及 -p 来指示您要输入密码。两者都是必要的


$ mysqladmin create wordpress -u root -p

请注意,当我说您要在此处使用“root”用户时,我不是指 UNIX 级别的 root 用户。相反,我说的是 MySQL 的“root”用户,它对数据库拥有最终权限。当您之前安装 MySQL 时,您需要选择一个 root 密码。当提示您输入密码时,您必须输入此密码,这要归功于上面的 -p 选项。

您可以检查您的数据库是否已创建,方法是以 root 身份进入 MySQL(再次使用 -p 并在输入 root 密码后)


$ mysql -u root -p

然后,在 mysql> 提示符下发出命令 SHOW DATABASES。在我的全新系统上,我得到了以下响应


mysql> SHOW DATABASES;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| wordpress          |
+--------------------+
4 rows in set (0.01 sec)

请注意,除了我之前创建的“wordpress”数据库之外,系统中还有三个数据库。这些数据库供 MySQL 内部使用。实际上,您现在将从 UNIX shell 连接到 “mysql” 数据库,该数据库用于运行您的数据库


$ mysql mysql -u root -p

如果您愿意,您也可以从 MySQL 客户端内部切换到 “mysql” 数据库


mysql> \u mysql

无论哪种方式,您现在都应该以 root 身份连接到 “mysql” 数据库。接下来,您将创建一个 “wordpress” 用户,然后允许该用户连接到您的 MySQL “wordpress” 数据库。

我应该指出,当我与咨询客户合作时,他们使用 “root” 用户进行所有数据库连接并不罕见。毕竟,这更方便,对吧?但是,这几乎总是一个坏主意;出于安全原因,您真的希望拥有并使用单独的用户名。

连接后,您将创建一个用户,为其分配一个密码,并指示此新用户对 “wordpress” 数据库拥有完全权限


mysql> CREATE USER wordpress@localhost;
mysql> SET PASSWORD FOR wordpress@localhost = PASSWORD('my-wp-pw');
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO  wordpress@localhost;
mysql> FLUSH PRIVILEGES;

请注意,SQL 命令不区分大小写,因此您在输入它们时不需要使用大写字母。但是,多年来我一直这样做,遵循 Joe Celko 的 SQL For Smarties 书籍的建议,我发现这有助于区分程序的其他部分。

另请注意,在上述场景中,您创建了一个 “wordpress” 数据库和一个 “wordpress” 用户。实际上,您的用户与其说是名为 “wordpress”,不如说是 “wordpress@localhost”;在连接到 MySQL 时,主机名会被考虑在内。

最后,FLUSH PRIVILEGES 命令是必要的,以告知 MySQL 它应该考虑新的权限,即使不重启数据库服务器。

一旦完成此操作,您将需要对其进行测试,以确保您可以作为 “wordpress” 用户连接到 “wordpress” 数据库。在 UNIX shell 中,键入


$ mysql wordpress -u wordpress -p

当提示您输入密码时,输入您使用的密码(希望不是上面示例中的 “my-wp-pw”)。您应该看到 “welcome” 消息和 mysql> 提示符。如果这不起作用,请仔细检查您创建的用户名和密码,并确保您刷新了权限。

现在您知道您的配置工作正常,您将在名为 wp-config.php 的文件中设置您的 WordPress 配置。由于之前解压了 WordPress tar 文件,因此该文件位于目录 /usr/share/nginx/wordpress 中。

新的 WordPress 安装没有配置文件;您必须从系统附带的 wp-config-sample.php 文件中复制它


$ cp wp-config-sample.php wp-config.php

完成后,打开该文件,并查找定义 DB_NAMEDB_USERDB_PASSWORD 的三行。更改所有三个值以反映您在此处创建的数据库、用户名和密码;这是 WordPress 连接到您的数据库的方式。

配置 nginx

接下来,您需要配置 UNIX 级别的权限。每个进程都以特定用户身份运行,nginx 也不例外。在 Ubuntu 机器上,nginx 和 Apache 都以 “www-data” 用户和组身份运行。使用特定的用户 ID 运行此类程序可以确保正确的权限到位。但是,这也意味着您需要确保 WordPress 目录和文件归该用户所有。

因此,您可以说


$ cd /usr/share/nginx
$ sudo chown -Rv www-data:www-data wordpress

-R 选项告诉 chown 递归工作。-v 选项启用 “verbose” 模式,这意味着您可以在程序工作时获得额外的反馈。我通常更喜欢使用 -v 运行程序,以便为我提供更多反馈。

现在您必须配置您的 nginx 服务器。当您安装它时,主配置文件位于 /etc/nginx/nginx.conf 中。但是,现代 nginx 配置还包括每个服务器一个文件,这些文件位于 /etc/nginx/sites-enabled/ 中,其中文件 /etc/nginx/sites-enabled/default 描述了默认站点。

为了简单起见,我在这里假设您只有一个站点,这意味着您将能够仅修改单个 “default” 文件,而不是整体配置文件。

与 nginx 中通常一样,配置被分解为单独的块。server 块描述了应如何处理传入的 HTTP 请求;在这种情况下,您希望将端口 80 上收到的任何主机名的任何请求都传递给 PHP。以下服务器块可以做到这一点


server {
        listen 80 default_server;

        root /usr/share/nginx/wordpress;
        index index.php index.html index.htm;

        server_name localhost;

        location / {
                try_files $uri $uri/ /index.php?q=$uri&$args;
        }

        error_page 404 /404.html;

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                root /usr/share/nginx/html;
        }

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

让我们仔细研究一下上面内容,以便您了解正在发生的事情。

首先,您指示此服务器将侦听端口 80。除非您有充分的理由选择不同的端口,否则这可能是一个好主意。请注意,如果您希望使用 SSL,则 SSL 使用端口 443,并且还需要单独的 server 块。为了简单起见,我们在这里忽略这一点。

您还可以使用 default_server 来指示,如果有人提供的主机名指向您的 IP 地址,但未被任何其他主机名处理,则应使用此服务器。如果您的系统仅处理一个 HTTP 服务器,则应在您的配置中设置此指令。如果您的系统有多个虚拟 HTTP 服务器,则需要决定哪个应该是默认服务器。

root 指令描述了包含您要提供的文件的目录。在将 tar 文件解压到 /usr/share/nginx/wordpress 后,您告诉 nginx 该目录包含您要执行的 PHP 程序。实际上,只有一个 index.php PHP 程序在执行所有繁重的工作。

index 命令指示如果您不提供文件名,应读取哪些文件以及按什么顺序读取。注意:指示应首先尝试 index.php,以便在尝试静态替代方案之前给 WordPress 一个运行的机会。

server_name 指令告诉 nginx 此服务器应识别哪些名称。如果您使用 default_server 并且只有一个虚拟主机,则这并不重要。但是,如果您有多个服务器,则提供名称是一个好主意。

然后,您使用 location 块指示在收到对 “/” URL(即目录名)的请求时要执行的操作。此指令告诉 nginx 它应首先尝试您收到的 URL,但如果不起作用,则应调用 index.php,并将您收到的 URL 和任何参数传递给它。通过这种方式,index.php 成为您收到的任何和所有请求的守门人。

然后,您指示在发生错误时要执行的操作,将 404(“未找到文件”)与更严重的服务器端错误(50x 错误)分开。nginx 附带了用于这些错误的静态文件;如果您想要更丰富或更奇特的错误信息,您可以修改这些文件。

最后,您将 nginx 连接到 FPM,即我在上一篇文章中讨论的 PHP 后端系统。FPM 在单独的进程中运行 PHP,但使其持续运行,因此您不必每次都启动新进程。如果您发现 php5-fpm 没有运行,您可能需要使用以下命令启动它


$ sudo php5-fpm restart

完成上述操作后,您可以重启 nginx


$ sudo nginx restart

将您的 Web 浏览器指向您的 WordPress 系统的 IP 地址或主机名,您应该会看到一个请求,要求您选择一种语言作为 WordPress 安装的一部分。如果您看到了,那么您就成功了;您的服务器已启动并正在运行。转到下一页选择站点标题、管理员用户名、密码和电子邮件地址,一切就绪!

结论

如您所见,使用 nginx 设置 WordPress 非常容易。假设 PHP 已安装,并且 PHP 的 FPM 系统已安装并正在运行,您实际上可以在几分钟内启动并运行一个由 nginx 驱动的 WordPress 博客。虽然您可以通过 apt-get 或类似的包管理器安装 WordPress,但这意味着您的更新受您使用的 Linux 发行版的支配,这不可避免地会落后于 WordPress 发行版本身,更不用说插件了,插件可能是 WordPress 生态系统最重要的部分之一。

资源

nginx 是一款流行的服务器,因此,有很多关于它的信息来源。其中最好的来源之一是 nginx 的官方网站,该网站由为开发和支持 nginx 而成立的公司运营。从该网站,您可以阅读大量高质量的文档,包括一个包含许多用户提交的建议的 Wiki

当然,WordPress 是一款非常流行的开源产品。您可以在 WordPress 网站上阅读更多内容(更多内容)。虽然有大量的博客、书籍和参考文献可用于 WordPress,但我发现对于简单的安装和使用,几乎不需要任何文档。您可以下载、安装和使用它,而无需太多麻烦。话虽如此,如果您遇到问题,在 WordPress.org 和/或 Stack Overflow 上搜索通常会解决问题。

Reuven Lerner 在世界各地的公司教授 Python、数据科学和 Git。您可以订阅他的免费每周 “更好的开发者” 电子邮件列表,并从他的书籍和课程中学习,网址为 http://lerner.co.il。Reuven 与他的妻子和孩子住在以色列的莫迪因。

加载 Disqus 评论