这是必要的,因为我需要在 GCP 中为 Word Press 实例实现负载均衡器。
只有通过健康测试,GCP 才会将请求转发给 wordpress 实例。
以下是健康检查屏幕的典型定义
它期望“请求路径”返回 200。否则目标系统将被视为关闭。
但是如果我在 wordpress 中创建一个页面/index.php/newpage
,它将始终返回 301。
虽然 wordpress 网站已启动并运行,但它未能通过健康检查。
有什么方法可以定义 wordpress 中返回 200 的页面吗?希望它不需要额外的插件,因为我想避免维护额外的插件。
对我来说,最后的手段是向 php 服务器添加一个返回 200 的 URL。但是,此 URL 的状态可能无法 100% 反映 wordpress 站点的健康状况(例如,由于 mysql 问题,站点可能会关闭)。如果这确实是最后的手段,那么最好的实现方法是什么?我不精通 php 开发。
wordpress版本是4.6.2
答案1
您可以使用 WordPress 安装首页进行健康检查。这是 WordPress 网站可用的最可靠指标。
答案2
不管怎么说,我必须在容器中设置一个 WordPress 网站,并进行健康检查,然后才能将流量定向到该网站。只有在通过浏览器安装 WordPress 后,“首页”的建议才有效。在此之前,它们会将 302 状态代码返回给/wp-admin/install.php
。我在容器文件夹中仔细研究,并决定使用/wp-includes/images/blank.gif
作为健康检查路径。这使得健康检查成功,流量开始路由到容器。从那里我通过浏览器安装了 WordPress,并能够将健康检查路径改回/
。
答案3
虽然这是一篇旧帖子,但我想对此发表意见,因为这个话题仍然相关,而且接受的答案在我的用例中并不理想。我不建议其他人这样做;尤其是对于高流量系统。
我对接受的答案的问题是,建议使用主页作为健康检查。根据您的网站,这可能没问题,但我认为没有必要在健康检查中查询数据库。即使数据库连接失败,实例在技术上仍然是健康的。例如,如果您的 RDS 集群发生故障,主页将显示数据库错误,这将导致500
您无缘无故地触发自动扩展。健康检查只需要检查应用程序并确保其设置正确。
我的主页上有很多查询,仅健康检查就会给设置了多个实例的 RDS 集群带来不必要的负载。我可以指定一个更轻量的页面,但这仍然不理想,因为健康检查应该确保实例设置正确,我不希望在我启动的每个系统上都添加项目特定的检查。尽管也有这样的用例。
我使用这个简单的健康检查(_healthCheck.php
):
<?php
/**
* Check if basic WordPress structure is in place
* This is to be used for load balancer health checks
*/
// Checks
define('WORDPRESS_CONFIG', __DIR__ . DIRECTORY_SEPARATOR . 'wp-config.php');
define('WORDPRESS_DIRECTORY', __DIR__ . DIRECTORY_SEPARATOR . 'wordpress');
define('WP_CONTENT_DIRECTORY', __DIR__ . DIRECTORY_SEPARATOR . 'wp-content');
// Health Check Flags
$_healthCheckStatus = true;
// Will stop the while loop
$_healthCheckCompleted = false;
// Just to be safe
try {
// DoWhile loop here to simplify kicking out on a false $_healthCheckStatus
do {
// Check if wp-config exists
if (!file_exists(WORDPRESS_CONFIG)) {
$_healthCheckStatus = false;
}
// Make sure we have required directories
$_healthCheckStatus = _dirIsValidAndNotEmpty(WORDPRESS_DIRECTORY);
$_healthCheckStatus = _dirIsValidAndNotEmpty(WP_CONTENT_DIRECTORY);
// Checks are complete, kick out the loop
$_healthCheckCompleted = true; // Just say no to infinity and beyond
} while (false === $_healthCheckCompleted && true === $_healthCheckStatus);
} catch (\Exception $e) {
// Health check fails
$_healthCheckStatus = false;
}
// If a bad healthcheck, return 404 to tell the load balancer we suck
if (false === $_healthCheckStatus) {
header("HTTP/1.0 404 Not Found");
?>
<html>
<body><h1>Health is bad</h1></body>
</html>
<?php
die();
} else {
?>
<html>
<body><h1>Health appears good</h1></body>
</html>
<?php
}
/**
* Validates a directory and ensures it's not empty
* @param string $dir
* @return bool
*/
function _dirIsValidAndNotEmpty($dir) {
// Make sure we have a directory
if (is_dir($dir)) {
// Make sure it's not empty
$_dirIsNotEmpty = (new \FilesystemIterator($dir))->valid();
if ($_dirIsNotEmpty) {
return true;
}
}
return false;
}
需要注意以下几点:
- 我总是将 WordPress 安装在该
wordpress
目录中。- 这使得在 Git 中维护项目变得更加容易,因为您可以简单地忽略
wordpress
目录。
- 这使得在 Git 中维护项目变得更加容易,因为您可以简单地忽略
- 由于我有 WordPress 自己的目录,因此我喜欢使用自己的目录
wp-content
来简化项目管理。 - 您可以轻松修改它以满足您的需要。
此健康检查仅检查系统以确保其设置正确。无需查询数据库,因为这对于健康检查来说不是必需的。这是一个配置问题,应该在设置系统之前先处理。
答案4
編輯:
我曾使用过 /wp-admin/images/wordpress-logo.svg(在以前的版本中它可以与 /favicon.ico 一起使用)听起来更像是黑客攻击,但如果 wordpress 不工作,您就会收到 5xx 错误,否则 200=已安装,200=未安装。