本站文章(技术文章和tank手记)均为社长矢量比特工作.实践.学习中的心得原创,请勿转载!

nginx多条件if判断后rewrite,减轻后端php工作压力(随笔)

web服务器 矢量比特

nginx的配置文件可以看成是一个程序,一个按照程序员思维习惯进行语法设置的nginx配置程序,编写简单便于理解,而且配合着各种变量和if判断等指令可以灵活的做各种策略设置。工作中,每当一个请求过来,都会执行一遍配置文件,配置文件的各个变

先说下我对nginx配置文件的认识:

      nginx的配置文件可以看成是一个程序,一个按照程序员思维习惯进行语法设置的nginx配置程序,编写简单便于理解,而且配合着各种变量和if判断等指令可以灵活的做各种策略设置。

      工作中,每当一个请求过来,都会执行一遍配置文件,配置文件的各个变量也会伴随着重新开辟一套,也就是说每个请求是相互独立的存在空间,而配置文件里的指令集的多少会根据编译模块的不同而不同,有些时候你配置一个指令,用nginx -t测试没通过,不一定是指令或语法写错,而是对应的模块没有编译进去,可以用nginx -m查看一下对应的模块。

 

遇到的具体问题和解决思路:

      这两天在做一个七层策略,优化访问请求,原来有大量安卓过来的302、301是通过后端php代码实现的,为了减轻后端php的工作负载,同时减少日志的输出量,想尽量把处理放到nginx这一层上。具体想法是当匹配到某个url、且ua是手机安卓时,进行一次rewrite操作,就用最基本的nginx配置文件实现,也不去用lua脚本之类的。

      假设要匹配的url 是http://abc.def.com/aaa.html  ,匹配后302rewrite到http://www.hig.com ,我判断的逻辑是host=abc.def.com 并且是 request_uri=aaa.html 并且在ua中匹配到是安卓的手机设备。经过了解,安卓手机设备对应的ua的特点是同时含有android和mobile关键字,其实最后就是4层判断,这四层判断同时成立就rewrite,这四个判断条件是:

$host = "abc.def.com"
$request_uri = "aaa.html"
$http_user_agent ~* "mobile"
$http_user_agent ~* "android"

      经过查询了解,nginx配置文件是不支持if嵌套、并且不支持类似shell 的 &&  和 || 的写法 ,这样就必须想别的办法解决,是的,可以变量做flag标记的方式来解决,网上也有很多例子,最后我的写法如下:

set $flag 0;
if ( $host = "abc.def.com" ){
   set $flag "1";
   }
if ( $request_uri = "/aaa.html" ){
   set $flag "${flag}1";
   }
if ( $http_user_agent ~* "mobile" ){
   set $flag "${flag}1";
   }
if ( $http_user_agent ~* "android" ){
   set $flag "${flag}1";
   }
if ( $flag = "1111" ){
   rewrite ^/(.*)$ http://www.hig.com redirect;
   }


运维网咖社”原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://www.net-add.com


©本站文章(技术文章和tank手记)均为社长"矢量比特"工作.实践.学习中的心得原创或手记,请勿转载!

喜欢 (3) or 分享 (0)
欢迎扫描关注微信公众号【运维网咖社
社长"矢量比特",曾就职中软、新浪,现任职小米,致力于DevOps运维体系的探索和运维技术的研究实践.