リバースプロキシ Pound セッション保持方式にHeaderを指定する
リバースプロキシといえば、おそらくsquidが有名でしょうが、
キャッシュ等の機能を必要としない場合、Poundがお手軽だと思います。
http://www.apsis.ch/pound/index_html
セッション保持の方式には、
・IPアドレス
・ベーシック認証
・リクエストパラメータ
・Cookie
・リクエストヘッダ
が選択できるようですが、今回の案件では、
「REMOTE_ADDR」というリクエストヘッダでセッション保持を
行うことになりました。
早速、
Session
Type HEADER
ID "REMOTE_ADDR"
TTL 30000
End
と設定してみたのですが・・・毎回、違うサーバに接続されてしまいます。
※REMOTE_ADDRというパラメータ名は、pythonで
#!/usr/bin/env python
import cgi
print "Content-type: text/html"
print
cgi.print_environ()
というcgiを作成し、確認
どうしようもないので、Poundのソースをいじり、デバッグしてみることに。
■svc.c
static int
get_HEADERS(char *res, const SERVICE *svc, char **const headers)
{
int i, n;
regmatch_t matches[4];
FILE *output;
output = fopen("/var/log/pound.txt", "a");
if (output == NULL) {
return 0;
}
fprintf(output, "get_HEADERS\n");
/* this will match SESS_COOKIE, SESS_HEADER and SESS_BASIC */
res[0] = '\0';
for(i = 0; i < (MAXHEADERS - 1); i++) {
if(headers[i] == NULL){
fprintf(output, "null cont\n");
fprintf(output, headers[i]);
continue;
}
if(regexec(&svc->sess_pat, headers[i], 4, matches, 0)){
fprintf(output, "next cont\n");
fprintf(output, headers[i]);
continue;
}
if((n = matches[1].rm_eo - matches[1].rm_so) > KEY_SIZE)
n = KEY_SIZE;
strncpy(res, headers[i] + matches[1].rm_so, n);
res[n] = '\0';
fprintf(output, headers[i]);
}
fprintf(output, "end\n");
fprintf(output, res);
fclose(output);
return res[0] != '\0';
}
こんな感じでソースを修正し、Poundが認識しているヘッダの名称を
出力してみると、
Remote-Addr: 192.168.1.1
・・・cgiではパラメータの名前は大文字、ハイフンはアンダーバーに
変更されるのかな?
Poundの設定ファイルを以下のように変更することで、
狙い通りセッション保持されました。
Session
Type HEADER
ID "Remote-Addr"
TTL 30000
End
【参考URL】
Pound を利用した負荷分散
もどる