nginx:将HTTP用户代理请求发送到特定的后端服务器

时间:2020-01-09 10:42:47  来源:igfitidea点击:

在后端服务器IP 192.168.1.5和192.168.1.6上的大量图片,css和javascript。
如何确保nginx反向代理负载平衡器始终将来自Mozilla的所有http_user_agent请求仅发送到服务器192.168.1.5,而将MSIE发送到服务器192.168.1.6?
如果有条件的话,Nginx Web服务器不支持它可以根据变量重定向和/或者选择配置。
在这种情况下,您需要使用名为$http_user_agent的变量,该变量可用于检索有关用户浏览器,版本和操作系统的信息。
语法如下:

if ( condition ){
  do_something
}
if ( $http_user_agent = "wget" ){
   do_something
}
if ( $http_user_agent ~ MSIE ){
   return 403;
}

if指令用于检查条件的真实性。
如果条件为真,则执行花括号中指示的代码,并根据以下块中的配置处理请求。
指令if内部配置是从上一级继承的。
您可以在条件中使用变量名或者任何以0开头的字符串。
也,

  • 使用=和!=运算符将变量与行进行比较;
  • 使用符号~*和~与正则表达式进行模式匹配:
  • ~是区分大小写的匹配
  • ~*指定不区分大小写的匹配项(firefox匹配FireFox)
  • !~和!~*表示相反,不匹配
  • 使用-f和!-f运算符检查文件是否存在;
  • 使用-d和!-d运算符检查目录的存在;
  • 使用-e和!-e运算符检查文件,目录或者符号链接的存在;
  • 使用-x和!-x运算符检查文件是否可执行。
  • 正则表达式的某些部分可以放在括号中,然后可以在$1到$9变量中访问其值。

例子

编辑/usr/local/nginx/conf/nginx.conf,执行:

# vi /usr/local/nginx/conf/nginx.conf

设置上游服务器:

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

最后重启/重新加载新的更改:

# /usr/local/nginx/sbin/nginx -s reload