4月 202011
 

お久しぶりです。
さすがにたまには書かないと忘れ去られそうなのでちょっと小ネタでも

VCL中にインラインCで好きな処理を書くことができるのは以前記事でも取り上げましたが
世の中に溢れている様々なライブラリを利用するにはどうすればよいでしょうか?

今回は例としてlibmemcachedを利用して最後にアクセスされたURL(req.url)をmemcacheにストアするVCLを書いてみます。


さてしかし、どうやってlibmemcachedを呼び出せばいいでしょうか?

ここで今回の最大のポイントです。
cc_commandという起動パラメータを変更してあげると、共有ライブラリを呼び出すことが可能になります。
cc_commandはvarnishがvclをコンパイルして.soにする際に利用するコマンドになります。

デフォルトのcc_commandは


exec cc -fpic -shared -Wl,-x -o %o %s

となっています。
ここで感の良い方であれば、ここを変更することでいろいろなライブラリを使用することができるのに気づくでしょう。

今回はlibmemcachedを使うので


exec cc -fpic -shared -Wl,-x -lmemcached -o %o %s

と指定すればlibmemcachedを利用することができます。

なお起動パラメータですが
私の環境はCentOSなので
/etc/sysconfig/varnish
を以下のように変更しました。


DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -p 'cc_command=exec cc -fpic -shared -Wl,-x -lmemcached -o %o %s' \
             -u varnish -g varnish \
             -s malloc,700M"

VCLはこんな感じです


C{
#include <stdlib.h>
#include <stdio.h>
#include <libmemcached/memcached.h>

void mctest(char *k ,char *v){
        struct memcached_st             *mmc            = NULL;
        struct memcached_server_st      *servers        = NULL;
        memcached_return                rc;

        mmc     = memcached_create(NULL);
                servers = memcached_server_list_append(servers,
                                "localhost", 11211, &amp;amp;amp; rc);
        rc      = memcached_server_push(mmc, servers);
        memcached_server_list_free(servers);
                rc      = memcached_set(mmc, k, strlen(k),
                        v, strlen(v), 600, 0);

        memcached_free(mmc);

}

}C
backend xcir{
        .host="127.0.0.1";
        .host_header="xcir.net";
        .port="81";
}
backend imasu{
        .host="127.0.0.1";
        .host_header="imasu.jp";
        .port="81";
}
sub vcl_recv {
        C{
                char *value=(char*)VRT_r_req_url(sp);
                mctest("log",value);
                free(value);
        }C

        if (req.http.host ~ "^xcir.net$"){set req.backend=xcir;}
        elseif (req.http.host ~ "^imasu.jp$"){set req.backend=imasu;}
        return (lookup);
}

早速起動してみて
適当にブラウザから見てみるとmemcacheにストアされているか見てみます。


[root@LIP-APP-01 ~]# telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.

get log
VALUE log 0 92
/index.php/2011/02/qpstudy05%e8%a1%8c%e3%81%a3%e3%81%a6%e3%81%8d%e3%81%9f%e3%82%88%ef%bc%81/
END
get log
VALUE log 0 12
/favicon.ico
END
get log
VALUE log 0 12
/favicon.ico
END

されています。
以上でインラインCから共有ライブラリを呼び出すことができました。

さて今回は例としてlibmemcachedを利用していますが
cc_commandに指定することで他の様々なライブラリを利用することができます。
ぜひ皆様もチャレンジしてみてください。

なおデバッグする際にもきちんとcc_commandを指定してあげないとundefined symbolが出ますのでご注意ください。

参考サイト
C言語 libmemcachedを使う
CentOSでlibmemcachedを使う


 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)