设为首页 收藏本站
查看: 2157|回复: 0

[经验分享] nginx多条件if判断后rewrite,减轻后端php工作压力

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-6-29 09:25:58 | 显示全部楼层 |阅读模式
  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,这四个判断条件是:

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




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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
   }




其中注意:if指令后面要有空格,最后有几个1表示有几个判断。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-236751-1-1.html 上篇帖子: 配置nginx的独立虚拟主机文件 下篇帖子: fail2ban 的安装配置 工作压力
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表