我目前正在使用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一起使用吗?如果是这样,怎么样?
答案 0 :(得分:2)
一种可能的解决方案可能如下所示:
获取Cookie会移至由cron运行的单独实用程序,并通过crontab或at进行配置。如果云服务器始终使用某个会话寿命,则应使用前一种方法,后者更适合动态&#34;当前会话以分钟/小时/天为单位结束。该程序可以用您喜欢的编程语言编写,我会使用Libwww的Perl或http.client模块的Python。该程序的目标是向服务器发出登录请求,接收结果,提取Set-Cookie
标头,并将其值存储为nginx配置格式的文件。配置为cookie值设置专用变量。
现在可以在
的代理配置中使用auth cookieproxy_set_header Cookie $ auth_cookie;
更新cookie后,身份验证程序应发送HUP信号以重新加载配置。
要阐述的另一个可能的问题/任务是如何在会话意外到期时(例如由于云服务器重新加载)的情况下作出反应。为了解决这个问题,我会设置一个简单的FastCGI,比如this,它会触发一个非计划运行的认证程序,然后将这个CGI设置为[下一个代理上游]。可能CGI也应该执行原始请求,使整个执行链对服务器客户端完全透明。
自动续订的另一个问题是,当客户端发送请求时,如果客户端没有有效的身份验证Cookie,则可能会出现争用情况。现在,我似乎不可避免的是CGI必须实现某种锁定(对生成的配置文件或主nginx配置文件进行文件锁定?还不确定)以防止同时多次获取cookie。
建议的方法可以让您构建整个解决方案,而无需更改nginx soruces本身。或者,如果您不介意编写nginx模块,可以将解决方案转移到自定义模块中,但当然需要更加谨慎地开发和调试它。
建议的解决方案的代码非常简单,但如果您对特定部分有疑问,我可以提供一些示例和代码片段。