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; }