#nginx分发器设置http { upstream web1 { # 名为web1的反向代理群组 server server1; } upstream web2 { # 名为web2的反向代理群组 server server2; } server { # web1虚拟主机 listen 80; server_name www.web1.com; # 基于域名分发必须有域名 location / { proxy_pass http://web1; } } server { # web2虚拟主机 listen 80; server_name www.web2.com; # 基于域名分发必须有域名 location / { proxy_pass http://web2; } }}
2、基于开拓措辞分发
适用于稠浊开拓的网站,某些大型网站既有php也有jsp
# 分发器上nginx配置http { upstream php { server server1; } upstream asp { server server2; } upstream html { server server2; } server { location ~ \.php$ { # 以php结尾的 proxy_pass http://php; } location ~ \.asp$ { # 以asp结尾的 proxy_pass http://asp; } location ~ \.html$ { # 以html结尾的 proxy_pass http://html; } }}
3、基于浏览器分发
常运用于PC端和移动端区分或浏览器适配
upstream curl { server server1; }upstream firefox { server server2; }upstream other { server server3; }server { listen 80; server_name www.web1.com; location / { proxy_pass http://other; if ( $http_user_agent ~ curl ) { proxy_pass http://curl; } if ( $http_user_agent ~ firefox ) { proxy_pass http://firefox; } }}
4、基于源IP分
通过ngx_http_geo_module模块,根据客户端ip访问到不同的server

upstream bj.server { server server1; # web01}upstream sh.server { server server2; # web02}upstream default.server { server server3; # web03}geo $geo { # IP库 default default; server1 bj; # 北京 server2 sh; # 上海}server { listen 80; server_name www.web1.com; location / { proxy_pass http://$geo.server$request_uri; }}
5. 根据http header转发到不同的做事
根据要求 Header 转发不同后端做事server。
http { map $http_custom_header $backend_name { default backend1; "version2.0" backend2; } upstream backend1 { server backend1.example.com; } upstream backend2 { server backend2.example.com; } server { listen 80; location / { proxy_pass http://$backend_name; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }}
在这个配置中,$http_custom_header 是一个变量,代表HTTP要求header中的自定义字段。map 指令根据这个变量的值来设置一个变量 $backend_name。如果要求header中的自定义字段值为 "version2.0",则会将要求转发到 backend2.example.com;否则,会转发到 backend1.example.com。
也可以如下配置
map $http_accept $version { default ""; "application/vnd.demo.v2.0+json" "v2.0";}upstream backend1 { server backend1.example.com;}upstream backend2 { server backend2.example.com;}server { listen 80; server_name olive.com; charset utf-8; autoindex off; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-Ssl on; if ($version="v2.0"){ proxy_pass http://backend2; break; } proxy_pass http://backend1; }}
在这个配置中,$http_accept 是一个变量,代表HTTP要求header中的http_accept字段。map 指令根据这个变量的值来设置一个变量 $version。如果要求header中的自定义字段值为 "application/vnd.demo.v2.0+json",则$version的值为v2.0;否则$version的值为空字符串。然后if条件判断根据$version的值进行转发。