如何在Ubuntu14.04上使用Nginx设置WordPress多站点
介绍
WordPress 的多站点功能提供了从单个 WordPress 安装创建多个网站的能力。 每个站点都可以有一个单独的主题、插件集和内容集合(帖子和页面)。 这减少了维护和更新多个 WordPress 安装的开销,同时允许您托管多个彼此完全无关的站点。
WordPress 多站点有两种风格:子目录或子域。 在本教程中,我们将设置 WordPress 多站点以使用子域。 这意味着我们创建的网站将有一个子域网址,例如 http://wp-site.yourdomain.com。 这可以映射到外部域,例如 http://wp-site.net,以便每个站点看起来独立于外部。
先决条件
本教程要求用户具备以下知识:
我们将创建三个具有以下域名的 WordPress 站点:
- 站点 1:
领域: 示例wp.com (Primary domain)
This is the site that is created when WordPress is installed.
- 站点 2:
外部域: 购物网站
子域: 购物网站.example.com
- 站点 3:
外部域: 公司网站.org
子域: companysite.example.com
第一个域是安装 WordPress 的主域名。 确保 为所有三个域 设置 DNS 以指向将托管 WordPress 的 Droplet 的 IP 地址。
第一步 - 设置 DNS 通配符记录
在本节中,我们将为 主域 添加 DNS 通配符记录,以便随时添加更多站点,而无需单独的 A 记录。 (或者,您可以为每个子域添加新的 A 记录。)
注意: 仅对 * 主域 (本教程中的 examplewp.com)必须这样做。
登录到您的 DigitalOcean 控制面板并导航到网络部分。 编辑主域并为此域创建通配符 A 记录 ,指向 Droplet 的 IP 地址。 通过在主机名输入框中输入星号 (*) 来创建通配符记录,如下面的屏幕截图所示。
如果您将域的 DNS 托管在其他地方,则应在此处设置通配符记录。
您现在应该看到的内容:
任何 random-sub-domain.examplewp.com 的 DNS 查询都应该返回您的 Droplet 的 IP 地址。
第二步 - 安装和配置 LEMP 堆栈
在本节中,我们将安装和配置 Nginx、MySQL 和 PHP。 有一篇关于 设置 LEMP 堆栈 的详细文章,如果您愿意,可以参考。 本节将用作快速设置。 在创建 Droplet 时,Select Image 部分的 Applications 选项卡下还有一个 LEMP on Ubuntu 14.04 图像。
更新存储库并安装 Nginx、MySQL、PHP5-FPM 和其他必要的 PHP 模块。
apt-get update apt-get install -y nginx mysql-server php5-fpm php5-mysql php5-curl php5-mcrypt php5-gd
安装 MySQL 服务器时,系统会提示您输入 root 数据库用户的密码。 请输入强密码,不要留空。 您将输入两次密码。
为 Nginx 创建一个包含 WordPress 文件的文档根目录。 我们将在本教程中使用 /usr/share/nginx/wordpress。
mkdir /usr/share/nginx/wordpress
我们将用我们自己的替换 Nginx 的默认虚拟主机,因此在 sites-enabled 目录中删除其符号链接。
rm /etc/nginx/sites-enabled/default
在 sites-available 目录中创建一个新的虚拟主机文件。 这个文件可以任意命名。 在我们的示例中,我们将其称为 wp-ms。
nano /etc/nginx/sites-available/wp-ms
编辑此文件并放置以下配置。 根据您的环境编辑以红色突出显示的文本。 在 server_name
行中,您应该添加所有三个(或更多)多站点域,以及第一个域的通配符子域。
server { listen [::]:80 ipv6only=off; server_name examplewp.com *.examplewp.com shoppingsite.com companysite.org; root /usr/share/nginx/wordpress; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$args ; } location ~ /favicon.ico { access_log off; log_not_found off; } location ~ \.php$ { try_files $uri /index.php; include fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; } access_log /var/log/nginx/$host-access.log; error_log /var/log/nginx/wpms-error.log; }
如果此 Droplet 将仅托管此 WordPress 安装,则 listen
和 server_name
指令可以更改为以下内容:
listen [::]:80 default_server ipv6only=off; server_name examplewp.com *.examplewp.com;
在 access_log
指令中使用 $host
变量会为每个域创建单独的日志文件,例如 examplewp.com-access.log 和 shoppingsite.com-access .log。 无法将此类变量用于 error_log
指令,因此所有错误都记录在一个文件中。
保存此文件并在 sites-enabled 目录中创建此文件的符号链接。
ln -s /etc/nginx/sites-available/wp-ms /etc/nginx/sites-enabled/wp-ms
执行 Nginx 配置测试,如果返回 OK,则重新启动。
service nginx configtest service nginx restart
第三步 - 为 WordPress 创建 MySQL 数据库和用户
在本节中,我们将为 WordPress 创建一个 MySQL 数据库和一个仅对该数据库具有权限的用户。
以 root 用户身份登录 MySQL 命令行。
mysql -u root -p
创建一个数据库。
CREATE DATABASE wordpress;
创建一个 MySQL 用户并授予此数据库的权限:
CREATE USER 'wordpress_user'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress_user'@'localhost';
将单词 password 替换为强密码。 刷新权限并退出 MySQL 命令行。
FLUSH PRIVILEGES; exit
记下这些细节,因为在第四步中将需要它们。
数据库名称: WordPress
数据库用户: wordpress_user
数据库密码: 密码
关于 MySQL 用户的更多信息可以在 这篇文章 中找到。
第四步 - 下载并安装 WordPress
在本节中,我们将下载最新版本的 WordPress 并进行安装。 这将用于我们的第一个站点 examplewp.com。
下载并解压 WordPress。
wget http://wordpress.org/latest.tar.gz tar -xf latest.tar.gz
将提取的文件移动到文档根目录中。
mv wordpress/* /usr/share/nginx/wordpress/
将所有权分配给用户 www-data
。 这对于媒体上传和核心/插件/主题更新在 WordPress 中工作至关重要。
chown -R www-data:www-data /usr/share/nginx/wordpress
在浏览器中访问 主域 以开始 WordPress 安装。
http://examplewp.com/
如果需要,您可以在 URL 中添加“www”后缀。 单击 Create a Configuration File 按钮,然后单击 Let's go! 按钮。 填写数据库详细信息(使用第三步中的信息),然后单击提交。
此时,WordPress 将与数据库建立连接以测试输入的凭据。 连接成功后,会出现 Run the install 按钮。 点击它。 填写 所需信息 表单以设置您的站点标题、用户名、密码和电子邮件,然后单击 安装 WordPress。 为安全起见,建议选择非通用用户名。
第五步 - 启用多站点并创建其他站点
在本节中,我们将启用 WordPress Multisite 并创建本文的 Prequisites 部分中提到的两个附加站点。
必须在 wp-config.php 文件中定义 PHP 常量 以启用 网络设置 页面。
编辑 wp-config.php 文件:
nano /usr/share/nginx/wordpress/wp-config.php
在 注释 /* That's all, stop editing! Happy blogging. */
之前添加以下代码 :
/* Multisite settings */ define( 'WP_ALLOW_MULTISITE', true );
在本教程中,我们将多次编辑此文件。 随意在我们刚刚创建的 /* Multisite settings */
部分中添加所有新行。
保存文件。 登录 WordPress 管理面板并导航到 工具 > 网络设置 。 选择Sub-domains选项,根据需要修改Network Title,然后点击Install。
您将看到要添加到 wp-config.php 和 .htaccess 文件中的两个代码块。 复制类似于以下内容的 wp-config.php 代码:
define('MULTISITE', true); define('SUBDOMAIN_INSTALL', true); define('DOMAIN_CURRENT_SITE', 'examplewp.com'); define('PATH_CURRENT_SITE', '/'); define('SITE_ID_CURRENT_SITE', 1); define('BLOG_ID_CURRENT_SITE', 1);
编辑 wp-config.php 文件。
nano /usr/share/nginx/wordpress/wp-config.php
在 注释 /* That's all, stop editing! Happy blogging. */
之前添加这些行 并保存。 .htaccess 显示的代码可以忽略,因为 Nginx 没有这个文件。
退出 WordPress 管理面板,然后重新登录。 从左上角的管理员 工具栏 ,导航到 我的站点 > 网络管理员 > 站点 。
单击 Add New 按钮打开 Add New Site 表单。 以下屏幕截图显示了我们示例中购物网站的填写详细信息。 输入的 站点地址 将构成该站点的子域。
单击添加站点,创建的站点将可以通过http://shoppingsite.examplewp.com访问。
重复这些步骤以创建第二个站点(在我们的示例中为 companysite.examplewp.com)。
您现在应该看到的内容:
以下三个 WordPress 网站:
他们每个人都有自己的内容、主题和活动插件集。
第六步 - 设置域映射
在本节中,我们将通过下载并启用 WordPress MU 域映射插件,使您能够为每个 WordPress 站点使用单独的域名。 这个插件允许 WordPress Multisite 的用户将他们的博客/站点映射到另一个域。
通过 SSH 登录到您的 Droplet 并下载 WordPress MU 域映射 插件。 先安装unzip
命令,然后解压插件。
wget http://downloads.wordpress.org/plugin/wordpress-mu-domain-mapping.latest-stable.zip apt-get install unzip unzip wordpress-mu-domain-mapping.latest-stable.zip
将提取的文件移动到 WordPress 插件目录。
mv wordpress-mu-domain-mapping /usr/share/nginx/wordpress/wp-content/plugins/
将插件目录下的sunrise.php文件复制到wp-content目录下。
cp /usr/share/nginx/wordpress/wp-content/plugins/wordpress-mu-domain-mapping/sunrise.php /usr/share/nginx/wordpress/wp-content/
编辑 wp-config.php 文件并在 注释 /* That's all, stop editing! Happy blogging. */
之前添加以下行 。
文件:/usr/share/nginx/wordpress/wp-config.php
define('SUNRISE', 'on');
保存此文件并返回到 Web 浏览器。 从 WordPress 工具栏导航到 我的站点 > 网络管理员 > 插件 。
单击WordPress MU域映射插件下的网络激活链接。 转到 设置 > 域映射 并对 域选项 进行如下更改:
- 取消勾选远程登录
- 检查永久重定向
- 取消选中将管理页面重定向到站点的原始域
完成后单击保存。 这些设置将对子域(如 companysite.examplewp.com)的所有请求重定向到它们各自的外部域(如 companysite.org),包括管理页面(/wp-admin)。
在下一步中,我们将根据站点 ID 将域名映射到每个站点。 有很多方法可以找到站点的 ID,但为了便于管理,我们将创建一个简单的 WordPress 必备插件 ,它会在 Sites 页面上显示一个额外的 ID 列。
通过 SSH 登录到您的 Droplet 并创建一个 mu-plugins 目录。
mkdir /usr/share/nginx/wordpress/wp-content/mu-plugins
在此目录中创建一个 PHP 文件并粘贴以下代码:
nano /usr/share/nginx/wordpress/wp-content/mu-plugins/wpms_blogid.php
您可以完全复制此内容:
<?php add_filter( 'wpmu_blogs_columns', 'do_get_id' ); add_action( 'manage_sites_custom_column', 'do_add_columns', 10, 2 ); add_action( 'manage_blogs_custom_column', 'do_add_columns', 10, 2 ); function do_add_columns( $column_name, $blog_id ) { if ( 'blog_id' === $column_name ) echo $blog_id; return $column_name; } function do_get_id( $columns ) { $columns['blog_id'] = 'ID'; return $columns; }
Sites > All Sites 部分现在应该显示一个额外的 ID 列。
记下每个站点的 ID 值,然后转到 设置 > 域 页面。 输入站点 ID,后跟站点的外部域。 例如,由于 companysite 的 ID 为 3,因此在此页面上,Site ID 应为 3,域应为 companysite.org。
如果您希望将站点 URL 设置为 www.companysite.org,可以添加“www”前缀。 对其他域重复这些步骤。 点击页面底部的【X6X】保存【X14X】。
您现在应该看到的内容:
每个站点都有自己的域名而不是子域; 即,在浏览器中输入 http://companysite.org 将打开 我的在线公司 站点。 您现在可以访问 http://shoppingsite.com 和 http://companysite.org 来查看。 您应该会在页面的左上角看到站点标题的变化。
现在每个站点都可以通过自己的 WordPress 管理面板单独维护:
http://examplewp.com/wp-admin/ http://shoppingsite.com/wp-admin/ http://companysite.org/wp-admin/
核心/插件/主题的更新和插件/主题的安装应该从主域的网络管理页面完成:
http://examplewp.com/wp-admin/network/
进一步阅读
- 在 Apache 上设置 WordPress 多站点
- 不要使用 WordPress Multisite by Mika Epstein
- WordPress 多站点管理