Nginx动静分离
Nginx动静分离
动静分离的原理和应用场景
动静分离一般比较适合中小型的网站,大型网站一般来说就不这么干。因为中小型网站的并发量并不是特别高,而且需要分离出来的静态资源不是特别多,那么需要把这些静态资源挪到前置的 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目录后面带不带"/",都不会影响访问。