gpt4 book ai didi

php - 使用迷你 CDN 分散服务器负载

转载 作者:搜寻专家 更新时间:2023-10-31 21:43:08 25 4
gpt4 key购买 nike

为我的 wordpress 站点使用缓存插件大大减少了服务器负载,但我正在努力减少它。缓存插件创建一个可以重复使用的静态 html 文件,而不是每次请求都用 php 重新创建它。

我想将这个静态文件复制到多个服务器,以便可以从多个位置提供服务,从而分散服务器负载。

概念

concept

我基本上是这样做的:

主服务器:

//Echo's what the pointer server will echo, which echo's what the sub-server echo's (which is the stored html file's content)
echo file_get_contents("http://$pointerserver?f=$fileNameWeAreRequesting";

指针服务器:

if(isset($_GET['f'])){ $requestedfile = $_GET['f']; }
/* Redirect user to file */
if(isset($_GET['redirect']))
{
//Filename example: file.html (shares same filename as it's original,
//but the content holds a string of sub-servers that host the file, seperated by a comma)
$servers = file_get_contents("filelocations/$requestedfile");
$pieces = explode(",", $servers); //Sub-Servers to array
//Check for online server
foreach ($pieces as $server)
{
if(file_get_contents("servercheck/$server") == "1") //Check if sub-server online
{
/* Echo file from sub-server NOW */
echo file_get_contents("http://$server?f=$requestedfile"); //Echo's whatever the sub-server echo's
break;
}
}
}

子服务器

/* Provide requested file */
echo file_get_contents("files/$requestedfile"); //Echo's the static html page stored on the sub-server
  1. 这是否会减少主服务器的负载?或者 file_get_contents 的工作方式是否使主服务器最终“解析”(将文件放在一起以进行 html 输出)文件。

  2. 我如何添加检查,以便如果子服务器在指针服务器不知道的情况下离线,我们将改为从主服务器提供静态 html 文件。

让主服务器为此做好准备

main-server-cdn-ready

缓存插件处理静态文件的制作,所以为了发送它我在想:

主服务器:

//This doesn't send anything physical, just instructions to what file the pointer server needs to retrieve and then copy over to the sub-severs.
echo file_get_contents("http://$pointerserver?propagate&f=$fileNameWeAreRequesting";

指针服务器:(我知道这行不通,只是为了说明思路)

    if(isset($_GET['f'])){ $requestedfile = $_GET['f']; }
/* Propagate file to sub-servers */
if(isset($_GET['propagate']))
{
if ($handle = opendir('subservers/')) //Retrieve all available sub-servers
{
while (false !== ($server = readdir($handle))) //For-each subserver, send the file
{
if ($server != "." && $server != "..")
{
/* CREATE AUTO-SUBMIT FORM HERE TO POST FILE CONTENTS (CONCEPT) */
action="http://$server/receivefile.php?f=$requestedfile&send"
$postThisStuff = file_get_contents("http://www.mainserver.xx/cache/$requestedfile"); //Reads the file contents from the main server so it can send it over to the sub-server
}
}
}
}

子服务器

/* Receive file */
if(isset($_GET['send']))
{
//Write received post date to file
$fh = fopen("files/$requestedfile", 'w') or die("can't open file");
$stringData = $_POST['thefile'];
fwrite($fh, $stringData);
fclose($fh);
die();
}

所以我的第三个也是最后一个问题是;这种复制方法是资源明智的好方法吗?主服务器上的静态文件很少更改,只有当有人发表评论或编辑文章(或添加新文章)时才会更改,但节约资源仍然很重要。

最佳答案

首先,我不得不为精彩的演讲投上赞成票。你的想法也不错,但仍然:回答你的问题:“不要这样做!”

  1. 如果 WP 插件配置为编写页面的实际 HTML,首先使用它们?例如。通过检查是否存在可以为当前请求提供服务的 html 文件来绕过整个 PHP 堆栈。 Apache、Nginx 或 Lighttpd 通过 URL 重写(甚至在 nginx 的核心方面)来支持这一点。 [旁注:我不知道您使用的是哪个网络服务器或 Wordpress 插件,所以我省略了配置片段。]

  2. 如果这还没有帮助,或者如果这还不够,请使用反向代理(例如 Varnish)分发内容。很容易将您的主服务器定义为原始服务器,并让位于它前面的各种 Varnish 服务器处理其余部分。

  3. 如果 Varnish 不够好并且您的站点可以完全从 CDN 提供服务,请查看像 edgecast 这样的人(speedyrails 是他们的经销商)。它们允许您进行透明缓存:

    • http://my-blog.com直接指向edgecast的服务器
    • 你配置edgecast来检查http://mainserver.my-blog.com如果没有缓存被填满
    • 配置缓存 header 以避免频繁查找
    • 它们还允许您清除缓存(在您更新博客时使用)
  4. 如果以上都不适合你,我建议你看看Cloudflare .他们做你想做的事(甚至更多)。我正在亲自试驾它们,到目前为止工作完美。

关于php - 使用迷你 CDN 分散服务器负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7946286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com