Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。动静分离技术其实是采用代理的方式,在server{}段中加入带正则匹配的location来指定匹配项,在Nginx的配置中,是通过location配置段配合正则匹配实现静态与动态页面的不同处理方式。
nginx location的正则法则:
~ 为区分大小写的匹配。
~* 不区分大小写的匹配(匹配firefox的正则同时匹配FireFox)。
!~ 不匹配的
!~* 不匹配的
. 匹配除换行符以外的任意字符
location 匹配的优先级(与location在配置文件中的顺序无关)
= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。
location / { proxy_pass http://127.0.0.1:8080; proxy_redirect off; proxy_set_header HOST $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } #error_page 404 /404.html; location ~* .(html|htm|shtml|gif|jpg|jpeg|bmp|png|ico|js|mp4|css)$ { root /home/www/static/show; #expires expires 3d; }
注意一点的是:
我之前走了岔路,想用Application相对路径+文件路径的正则来匹配,调试了半天都没有通过。在线的正则匹配不支持nginx的规则。
经同事提醒,可以使用文件的相对路径正则+root到相应静态文件的目录,例如
root /home/www/static/show;
而不是location的正则。
参考文献:
https://www.jianshu.com/p/4a3dd77fe3e5
http://blog.csdn.net/gzh0222/article/details/7845981
http://blog.csdn.net/kobejayandy/article/details/20805059