リバースプロキシ 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 を利用した負荷分散



もどる