Apache 根据请求的文件存在情况,通过清漆在后端之间进行选择的好方法
我安装了Apache2、nginx和清漆。Varnish接收请求,确定它用于哪个后端(静态转到nginx,动态转到Apache),从后端获取响应,并在需要时缓存它 Apache还可以生成缩略图。它使用一些特定的逻辑创建缩略图,这对于处理器来说非常昂贵。因此,Apache将thumb保存到磁盘,以便下次接收到此缩略图的请求时,可以将其直接重定向到nginx 这里有一个问题:Varnish无法检查文件系统中是否存在文件,这就是为什么它不知道是否可以使用nginx后端,或者Apache应该首先生成缩略图 我目前采用的解决方法非常简单,但很难看:Apache 根据请求的文件存在情况,通过清漆在后端之间进行选择的好方法,apache,nginx,varnish,varnish-vcl,Apache,Nginx,Varnish,Varnish Vcl,我安装了Apache2、nginx和清漆。Varnish接收请求,确定它用于哪个后端(静态转到nginx,动态转到Apache),从后端获取响应,并在需要时缓存它 Apache还可以生成缩略图。它使用一些特定的逻辑创建缩略图,这对于处理器来说非常昂贵。因此,Apache将thumb保存到磁盘,以便下次接收到此缩略图的请求时,可以将其直接重定向到nginx 这里有一个问题:Varnish无法检查文件系统中是否存在文件,这就是为什么它不知道是否可以使用nginx后端,或者Apache应该首先生成缩略
vcl_recv
中,始终假定存在缩略图,如果不是从某个特殊主机请求,则必须将所有请求重定向到nginx李>
vcl\u fetch
catch object HTTP status中,如果为404且资源为缩略图,则将主机重写为特殊主机并重新启动进程:也许有更好的方法来解决这个问题?我知道Varnish在VCL中支持C,也许最好使用C代码检查文件是否存在?好的,如果有人对解决方案感兴趣,我在VCL配置中找到了一个带有内联C的新解决方案。首先,我们必须添加一个函数来检查文件是否存在(在任何函数之外的文件顶部添加):
就像一个符咒。你用清漆做的东西不是为它而做的。它确实不可能检查文件是否存在,因为它最初不是用来提供文件的。Varnish只是将后端响应临时缓存在文件或内存中
在这个设置中你真的需要清漆吗?让nginx检查文件是否存在或者将其转发给处理器不是更有意义吗?为什么不使用nginx指令将请求静默地代理给404上的Apache?至少对我来说,这似乎更符合逻辑。你可能会感兴趣。您将可以直接使用VMOD(清洁剂,并且应该应用最新的改进和建议)而不是内联-C访问WASD42建议的内容 Inline-C很好,因为你可以做任何你需要的事情,但是有时候有一个VMOD会更干净,不会干扰你的VCL语言 下面是VCL实现您需求的示例:
import utils;
sub vcl_recv {
if(req.url ~ "^/thumb/") {
if (utils.exists("/srv/www/static/" + req.url)) {
set req.backend = nginx;
else {
set bereq.url = regsub(req.url, "/thumb/(filename)", "thumb_gen.php?filename=\1");
set req.backend = apache;
}
}
}
请使用标签varnish vcl而不是vcl,因为vcl已经是Delphi社区中流行的标签。一个mod今天重新标记了所有的清漆vcl标签。符咒不起作用。但是好的解决办法!如果您试图减少延迟,则可以考虑在文件上使用FSTATER(),而我相信在磁盘上执行的I/O更少。它实际上并没有打开文件,只是通过目录条目确认文件在那里:
C{
#include <stdio.h>
#include <stdlib.h>
int exists (char *fname)
{
FILE *file;
if (file = fopen(fname, "r"))
{
fclose(file);
return 1;
}
return 0;
}
}C
C{
if( exists("/local/file/path") == 1 ) {
VRT_l_req_backend(sp, VCL_conf.director[1]);
} else {
VRT_l_req_backend(sp, VCL_conf.director[2]);
}
}C
import utils;
sub vcl_recv {
if(req.url ~ "^/thumb/") {
if (utils.exists("/srv/www/static/" + req.url)) {
set req.backend = nginx;
else {
set bereq.url = regsub(req.url, "/thumb/(filename)", "thumb_gen.php?filename=\1");
set req.backend = apache;
}
}
}