如何在UbuntuVPS上将WordPress安装从Apache迁移到Nginx

来自菜鸟教程
跳转至:导航、​搜索

状态: 已弃用

本文介绍了不再受支持的 Ubuntu 版本。 如果您当前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:

原因: Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL) and no longer receives security patches or updates. This guide is no longer maintained.

请参阅: 本指南可能仍可用作参考,但可能不适用于其他 Ubuntu 版本。 如果可用,我们强烈建议使用为您正在使用的 Ubuntu 版本编写的指南。 您可以使用页面顶部的搜索功能来查找更新的版本。


介绍


WordPress 是一个流行的平台,可以轻松启动网站或博客。 它非常灵活,可以快速配置和修改,让您专注于您的内容而不是大部分配置。

虽然 WordPress 可以配置为在大多数 Web 服务器上运行,但对于许多人来说,一个流行的,也许是默认的选择是 Apache Web 服务器。 Apache 是健壮的并且得到很好的支持,但是当服务大量的客人时,它有时会遇到资源利用方面的问题。

Nginx 是另一种 Web 服务器,由于其易用性、灵活性和低资源使用率,它已迅速普及。 由于这些原因,许多人开始选择 Nginx 而不是 Apache 来托管他们的 WordPress 安装。 虽然有很多关于 如何使用 Nginx 安装 WordPress 的资源,但迁移现有安装有时似乎是一项艰巨的任务。

在本指南中,我们将讨论如何将现有的 WordPress 安装从 Apache 迁移到 Ubuntu 12.04 服务器上的 Nginx。 我们假设您已经按照 本指南 在 Ubuntu 12.04 上安装了 WordPress 和 Apache。 如果您以不同的方式安装它,您可能需要调整配置中的一些行。

安装 Nginx 和 PHP5-FPM


我们需要做的第一件事是安装 Nginx 服务器。 这在 Ubuntu 的默认存储库中可用,因此我们可以使用 apt-get:

sudo apt-get update
sudo apt-get install nginx

与 Apache 不同,Nginx 做出了不包含核心 PHP 处理功能的设计选择。 相反,Nginx 决定通过将这些请求传递给专用的 PHP 处理程序,它可以在解决问题的同时保持其重点。

使用 Nginx 执行 PHP 文件的标准选择是一个名为 php5-fpm 的实用程序。 我们需要安装这个包,以便我们的 WordPress 安装可以处理它所依赖的 PHP 文件:

sudo apt-get install php5-fpm

现在已安装所有必要的组件。 现在,我们可以开始配置我们的组件以接管 Apache 的实际工作。

配置 PHP5-FPM


我们将从配置 PHP 处理程序开始,因为这相对简单且容易。

首先,我们需要修改 php5-fpm 配置文件中的值。 现在打开它:

sudo nano /etc/php5/fpm/php.ini

找到cgi.fix_pathinfo参数,修改如下:

cgi.fix_pathinfo=0

这是一种安全措施。 如果将此参数设置为“1”,php5-fpm 将尝试通过查找请求的文件来提供 PHP 文件,然后如果没有找到精确匹配,它会尝试猜测并返回接近匹配。

这是非常不安全的,因为它可以让您的网站向外部用户公开敏感信息。 如果文件与请求的文件完全匹配,则 php5-fpm 返回文件会更安全,否则会向用户返回错误。 这就是我们的修改完成的。

完成后保存并关闭此文件。

接下来,我们需要修改另一个 PHP 配置文件,以便我们的处理器可以正确连接到我们的 Web 服务器。

使用文本编辑器打开此文件:

sudo nano /etc/php5/fpm/pool.d/www.conf

找到定义 listen = 指令的位置。 我们将对其进行修改以使用套接字与 Web 服务器进行通信。 修改它,使其显示为:

    listen = /var/run/php5-fpm.sock

完成后,保存并关闭文件。

要启用我们的更改,我们需要重新启动 php5-fpm 服务:

sudo service php5-fpm restart

创建 Nginx 服务器块配置


现在,我们准备好配置我们的 Nginx 服务器块。 Nginx 服务器块类似于 Apache 虚拟主机,因为它们描述了特定站点的配置。

与 Apache 一样,Ubuntu 上的 Nginx 通过 sites-available 目录配置站点,然后将这些站点链接到 sites-enabled 以提供服务。 我们将修改默认配置文件,以便为我们的 WordPress 安装服务。

现在打开该文件:

sudo nano /etc/nginx/sites-available/default

在配置文件中,删除已经存在的信息。 我们将从头开始,这样我们就可以讨论我们正在构建的整个文件中发生了什么。

首先,我们需要创建一个服务器块。 这是单个网站的基本组织单位。 当服务器启动或重新加载时,这些文件会合并到 Nginx 配置中。 它们继承默认值,并且可以修改它们。

server {

}

首先,重要的是要知道每个 Nginx 指令必须以分号 (;) 结尾。 不包含这个会导致 Nginx 对文件的误解,这很可能会导致服务器无法启动。

在 server 块中,我们指定该站点应侦听的端口以获取用户的连接。 默认情况下,到 Web 浏览器的 HTTP 流量在端口 80 上提供服务,因此我们将告诉 Nginx 查找连接。

我们还想指定文档根目录,默认情况下存储我们的 WordPress 文件。

如果您按照上面的指南进行操作,WordPress 文件应该位于 /var/www 目录中。 如果您以其他方式安装,您的 WordPress 文件可能存储在 /var/www/wordpress/home/wordpress/public_html 或其他位置。 调整 root 指令的值以匹配您的配置。

服务器{听80;
root <span class="highlight">/var/www</span>;

}

接下来,我们将添加一个指令,告诉 Nginx 在请求目录时尝试提供哪些文件。 用于描述目录的文件称为目录索引。 使用 WordPress,此文件将被称为 index.php。 其他用 HTML 编写的索引文件可以用作后备。

我们还需要指定我们的服务器将响应的域名。 虽然如果 WordPress 是我们配置的唯一站点,这可能并不重要,但包含此指令将允许我们添加其他站点而无需再次修改此文件。 我们可以通过在初始 server_name 之后命名它们来包含要匹配的替代名称(例如以“www”开头的站点):

服务器{听80;
root <span class="highlight">/var/www</span>;
index index.php index.html index.htm;

server_name <span class="highlight">your_domain.com</span> www.<span class="highlight">your_domain.com</span>;

}

我们放入服务器块的其余信息将进一步划分为位置块。 位置块允许我们为请求匹配特定模式时的操作指定特定规则。

首先,我们将创建一个与根分区匹配的位置块。 这将适用于您使用 root 指令定义的文件夹中的文件。 此块将包含有关如何尝试提供文件的一般规则。

我们将添加的规则将告诉 Nginx 尝试查找与域名后请求的确切资源匹配的文件。 如果它不成功,它应该尝试找到一个同名的目录。 如果这也不成功,它会将请求的资源传递给 PHP 脚本,该脚本将尝试找到处理请求的好方法。

在这个位置块之后,我们将定义一个块来实际处理将 PHP 脚本传递给我们的 php5-fpm 工具。 这使用我们在 php5-fpm 配置文件中定义的信息进行连接。

服务器{听80;
root <span class="highlight">/var/www</span>;
index index.php index.html index.htm;

server_name <span class="highlight">your_domain.com</span> www.<span class="highlight">your_domain.com</span>;

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

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

}

在这一点上,我们只想收紧一些事情。 我们将为 Nginx 如何尝试服务 favicon 请求和 robots.txt 请求(搜索引擎用于索引站点)创建一些规则。 我们不需要记录对此信息的请求。

之后,我们有一个拒绝访问任何隐藏文件夹的位置块(在 Linux 系统中由起始点表示)。 这将阻止我们提供可能已用于 Apache 配置的文件,例如 .htaccess 文件。 对我们的用户保留这些文件更加安全。

最后,我们阻止从上传或文件目录中运行或访问任何 PHP 文件。 这可以防止我们的服务器执行恶意代码。

我们完成的文件应该如下所示:

服务器{听80;
root <span class="highlight">/var/www</span>;
index index.php index.html index.htm;

server_name <span class="highlight">your_domain.com</span> www.<span class="highlight">your_domain.com</span>;

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

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

location = /favicon.ico {
    log_not_found off;
    access_log off;
}

location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}

location ~ /\. {
    deny all;
}

location ~* /(?:uploads|files)/.*\.php$ {
    deny all;
}

}

完成后,保存并关闭文件。 这个文件应该已经链接到 sites-enabled 目录,所以当我们启动 Nginx 时它应该是活动的。

进行开关


目前,Apache 在端口 80 上提供我们的文件。 这意味着 Nginx 无法绑定和监听该端口。 在启用 Nginx 接管之前,我们需要停止 Apache。

在某些情况下,如果 Apache 涉及在您的服务器上提供其他内容,您可能希望保留它。 您可能有多个站点,并且仅将单个站点转换为 Nginx。 如果是这种情况,您需要在 Apache 配置中禁用对端口 80 的所有引用。

您需要检查的一些文件是:

/etc/apache2/ports.conf
/etc/apache2/apache2.conf
/etc/apache2/httpd.conf
/etc/apache2/sites-enabled/    ## Search all sites in this directory

如果您要继续使用 Apache 为站点提供服务,最终不得不将 Apache 端口从 80 更改为其他端口,则必须通过 Nginx 代理这些站点,以便可以从 Internet 访问它们。 这超出了本教程的范围,但是您可以在这篇文章中找到相关信息。

如果您仍然需要运行 Apache 来提供某些内容,则在配置文件中切换端口后,您可以在打开 Nginx 时简单地重新加载 Apache。 这会将您的 80 端口内容切换到 Nginx,同时允许 Apache 继续为其他内容工作:

sudo service apache2 reload && sudo service nginx start

但是,如果您不再需要 Apache,并且您已将所有内容转移到 Nginx,您可以在加载 Nginx 之前关闭 Apache:

sudo service apache2 stop && sudo service nginx start

重要的是 Apache 要么放弃对端口 80 的控制,要么在启动 Nginx 之前完全停止。 不这样做可能会导致您的 Nginx 初始化无法完成,因为它被告知使用的端口不可用。

如果您的转换成功并且您的内容全部由 Nginx 提供,您可以卸载 Apache 和所有未使用的依赖项。

您可以通过键入以下内容找到这些:

dpkg --get-selections | grep apache

apache2                         install
apache2-mpm-prefork             install
apache2-utils                   install
apache2.2-bin                   install
apache2.2-common                install
libapache2-mod-auth-mysql       install
libapache2-mod-php5             install

然后,您可以通过键入以下内容来卸载它们:

sudo apt-get remove apache2 apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common libapache2-mod-auth-mysql libapache2-mod-php5

您还可以通过键入以下内容来处理不再需要的依赖项:

sudo apt-get autoremove

结论


您的 WordPress 现在应该重新启动并运行,这一次由 Nginx 提供支持。 虽然 Apache 和 Nginx 都以相似的方式运行,尤其是在支持像 WordPress 这样的全功能前端时,但 Nginx 通常可以用更少的资源完成相同的工作。

虽然这不一定会带来更快的网站,但当您的网站获得大量流量时,它变得非常重要。 使用更少的资源意味着您的 Web 服务器可以在较重的负载下继续正常运行。 如果您的内容被重新发布并开始看到大量流量,这可能很重要。 Nginx 将帮助您处理这些流量,而无需分配额外的资源。

贾斯汀·艾林伍德