nginx动静分离
有时候为了实现不同的资源访问不同的服务器,比如客户端访问的是图片,则nginx反向代理请求到后端的静态资源服务器,访问的是动态资源,则nginx反向代理请求到后端的动态资源服务器,这种根据客户请求的不同nginx代理到不同的节点服务器,我们称之为nginx实现资源的动静分离。
nginx根据url地址实现转发请求
为了实现资源的动静分离,我们可以部署动态资源服务器、静态资源服务器、上传资源服务器、默认服务器等,这样,当前端用户访问服务器时,我们可以根据用户传递过来的URL地址来匹配不同的nginx反向代理,从而让不同的资源解析到对应的节点服务器上。
如访问域名www.dami.com,然后用户访问www.dami.com/upload/xxx时,nginx反向代理请求的是上传资源服务器;
用户访问www.dami.com/move/xxx时,nginx反向代理请求的是动态资源服务器;
用户访问www.dami.com/static/xxx时,nginx反向代理请求的是静态资源服务器;
用户访问www.dami.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;
}
nginx根据user_agent设备类型实现转发请求
除了上面的根据URL实现不同的代理转发,nginx还可以根据用户设备的类型来实现不同的请求转发,如在企业中,为了让不同的客户端用户拥有更好的体验,需要在后端服务器架设不同的服务器,如移动端客户端访问的是移动网站服务器,PC客户端访问的是PC端服务器,在常规的4层负载均衡中解决这个问题是通过人为的给客户分配不同的域名,如移动端访问wap.dami.com ,pc端用户访问pc.dami.com,这样最大的问题就是需要用户记住不同的域名,为了解决这个问题,在7层负载均衡中,就不需要人为的拆分域名,只提供一个www.dami.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记录就能看到设备类型了。
nginx根据文件扩展名 实现
根据文件扩展名来实现不同的请求转发,其实与前面讲的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;
}