Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 根据请求的文件存在情况,通过清漆在后端之间进行选择的好方法_Apache_Nginx_Varnish_Varnish Vcl - Fatal编程技术网

Apache 根据请求的文件存在情况,通过清漆在后端之间进行选择的好方法

Apache 根据请求的文件存在情况,通过清漆在后端之间进行选择的好方法,apache,nginx,varnish,varnish-vcl,Apache,Nginx,Varnish,Varnish Vcl,我安装了Apache2、nginx和清漆。Varnish接收请求,确定它用于哪个后端(静态转到nginx,动态转到Apache),从后端获取响应,并在需要时缓存它 Apache还可以生成缩略图。它使用一些特定的逻辑创建缩略图,这对于处理器来说非常昂贵。因此,Apache将thumb保存到磁盘,以便下次接收到此缩略图的请求时,可以将其直接重定向到nginx 这里有一个问题:Varnish无法检查文件系统中是否存在文件,这就是为什么它不知道是否可以使用nginx后端,或者Apache应该首先生成缩略

我安装了Apache2、nginx和清漆。Varnish接收请求,确定它用于哪个后端(静态转到nginx,动态转到Apache),从后端获取响应,并在需要时缓存它

Apache还可以生成缩略图。它使用一些特定的逻辑创建缩略图,这对于处理器来说非常昂贵。因此,Apache将thumb保存到磁盘,以便下次接收到此缩略图的请求时,可以将其直接重定向到nginx

这里有一个问题:Varnish无法检查文件系统中是否存在文件,这就是为什么它不知道是否可以使用nginx后端,或者Apache应该首先生成缩略图

我目前采用的解决方法非常简单,但很难看:

  • Varnish接收缩略图请求
  • Varnish向nginx发送请求
  • 若nginx找不到缩略图文件,它会回复404错误,Varnish会将请求重定向到Apache
  • 虽然这个算法在现实中似乎很简单,但事实并非如此。VCL配置文件中需要以下实现:

  • vcl_recv
    中,始终假定存在缩略图,如果不是从某个特殊主机请求,则必须将所有请求重定向到nginx
  • vcl\u fetch
    catch object HTTP status中,如果为404且资源为缩略图,则将主机重写为特殊主机并重新启动进程:
  • VCL:


    也许有更好的方法来解决这个问题?我知道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;
            }
        }
    }