目前 WordPress 和 MySQL 实例在 Swisscom 云上运行。但是上周突然wp-content,由于内容丢失,被删除,无法正常运行网站。之后我与 Swisscom 进行了沟通,他们已经解释了问题和可能的解决方案。他们建议使用外部服务来存储内容媒体文件和其他文档。但我不知道该怎么做。
如果有人解决了同样的问题,请提供您的解决方案或提出一些建议。
目前 WordPress 和 MySQL 实例在 Swisscom 云上运行。但是上周突然wp-content,由于内容丢失,被删除,无法正常运行网站。之后我与 Swisscom 进行了沟通,他们已经解释了问题和可能的解决方案。他们建议使用外部服务来存储内容媒体文件和其他文档。但我不知道该怎么做。
如果有人解决了同样的问题,请提供您的解决方案或提出一些建议。
这是 Swisscom 产品管理部门的官方回答:
我们不正式支持应用程序云上的 Wordpress。有很多关于如何在 Cloud Foundry 上部署 Wordpress 的示例可用,但它们仅适用于某些配置。据我们所知,没有适用于每个 wordpress 安装和配置的有效通用解决方案。因此,我们不正式支持它。问题存在于文件系统领域(Wordpress 需要非临时文件系统才能工作)以及 Wordpress 及其插件的意识,它们可能在多个实例中运行(在水平缩放的情况下)
编辑版本:
此解决方案不适合将 wordpress 部署到云端,因为在应用程序重新启动或暂存时,临时文件系统会导致数据丢失。这可能随时发生。另一个问题可能是具有多个实例的应用程序的水平扩展,所有实例都具有不同步的不同临时文件系统。因此,该解决方案不能用于生产。
这是由于 Wordpress 的架构目前还没有为云环境做好准备,而不是云本身。部署到云端的应用程序应遵守十二因素应用程序规则。
这个小方法可用于博客和所有备份足够且不需要多个实例的情况。
我尝试在 Swisscom Cloud 上进行 wordpress 的基本安装。首先我下载了wordpress的代码。它应该存在一个名为“wp-config-sample.php”的文件。将其重命名为“wp-config.php”并替换文件中的以下行:
// ** Read MySQL service properties from _ENV['VCAP_SERVICES']
$services = json_decode($_ENV['VCAP_SERVICES'], true);
$service = $services['mariadb'][0]; // pick the first MySQL service
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', $service['credentials']['database']);
/** MySQL database username */
define('DB_USER', $service['credentials']['username']);
/** MySQL database password */
define('DB_PASSWORD', $service['credentials']['password']);
/** MySQL hostname */
define('DB_HOST', $service['credentials']['host'] . ':' . $service['credentials']['port']);
/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');
/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');
这些行允许 wordpress 从环境变量中获取数据库凭据。在这种特定情况下,变量键指向 Swisscom mariadb 服务。如果应用程序重新启动,这些信息将自动提供给应用程序。
确保创建一个 mariadb 并将其绑定到应用程序。这可以在部署的不同阶段以不同的方式完成。
为了定期执行应用程序媒体的备份,我安装了一个插件来备份到兼容的 S3 存储。Swisscom 动态存储服务是与 S3 兼容的存储,您可以将此服务与插件updraftplus一起使用。所以首先我使用 wordpress 插件管理器安装了插件。然后我创建了一个附加到应用程序的动态存储服务。重新部署应用程序后,您可以使用 Cloud Foundry cli 列出应用程序的环境变量:
cf env appName
你应该得到这样的东西:
{
"VCAP_SERVICES": {
"dynstrg": [
{
"credentials": {
"accessHost": "ds31s3.swisscom.com",
"accessKey": "key",
"sharedSecret": "secret"
},
"label": "dynstrg",
"name": "test-ivan-dynstrg",
"plan": "usage",
"provider": null,
"syslog_drain_url": null,
"tags": [],
"volume_mounts": []
}
],
"mariadb": [
{
"credentials": {
"database": "database",
"database_uri": "mysql://uri",
"host": "10.0.20.18",
"jdbcUrl": "jdbc:mysql://uri",
"name": "name",
"password": "pass",
"port": 3306,
"uri": "uri",
"username": "user"
},
"label": "mariadb",
"name": "test-ivan-mariadb",
"plan": "small",
"provider": null,
"syslog_drain_url": null,
"tags": [],
"volume_mounts": []
}
]
}
}
记下“accessHost”、“accessKey”和“sharedSecret”。
此时您需要在动态存储上创建一个桶。您可以使用不同类型的应用程序执行此操作。这一步非常重要。没有存储桶,插件将无法工作。
创建存储桶后,请记下它的名称。
现在您可以配置“updraftplus”插件:您需要选择 S3 兼容(通用)服务并在 S3 端点字段中输入 accessHost,在 S3 访问密钥中输入 accessKey,在 S3 密钥中输入 sharedSecret,以及字段 S3 位置中的存储桶名称。这应该正确配置插件。现在您可以备份两个文件而不是数据库。
请记住,当应用程序重新启动时,插件将不再安装(它安装在临时文件系统上),因此您需要重新安装它并在之后执行恢复过程。
此解决方案仍可能导致数据丢失。备份可能比应用程序崩溃或重新启动更早。
但是对于个人博客的用例可能很有用。