几条Nginx配置技巧

539 查看

多台app server的反向代理

    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永远把他当备胎。

Nginx串接做A/B Test

用Nginx串一个Tengine可以实现一个简单的A/B Test方案,Tengine完成规则划分,要写一些lua代码(不需要所有流量都要走Tengine匹配规则)。

  • 最上层的Nginx配置中所有的请求都要带有host信息,通常情况静态资源的配置像这样

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;否则静态文件访问不到

  • 最上层的Nginx中要在upstream中配置
    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到不同的upstream
    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_blog/2008/09/proxy-caches-ar.html

简单描述问题原因

  • 浏览器到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)$ {

让android下载APK时自动安装

其实就是让移动浏览器认识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;
     }