使用自定义会话端点的连接池反向代理?

时间:2014-12-23 11:40:46

标签: apache session nginx cloudant

我目前正在使用nginx作为代理,为连接使用基本HTTP身份验证的后端数据库服务提供连接池:

user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
    worker_connections 10000;
}

http {
  client_max_body_size 0;
  sendfile        on;

  upstream cloudant_backend {
    server <hostname>.cloudant.com:443;
    keepalive 64;
  }

  server {
    listen       5984;
    server_name  localhost;

    location / {
      proxy_pass https://cloudant_backend;
      proxy_redirect off;
      proxy_http_version 1.1;
      proxy_set_header Connection "";
      proxy_set_header Host <hostname>.cloudant.com;
      proxy_set_header Authorization "Basic <base64encodedusernamepassword>";
    }
  }
}

nginx.conf的原始来源:https://github.com/greenmangaming/cloudant-nginx

但是,通过对/_session端点执行HTTP POST以检索在后续请求中重复使用的身份验证cookie,可以more efficient option通过后端进行身份验证。

问题:这可能与nginx或Apache httpd一起使用吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:2)

一种可能的解决方案可能如下所示:

  1. 获取Cookie会移至由cron运行的单独实用程序,并通过crontabat进行配置。如果云服务器始终使用某个会话寿命,则应使用前一种方法,后者更适合动态&#34;当前会话以分钟/小时/天为单位结束。该程序可以用您喜欢的编程语言编写,我会使用Libwww的Perl或http.client模块的Python。该程序的目标是向服务器发出登录请求,接收结果,提取Set-Cookie标头,并将其值存储为nginx配置格式的文件。配置为cookie值设置专用变量。

  2. 配置nginx,以便通过include指令将生成的文件作为配置的一部分包含在server上下文中。

  3. 现在可以在

    的代理配置中使用auth cookie

    proxy_set_header Cookie $ auth_cookie;

  4. 更新cookie后,身份验证程序应发送HUP信号以重新加载配置。

    要阐述的另一个可能的问题/任务是如何在会话意外到期时(例如由于云服务器重新加载)的情况下作出反应。为了解决这个问题,我会设置一个简单的FastCGI,比如this,它会触发一个非计划运行的认证程序,然后将这个CGI设置为[下一个代理上游]。可能CGI也应该执行原始请求,使整个执行链对服务器客户端完全透明。

    自动续订的另一个问题是,当客户端发送请求时,如果客户端没有有效的身份验证Cookie,则可能会出现争用情况。现在,我似乎不可避免的是CGI必须实现某种锁定(对生成的配置文件或主nginx配置文件进行文件锁定?还不确定)以防止同时多次获取cookie。

    建议的方法可以让您构建整个解决方案,而无需更改nginx soruces本身。或者,如果您不介意编写nginx模块,可以将解决方案转移到自定义模块中,但当然需要更加谨慎地开发和调试它。

    建议的解决方案的代码非常简单,但如果您对特定部分有疑问,我可以提供一些示例和代码片段。