设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 1389|回复: 2

[nginx] 将不同的HTTP User Agent请求转发到特定的后端服务器 [复制链接]

Rank: 8Rank: 8

签到
27
注册时间
2008-6-13
最后登录
2012-1-20
在线时间
201 小时
阅读权限
90
积分
3096
帖子
891
主题
147
精华
0
UID
74

LT粉丝

发表于 2010-9-9 16:05:59 |显示全部楼层
假设我这里有大量图像、CSS、javascript等静态文件,分别放在后端服务器  192.168.1.5 和 192.168.1.6上,那么我如何利用nginx的反向代理功能将不同的 http_user_agent 请求发送到指定的服务器上呢?如 "Mozilla" 转发到 192.168.1.5 ,MSIE  转发到 192.168.1.6 。
Nginx web 服务器支持if条件表达式,由此来跳转或者使用不同的配置变量。在本文中需要使用 $http_user_agent 变量,它标记了用户浏览器的类别,版本以及操作系统的一些信息,语法如下:if ( condition ){
  do_something
}
if ( $http_user_agent = "wget" ){
   do_something
}
if ( $http_user_agent ~ MSIE ){
   return 403;
}


if指令会就检查后面表达式的值是否为真(true),如果为真,则执行后面大括号中的内容。以下是一些条件表达式的比较方法:
1、变量的完整比较可以使用=或!=操作符
2、 部分匹配可以使用正则表达式来表示,~或~*
3、~表示区分大小写
4、~*表示不区分大小写(firefox与FireFox是一样的)
5、!~与!~* 是取反操作,也就是不匹配的意思
6、检查文件是否存在使用 -f 或 !-f 操作符
7、检查目录是否存在使用-d或!-d操作符
8、检查文件,目录或符号连接是否存在使用-e或!-e操作符
9、检查文件是否可执行使用-x或!-x操作符
10、正则表达式的部分匹配可以使用括号,匹配的部分在后面可以用$1~$9变量代替,这些和apache一致。例子:
编辑 /usr/local/nginx/conf/nginx.conf 文件
#vi /usr/local/nginx/conf/nginx.conf
设置upstream服务器:upstream myproxybackend  {
       server 192.168.1.1;
       server 192.168.1.2;
       server 192.168.1.3;
       server 192.168.1.4;
}

upstream msiebackend  {
       server 192.168.1.6;
}

upstream mozillabackend  {
       server 192.168.1.5;
}


更新虚拟主机配置文件server {
      access_log  logs/access.log;
      error_log   logs/error.log;
      index       index.html;
      listen      202.54.1.5:80 default;
      root        /usr/local/nginx/html;
      server_name example.com www.example.com 0.example.com;

     ## PROXY - Web
      location / {
        proxy_pass  http://myproxybackend;
        if ($http_user_agent ~ MSIE ) {
              proxy_pass  http://msiebackend;
        }
        if ($http_user_agent ~ Mozilla ) {
              proxy_pass  http://mozillabackend;
        }

        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
# many more...
# many more...
}




最后重启/重新载入nginx
#/usr/local/nginx/sbin/nginx -s reload


来源:http://salogs.com/2010/07/nginx- ... ser_agent-requests/
http://www.cyberciti.biz/faq/nginx-if-conditional-http_user_agent-requests/

Rank: 8Rank: 8

注册时间
2008-6-13
最后登录
2012-1-20
在线时间
201 小时
阅读权限
90
积分
3096
帖子
891
主题
147
精华
0
UID
74

LT粉丝

发表于 2010-9-9 16:07:44 |显示全部楼层
nginx根据http_user_agent防DDOS


  1. 首先查看访问日志,找出可疑访问 找到http_user_agent 的特征,然后再作过滤
  2. "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate"


  3. if ($http_user_agent ~ must-revalidate) {

  4. return 503;

  5. }
  6. 这样就返回503错误
复制代码



小心误杀!

使用道具 举报

论坛元老

风起

Rank: 8Rank: 8

注册时间
2010-6-29
最后登录
2012-2-4
在线时间
124 小时
阅读权限
90
积分
3337
帖子
233
主题
19
精华
0
UID
9647
发表于 2010-9-9 19:21:47 |显示全部楼层
nginx根据http_user_agent防DDOS





小心误杀!
nginxman 发表于 2010-9-9 16:07



   是啊,误杀 就不得了了

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢红之盟网络提供带宽支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2012-2-4 19:30 , Processed in 0.072812 second(s), 12 queries , Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部