Nginx系列之4:动静分离

为了提高网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源比如图片,js,css等文件,我们可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器。用户请求的动态文件比如servlet,jsp则转发给Tomcat,Jboss服务器处理,这就是动静分离。这也是反向代理服务器的一个重要的作用。

实现方式:

  • 1、(推荐)将静态文件存放在专门的服务器上,使用单独的域名
  • 2、将动态和静态文件放在一起,使用nginx区分

以实现方式1为例
前提:将静态文件存放在代理服务器中
在ngnix中创建文件目录(如/usr/local/nginx/static),将所有静态文件发布到该目录中
在nginx.conf http server 中配置动静分离

server {
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
    {
        root /usr/local/nginx/static;
        # 客户端浏览器缓存30天
        expires 30d;
    }
}


在实际的后台服务器中发布的程序中,使用静态文件时,路径指向设置为静态文件服务器(这里是代理服务器)。

完整配置

server {
        listen       80;
        server_name  localhost;
 
        #charset koi8-r;
 
        #access_log  logs/host.access.log  main;
        
        location / {
        proxy_next_upstream http_502 http_504 error timeout invalid_header;
        proxy_pass http://localhost:8082;
        # 真实的客户端IP
        proxy_set_header   X-Real-IP        $remote_addr; 
        # 请求头中Host信息
        proxy_set_header   Host             $host; 
        # 代理路由信息,此处取IP有安全隐患
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        # 真实的用户访问协议
        proxy_set_header   X-Forwarded-Proto $scheme;
        }
        
        #静态文件交给nginx处理
        location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|
        zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
        {
            root /static;
            expires 30d;
        }
        #静态文件交给nginx处理
        location ~ .*\.(js|css)?$
        {
            root /static;
            expires 1h;
        }
 
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
 
        # deny access to .htaccess files, if Apache‘s document root
        # concurs with nginx‘s one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

页面中的图片是放在了和Nginx同级目录的static文件夹下面。
动静分离的原理:Nginx配置中,通过location的配置,结合正则表达式,根据请求路径判断当前请求是否静态资源,如果是,则通过 root static; 配置直接读取/usr/local/nginx/static下面对应相对路径的资源。如果是jsp等动态资源,则转发到Tomcat服务器。
注意,可以使用 root [绝对路径];, 不一定要将静态资源放在Nginx目录下。
这里将静态资源的location放在前面优先匹配(同样是正则匹配的情况下)。
在此基础上,也可以通过不同的正则对不同的静态资源类型配置不同的缓存期限,如创意等图片可能会变动,缓存期限设小一点,而js/css等静态资源基本不变,缓存期限可以设长一点。

相关推荐