WordPress多语言站点实现–LAMP+WordPress Multisite(sub-directory)

d## 前情提要

在使用WordPress来构建我们网站的时候,网站的语言只能设置成1种,例如简体中文。如果想显示多种语言,比如中文和英语,WordPress自身并不能做到这一点。这篇文章为多语言提供了一种解决方案。

本文长度很长,为了顺利完成所有操作,请务必仔细操作,以免出现问题难于查找。完成安装和配置需要我们掌握基本的Linux命令行使用方法,对Apache、PHP、SSL认证、MySQL有一定的了解(至少要知道它们是干什么的)。如果对哪里有不清楚请先行查阅资料后再进行,毕竟大多数操作都是不可逆的。

本文介绍的方法,适用于不同语言网站之间的内容不完全相同,这可以包括文章内容、界面样式。如果我们想搭建一个不同语言之间内容基本完全相同,其他语言只是中文的翻译这样的网站,本文的方法并不适合,有插件可以解决这个问题。

本文基于以下环境:Ubuntu 64bit 16.04, Apache 2.4, MySQL-server 5.7, PHP 7.0, Let’s Encrypt SSL Certificate, WordPress 4.9.8

实现WordPress多语言的方法

笼统来说,方法有4种:
– 为相同的文章创建多个语言的副本,每个语言的版本相互独立,是不同的文章
– 在同一篇文章中写多个语言的内容,显示的时候根据实际语言显示对应的部分
– 使用机翻这种翻译工具
– 为每种语言创建一个网站

多副本方法

这个方法是大多数多语言网站的首选。有比较多的插件可以实现:(e.g. WPML(收费), xili-language, Polylang, Bogo或Sublanguage)。通常,我们创建一篇文章作为基准,如中文版本。其他语言的版本会被指派为基准版本的翻译,这样创建的一系列文章就都关联到了一起。

优点:
– 容易安装与卸载,插件基本可以正常使用
– 不同语言的版本会自动关联在一起
– 翻译量可以通过一些字符串文件(mo文件)来减少

缺点:
– 数据库中需要额外的数据,随着网站规模的增加,会引入相当多的数据
– 不同语言网站之间外观基本相同,不能自定义
– 由于看不到其他语言的内容,翻译并不容易进行

多语言方法

这个方法有这些插件实现:qTranslate-X, WPGlobus。这种方法将所有相关的内容都放在同一个文章中,根据显示语言决定显示内容。

优点:
– 容易安装
– 使用任何一种语言都可以搜索到该文章

缺点:
– 不容易卸载,数据库中和多语言相关的数据和其他原始数据混在一起
– 无法通过固定链接来区分不同语言的文章

机翻

机翻这种方法并不推荐,毕竟机翻的准确度和人工翻译相差较大。相关插件:Transposh, Global Translator和TranslatePress。

多站点方法

这种方法下,每种语言各自拥有一个站点,彼此之间互不干扰。适用于语言之间差别较大的情况。比如中文有较多的休闲类文章而英文有较多技术类文章,并且二者的重合度很低。

优点:
– 网站搭建自由度高,不同语言间可以差异很大
– 插件彼此独立,且不影响内容

缺点:
– 配置复杂,无法直接卸载,如果需要同步多种语言的内容则工程量就比较大了

总结

如果不同语言间的文章内容基本相同,优先考虑多副本方法;插件不够完美可以考虑多语言方法;如果不同语言之间的文章内容基本不同,优先考虑多站点方法;如果不知道怎么翻译或者翻译量巨大,但是又想设立这个语言的网站,可以使用机翻的方法,最好还是付费机翻,效果要好一些。

系统准备

登录远程服务器

根据实际情况购买主机服务,获取一个公网IP地址(127.0.0.1还有192.168.XX.XX都是不能用的)并且推荐购买一个域名并配置好DNS记录。通常主机服务提供商会提供他们的DNS服务器,我们只需在域名提供商那里设置好域名服务器就可以完成配置。详情请参见各自服务提供商。

完成系统安装并使用ssh登录远程服务器。对于Linux/MacOS系统打开默认的终端就可以;Windows系统需要额外的ssh服务,推荐PuTTY和XShell。键入以下命令并输入登录密码。第一次登录的时候,通常系统会问是否将服务器的key添加到信任列表中,通常我们选择yes。将ip-or-domain替换为实际的ip或域名。

ssh [email protected]

添加一个权限不那么高的新用户并赋予sudo权限

使用如下命令创建一个新用户,将example_user替换为新的用户名。创建用户时会要求填写一些信息,这些信息可以随意填写,也可以按实际情况填写。

adduser example_user

创建用户后,将该用户加入sudo用户组:

usermod -aG sudo example_user

之后,我们可以使用新注册的用户登录服务器。新注册的用户权限较低,可以一定程度上避免误操作给系统带来的伤害。

hostname设置

请检查服务器的hostname是否正确设置。

hostname
hostname -f

如果需要设置,请使用一下命令,替换example_hostname为新的域名

hostnamectl set-hostname example_hostname

时区设置(可选)

sudo dpkg-reconfigure tzdata

在显示的窗口中选择合适的时区。

使用SSH登录并关闭密码登录方式(可选)

参见Harden SSH Access – Linode.com

设置UFW防火墙

首先查看UFW可用的应用列表:

ufw app list

我们应该可以看到如下内容:

Available applications:
  OpenSSH

然后添加一条规则:允许OpenSSH联网

sudo ufw allow OpenSSH

最后启用ufw防火墙:

sudo ufw enable

请注意,务必在启动防火墙前允许OpenSSH联网,否则我们将再也无法登录远程服务器。

LAMP安装

LAMP指代Linux、Apache、MySQL和PHP,是一种常见的Web服务套装。这里Linux指的是Ubuntu系统,其他三件的安装与配置在下面介绍。

以下步骤中涉及的example.com请替换为需要的域名

在开始之前,先更新一下系统组件:

sudo apt update && sudo apt upgrade

Apache

  1. 安装Apache
sudo apt install apache2
  1. 对于多进程管理,我们使用prefork模式,以下是关于prefork的参数设置
    使用nano编辑器打开/etc/apache2/mods-available/mpm_prefork.conf
sudo nano /etc/apache2/mods-available/mpm_prefork.conf

以下参数针对2GB内存的服务器,如果服务器内存小于2GB则需要适当改小,大于2GB便可以改大。

<IfModule mpm_prefork_module>
        StartServers            4
        MinSpareServers         3
        MaxSpareServers         40
        MaxRequestWorkers       200
        MaxConnectionsPerChild  10000
</IfModule>
  1. 关闭event模式并启动prefork模式
sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
  1. 重启Apache服务
sudo systemctl restart apache2

配置网站节点

一个网络节点相当于一个虚拟的服务器,用于按照一定要求处理发送来的请求。下面我们为网站设定一个节点,并添加相应的处理方法。

  1. 复制默认的节点配置文件
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/example.com.conf
  1. 使用nano编辑复制好的example.com.conf文件
sudo nano /etc/apache2/sites-available/example.com.conf

将以下内容替换或添加到相应的位置。在替换的时候建议将原有的内容注释掉而不是直接替换。

<Directory /var/www/html/example.com/public_html>
        Require all granted
</Directory>
<VirtualHost *:80>
        ServerName example.com
        ServerAlias www.example.com
        ServerAdmin [email protected]
        DocumentRoot /var/www/html/example.com/public_html
        ErrorLog /var/www/html/example.com/logs/error.log
        CustomLog /var/www/html/example.com/logs/access.log combined
</VirtualHost>

其中ServerName是常用域名,ServerAlias是域名的别名,可以将多个域名或子域名映射到这个节点上。ServerAdmin是服务器的管理员邮箱,可以随便写很少会用到。DocumentRoot是网站相关文档的根目录。这个目录以及其根目录是可以以这个节点的身份访问的,其他的目录理论上不可以被访问。ErrorLogCustomLog定义了错误日志和访问日志的路径。

  1. 创建相关目录
sudo mkdir -p /var/www/html/example.com/{public_html,logs}
  1. 启动我们刚刚配置的节点
sudo a2ensite example.com.conf
  1. 关闭默认节点
sudo a2dissite 000-default.conf
  1. 允许Apache联网
sudo ufw allow in "Apache Full"
  1. 重启Apache
sudo systemctl reload apache2

MySQL

MySQL是常见的数据库管理软件,WordPress的大部分信息都是存储在MySQL中的。

  1. 安装MySQL
sudo apt-get install mysql-server

在安装途中,我们需要输入新的管理员(root)密码以及密码确认。为了数据库的安全,一定要设置一个强度高的密码(8位以上,大小写字母、数字、特殊符号混合)。

  1. 安全设置

键入以下命令:

mysql_secure_installation

然后我们将看到以下提示:

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: y

这个提示我们是否要启动密码强度的检查,在添加和修改密码的时候,只有满足要求的密码才可以通过。通常为了数据库安全我们应该启动该检查,如果有特殊需求不方便使用很强的密码或者有设置好的弱密码,可以先不启动。启动输入y,不启动随便输入。

如果选择了y,我们可以看到以下提示:

There are three levels of password validation policy:
LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

这里我们要设置密码强度,0代表弱,只要密码长度大于等于8位即可;1代表中,密码长度大于等于8位且包括至少一个数字、大写字母、小写字母和特殊符号;2代表强,密码长度大于等于8位且包括至少一个数字、大写字母、小写字母和特殊符号并且不能有常用单词。通常强度为1的即可。

在此之后,程序会提示我们是否需要修改root用户的密码:

Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n

如果密码评分为100则不需要修改。如果小于100则需要修改,不过不修改也可以。

后面的所有设置我们都应该选择y。

PHP

  1. 安装PHP以及必要组件
sudo apt install php7.0 libapache2-mod-php7.0 php7.0-mysql
  1. 调整PHP设置

使用nano打开/etc/php/7.0/apache2/php.ini,使用Ctrl+W查找以下关键词并修改对应的值。

max_input_time = 30
error_reporting = E_COMPILE_ERROR | E_RECOVERABLE_ERROR | E_ERROR | E_CORE_ERROR
error_log = /var/log/php/error.log
upload_max_filesize = 100M

如果不安装WordPress,最后一行的upload_max_filesize = 100M可以不改。

  1. 创建日志文件目录并赋予权限
sudo mkdir /var/log/php
sudo chown www-data /var/log/php
  1. 重启Apache
sudo systemctl restart apache2

LAMP测试

在节点的根目录/var/www/html/example.com/public_html使用nano建立test.php文件:

sudo nano /var/www/html/example.com/public_html/test.php

然后在文件中粘贴如下代码:

<html>
<head>
    <title>PHP Test</title>
</head>
    <body>
    <?php echo '<p>Hello World</p>';

    // In the variables section below, replace user and password with your own MySQL credentials as created on your server
    $servername = "localhost";
    $username = "root";
    $password = "password";

    // Create MySQL connection
    $conn = mysqli_connect($servername, $username, $password);

    // Check connection - if it fails, output will include the error message
    if (!$conn) {
        die('<p>Connection failed: <p>' . mysqli_connect_error());
    }
    echo '<p>Connected successfully</p>';
    ?>
</body>
</html>

其中的password替换为安装MySQL时设定的密码。

然后访问ip/test.phpdomain/test.php,如果能看到显示的

Hello World
Connected successfully

则表明安装和设置正确。测试完成后将这个文件删除,使用以下命令:

sudo rm -f /var/www/html/example.com/public_html/test.php

使用Let’s Encrypt的证书配置HTTPS

为了保证连接的安全,以防传输数据被中间人截获并破解,建议网站使用HTTPS进行连接。使用HTTPS的必需条件之一是拥有一个认证的证书。这里我们使用Let’s Encrypt颁发的免费证书进行配置。这个证书完全免费,不过需要每3个月更新一次证书。不过整体操作自动化程度很高,所以大可不必担心。

我们可以直接参阅网站Certbot,选择对应的平台和系统,之后网站会提示如果正确地安装。这里我把安装命令复制了过来。

  1. 准备
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-apache
  1. 安装证书
sudo certbot --apache
  1. 输入联系邮箱,已接收相关的邮件例如认证即将过期
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): 
  1. 同意许可条款
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: 
  1. 推广,选择n拒绝即可
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: n
  1. 选择要激活HTTPS的域名,通常直接回车选择全部的域名
Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: example.com
2: www.example.com
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 
  1. 是否强制重定向至HTTPS,通常选择2
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 

当我们看见了Congratulations!便表明CertBot自动安装好了证书并配置完Apache设置。在设置文件所处的文件夹中可以看到它新创建了一个形如example.com-le-ssl.conf的配置文件,这个是HTTPS监听的443端口的配置文件。原先的配置文件依然存在并启用,只是所有对域名的访问都重定向到了HTTPS监听的443端口。

  1. 设置自动更新
sudo certbot renew --dry-run

WordPress

WordPress是常见的CMS(内容管理系统),它可以方便地用来搭建网站并且基本不需要编程技能。同时它拥有强大的插件库和主题库可以全方位满足我们的建站需求。对于专业的开发人员来说,WordPress提供了编写代码的空间。另外,WordPress社区比较成熟,安全漏洞发现及时且修复速度较快;也具有完善的中英文社区,教程与问题解答相关内容都很丰富。

安装前:数据库设置

  1. 进入MySQL命令行
mysql -u root -p
  1. 为WordPress新建一个数据库,最好使用wordpress以免搞乱
CREATE DATABASE wordpress;
  1. 为WordPress创建一个数据库用户并赋予其操作WordPress数据库的权限

wordpressuser, password可以替换为想要的名字;wordpress需要和上面创建的数据库名称一致。如果设置了MySQL密码安全检查,password处填写的密码需要符合密码强度要求。

CREATE USER 'wordpressuser' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser';
  1. 刷新权限并退出
FLUSH PRIVILEGES;
EXIT;

安装需要的PHP组件并重启Apache

sudo apt-get update
sudo apt-get install php-curl php-gd php-mbstring php-mcrypt php-xml php-xmlrpc
sudo systemctl restart apache2

安装前:设置Apache以允许.htaccess转发

  1. 使用nano修改节点配置文件
sudo nano /etc/apache2/sites-available/example.com.conf
  1. 在开始的内部添加以下内容
Options Indexes FollowSymLinks
AllowOverride All
  1. 启用rewrite模式
sudo a2enmod rewrite
  1. 重启Apache
sudo systemctl restart apache2

安装WordPress

  1. 创建源代码存储文件夹
sudo mkdir /var/www/html/example.com/src/
cd /var/www/html/example.com/src/
  1. 修改根目录的用户组
sudo chown -R www-data:www-data /var/www/html/example.com/
  1. 下载并解压WordPress最新版的源代码
sudo wget http://wordpress.org/latest.tar.gz
sudo -u www-data tar -xvf latest.tar.gz
  1. 重命名下载的压缩包,以作备份(选做)
sudo mv latest.tar.gz wordpress-`date "+%Y-%m-%d"`.tar.gz
  1. 将解压的源代码移入节点根目录中
sudo mv wordpress/* ../public_html/
  1. 赋予所有文件权限
sudo chown -R www-data:www-data /var/www/html/example.com/public_html

配置WordPress

  1. 访问网站,选择基础站点的语言
    通常下,我们将基础站点的语言设为简体中文,新建的站点语言设成我们需要的如英语。

WordPress language

  1. 配置数据库相关参数

数据库名、用户名和密码和刚才在MySQL中设置的一样。剩余两项保持不变即可。

wordpress database conf

  1. 配置网站相关参数

wordpress website conf

按照提示配置即可。配置后选择安装,安装完成后点击登入,然后就可以看到控制面板了。

  1. 忽略FTP上传的要求

使用nano打开WordPress配置文件

sudo nano /var/www/html/example.com/public_html/wp-config.php

/* That’s all, stop editing! Happy blogging. */的前面添加以下内容

/** Bypass FTP */
define('FS_METHOD', 'direct');

至此,WordPress单站点模式已经配置完成。

WordPress多站点模式

配置

  1. 启用Multisite功能

使用nano打开WordPress配置文件

sudo nano /var/www/html/example.com/public_html/wp-config.php

/* That’s all, stop editing! Happy blogging. */的前面添加以下内容

/** Enable multisite */
define('MULTISITE', true);
  1. 在WordPress控制台中注销并重新登录,在左边“设置”中找到“配置网络”。里面要求选择新添加的网络类型。我们这里选择“子目录”模式。
    network setup

  2. 点击“安装”后,系统提示修改wp-config.php和.htaccess的内容
    使用nano编辑wp-config.php

sudo nano /var/www/html/example.com/public_html/wp-config.php

/* That’s all, stop editing! Happy blogging. */的前面添加屏幕上提示的内容

同理,使用nano编辑.htaccess

sudo nano /var/www/html/example.com/public_html/.htaccess

在WordPress块内部按照屏幕上的提示替换所有的规则。替换完成后,多站点的配置则完成。

使用

  1. 结构

启用多站点模式后,先前安装的根站点自动作为网络中的一个站点。我们可以添加多个站点于该网络下。每个站点的配置相互独立但又依附于网络。好比网络是管理站点,下辖若干实际展示的站点。

  1. 站点管理

可以在“我的站点”-“管理站点”–“站点”中添加、删除、修改一个新站点。每个站点,除了根站点,都是在根域名example.com后面跟上一个路径。如英文版站点的URL可以为example.com/en

  1. 插件和主题管理

插件和主题的安装与启用都必须在网络中完成。但是每个站点都可以设置不同的主题和插件选项。

  1. 用户

通常每个站点都会共享超级管理员账号。我们也可以为每个站点注册站点管理员,这样站点管理员独立于其他站点,可以避免错误的修改。

  1. 结构

假定网站的主语言是中文,副语言是英文。有两种结构可以使用:
1. 根站点用作中文站点,/en作为英文站点
2. /zh用作中文站点,/en用作英文站点,根站点根据访问者的语言/地区/浏览器语言自动跳转至对应的站点。关于这种的实现方法请参阅下文“根站点的语言重定向”。

根站点的语言重定向

参考资料

发表评论