upstream prod { server 192.168.1.1:6001; server 192.168.1.2:6001 backup; }
一般一个web app的部署方式,好比rails app就是启动一个unicorn开多个worker,或者用PUMA等多线程的server。这样来充分利用服务器资源,不过一旦这台服务器挂了,有个backup server即是极好的。可是backup server可能性能不是很好,或者仅仅是从别的用途的服务器上挤出来一点资源作backup server, 第二行的backup
就是让upstream永远把他当备胎。css
用Nginx串一个Tengine能够实现一个简单的A/B Test方案,Tengine完成规则划分,要写一些lua代码(不须要全部流量都要走Tengine匹配规则)。html
最上层的Nginx配置中全部的请求都要带有host信息,一般状况静态资源的配置像这样android
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires 30d; add_header Cache-Control public; proxy_pass http://prod; }
可是串接时必须在里面再加上proxy_set_header Host $http_host;
不然静态文件访问不到web
最上层的Nginx中要在upstream中配置redis
upstream prod { server tengine_host:80; server 192.168.1.1:6001 backup; }
即便tengine挂掉也不会影响app正常work浏览器
Tengine redis保存A/B Test规则,用lua-resty-redis
获取规则服务器
用lua解析匹配web app设置的用于A/B Test规则的cookie或者url,并proxy到不一样的upstreamcookie
upstream prod_in_beijing { server 192.168.1.1:6001; server 192.168.1.2:6001 backup; } upstream prod_in_usa { server 192.168.1.1:6002; server 192.168.1.2:6002 backup; }
之前常常碰到登陆论坛时,登陆后的资料是别人的,彻底是用另一个账号登陆的效果,也就是串账号了。
相关blog
http://blog.isc2.org/isc2_blo...session
简单描述问题缘由多线程
浏览器到app server中间不少地方是有cache的,尤为是静态资源
静态文件的header中若是Cache-Control
是public且带有cookie信息,这个文件会被cache住而后分发给全部请求相同文件名的用户
rails等的cookie based session或者各类session id的cookie会共享给其余其余用户,也就形成了串号
解决方法
添加 proxy_hide_header Set-Cookie;
到静态资源配置如location ~* .(js|css|png|jpg|jpeg|gif|ico)$ {
其实就是让移动浏览器认识app安装包
添加 application/vnd.android.package-archive apk;
到mime.types配置文件
在站点配置(server {
)中添加
location ~* \.(apk)$ { add_header Content-Type application/vnd.android.package-archive; proxy_pass http://prod; }