文章

Nginx动静分离

Nginx动静分离

动静分离的原理和应用场景

image-20240324184804459

​ 动静分离一般比较适合中小型的网站,大型网站一般来说就不这么干。因为中小型网站的并发量并不是特别高,而且需要分离出来的静态资源不是特别多,那么需要把这些静态资源挪到前置的 nginx 服务器里。如果大型系统的话,文件太多,比如说淘宝,用户上传的文件就非常多。比如买家秀,卖家秀,还有商户上传这些商品详情页里边的一些介绍这些图片,这些都属于是静态资源,非常多,它不适合动静分离这种简单的技术架构。

用户发起请求,请求到nginx之后,nginx 会把请求代理给后端,原本项目部署在这个 tomcat 的某一个目录下,比如说webAPP目录下,这里边包含了所部署的jar包,jar包里边包含静态的资源在 static目录下,后端会响应很多非动态的请求,比如网站的首页内嵌很多的图片, css, js 这些。相对来说,一次请求肯定是完不成用户的请求,那第二次用户还会再去请求。 nginx 再去把这个请求代理到我们这个 tomcat 上,再去找那些静态的这些资源。

​ 也就是说用户第一次请求 ,拿回一个首页之后,还会在这首页里边去访问里边内嵌的一些 js CSS ,并发请求非常多,打到 tomcat 上。

​ 将动态请求和静态请求分离开,把这 static 目录下资源如 js、 CSS 、图片前置到我们的 nginx 里,这就叫动静分离,然后把这些动态的请求,打到后端这个tomcat上,这就是动静分离的基本原理。

动静分离配置

增加每一个location

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
	
	server {
        listen       80;
        server_name  localhost;
		
        location / {
			proxy_pass http://127.0.0.1:8080;
        }
		
		location /css {
			root /usr/local/nginx/static;
			index index.html index.htm;
        }
		
		location /images {
			root /usr/local/nginx/static;
			index index.html index.htm;
        }
		
		location /js {
			root /usr/local/nginx/static;
			index index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

使用一个location

使用正则

location 前缀

/ 通用匹配,任何请求都会匹配到。

= 精准匹配,不是以指定模式开头

~ 正则匹配,区分大小写

~* 正则匹配,不区分大小写^~ 非正则匹配,匹配以指定模式开头的location

location匹配顺序

  • 多个正则location直接按书写顺序匹配,成功后就不会继续往后面匹配
  • 普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)
  • 当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配
  • 所有类型location存在时,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配)
location ~*/(css|img|js) {

	root /usr/local/nginx/static;

	index index.html index.htm;

}

alias与root

location /css {

	alias /usr/local/nginx/static/css;

	index index.html index.htm;

}

root用来设置根目录,而alias在接受请求的时候在路径上不会加上location。

1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alias目录下查找的;

2)root指定的目录是location匹配访问的path目录的上一级目录,这个path目录一定要是真实存在root指定目录下的;

3)使用alias标签的目录块中不能使用rewrite的break(具体原因不明);另外,alias指定的目录后面必须要加上"/"符号!!

4)alias虚拟目录配置中,location匹配的path目录如果后面不带"/",那么访问的url地址中这个path目录后面加不加"/"不影响访问,访问时它会自动加上"/"; 但是如果location匹配的path目录后面加上"/",那么访问的url地址中这个path目录必须要加上"/",访问时它不会自动加上"/"。如果不加上"/",访问就会失败!

5)root目录配置中,location匹配的path目录后面带不带"/",都不会影响访问。

License:  CC BY 4.0