环境:centos 7.9 nginx1-8.0
有时候为了实现不同的资源访问不同的服务器,比如客户端访问的是图片,则nginx反向代理请求到后端的静态资源服务器,访问的是动态资源,则nginx反向代理请求到后端的动态资源服务器,这种根据客户请求的不同nginx代理到不同的节点服务器,我们称之为nginx实现资源的动静分离。
为了实现资源的动静分离,我们可以部署动态资源服务器、静态资源服务器、上传资源服务器、默认服务器等,这样,当前端用户访问服务器时,我们可以根据用户传递过来的URL地址来匹配不同的nginx反向代理,从而让不同的资源解析到对应的节点服务器上。
如访问域名www.fujiseiko.com,然后用户访问www.fujiseiko.com/upload/xxx时,nginx反向代理请求的是上传资源服务器,用户访问www.fujiseiko.com/move/xxx时,nginx反向代理请求的是动态资源服务器,用户访问www.fujiseiko.com/static/xxx时,nginx反向代理请求的是静态资源服务器,用户访问www.fujiseiko.com时,nginx反向代理请求的是默认服务器,如下实现:
location /upload/ { proxy_pass http://upload_pools; include proxy.conf; } location /move/ { proxy_pass http://move_pools; include proxy.conf; } location /static/ { proxy_pass http://static_pools; include proxy.conf; } location / { proxy_pass http://default_pools; include proxy.conf; }
除了上面的根据URL实现不同的代理转发,nginx还可以根据用户设备的类型来实现不同的请求转发,如在企业中,为了让不同的客户端用户拥有更好的体验,需要在后端服务器架设不同的服务器,如移动端客户端访问的是移动网站服务器,PC客户端访问的是PC端服务器,在常规的4层负载均衡中解决这个问题是通过人为的给客户分配不同的域名,如移动端访问wap.fujiseiko.com ,pc端用户访问pc.fujiseiko.com,这样最大的问题就是需要用户记住不同的域名,为了解决这个问题,在7层负载均衡中,就不需要人为的拆分域名,只提供一个www.fujiseiko.com给用户即可,其原理是通过获取用户设备类型$http_user_agent来将请求转发到对应的服务器上,如下:
location / { if($http_user_agent ~* "MSTE") { proxy_pass http://static_pools; include proxy.conf; } if($http_user_agent ~* "chrome") { proxy_pass http://upload_pools; include proxy.conf; } proxy_pass http://default_pools; include proxy.conf; }
注意:当无法知道客户端的设备类型时,可以先模拟访问,然后在访问日志里$http_user_agent记录就能看到设备类型了。
根据文件扩展名来实现不同的请求转发,其实与前面讲的URL很类似,如下:
location ~ .*. (gif|jpg|jpeg|png|bmp|swf|css|js)$ { proxy_pass http://static_pools; include proxy.conf; } #或者使用if语句 if($http_url ~* ".*\.(php|php5|php7)$") { proxy_pass http://php_pools; include proxy.conf; } if($http_url ~* ".*\.(jsp|jsp*|do|do*)$") { proxy_pass http://java_pools; include proxy.conf; }
根据URL进行实现代理转发应用的情况,我们称之为第7层(应用层)负载均衡,而LVS一般用于TCP等的转发,我们称之为第4层(传输层)负载均衡。