介绍
该文章介绍前端静态资源部署的问题,暂不讨论强缓存与协商缓存等知识点。
静态资源部署
上传前端项目
- 在前端服务器上,执行
cd /
进入到根目录。前端项目我通常会放在自己建立的/data/web/
这个目录下。所以先利用mkdir
命令创建data
目录,然后cd data
进入data
目录后,再创建web
目录并cd web
。 - 我的项目名是
demo
。所以在web
目录下新建一个demo
目录。这个demo
就可以上传压缩的前端项目dist
包。rz
选择zip
包后,执行unzip dist.zip
。 - 总结一下,我现在将项目部署到了前端服务器的
/data/web/demo/
目录下。
配置nginx
Nginx
分为master
与server
两种。通常在master
中维护公共配置,一般是在/etc/ngnix/nginx.conf
文件中配置,而在server
中则针对不同的项目来进行不同的配置,一般是在/etc/nginx/conf.d/
目录中新建.conf
后缀文件来进行配置。- 以上述
demo
为例,新建demo.conf
,配置location
块。
server {
listen 端口;
server_name ip或者域名;
location /demo/ {
root /data/web;
#不设置index的话 默认是index.html
#index demo.html;
access_log logs/demo_access.log;
error_log logs/demo_error.log;
}
}
- 上面配置的
Nginx
,当我们在浏览器中访问网站/demo/test.html
时,就会映射到服务器的/data/web/demo/test.html
。另外,location
块这里有些比较重要的知识点。
location
server {
listen 80;
server_name jsgoshu.cn;
location /blog/nginx/ {
root /data/web;
#alias /data/web/blog/nginx/;
index index.html;
access_log logs/blog_nginx_access.log;
error_log logs/blog_nginx_error.log;
}
}
- 路由匹配规则
首先,一句话总结。匹配规则从高到低依次是精确匹配>^~
的字符串匹配>正则匹配>字符串匹配。
匹配符号分为四类,分别是=
、~
、~*
、^~
。
=
表示精确匹配,优先级最高。
^~
表示字符串匹配,但优先级高于正则匹配
~
与~*
表示正则匹配。
可能上面有点难以理解。nginx
路由的一套完整匹配规则如下:
TIP
①.'='前缀的指令严格匹配这个查询。如果找到,停止搜索。
②.所有剩下的常规字符串,最长的匹配。如果这个匹配使用'^~'前缀,停止匹配。
③.正则表达式,按照在配置文件中定义的顺序。
④.如果第③条规则产生匹配的话,结果被使用。否则,使用第2条规则的结果。
root
与alias
root
会将访问时匹配的路由与该root
值拼接在一起,形成服务器上完整路径。可以对照node
中的path.resolve(__dirname, '/blog/nginx/index.html')
来大致理解。
而alias
意为别名。它是将访问时匹配的路由映射到服务器的实际路径。不会再拼接一次。
另外我个人在使用alias
时,发现需要注意一些问题:
WARNING
①alias
只可以用来匹配目录,而不是静态资源。譬如访问路由是/blog/nginx
,实际上会重定向到/blog/nginx/
,这里的重定向会是301永久重定向。这种情况还好。但譬如访问/test.jpg
,实际访问/test.jpg/
。这就很严重了。
②301永久重定向会产生浏览器缓存,下次的请求会直接读取本地缓存,而不会发起网络请求。除非手动清除浏览器缓存并刷新。
③正是由于上面的原因,所以绝对不要用alias
配置静态资源的映射访问。(其实现实中也不会用一个静态资源对应一个nginx匹配)。譬如:
location /test.jpg {
alias /blog/nginx/;
}
当访问域名/test.jpg
时,会产生301永久重定向到域名/test.jpg/
。毫无疑问,页面上会出现403
或者404
。由于浏览器缓存,即使你换用root
来重新配置nginx
,只要原始访问路径不变,都不会起到效果。设想下,如果这种情况发生在生产环境😫。
总结:
- `nginx`的匹配路由应该对应到目录,而不是某一静态资源。
- 即使想要直接匹配静态资源,也不要用`alias`。而是可以用`root`。
try_files
try_files
的使用,多见于部署SPA
项目。
语法:try_files $uri $uri/ index.html;
try_files
的作用是按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示文件夹),如果前述的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。
假设访问路径是jsgoshu.cn/blog/nginx
。而location
配置简略如下:
location /blog/ {
root /data/web;
try_files $uri $uri/ /blog/index.html;
index index.html;
}
依次寻找/data/web/blog/nginx
data/web/blog/nginx/index.html
。都没有找到的话,就重定向到/data/web/blog/index.html
。
add_header
add_header
可以用来设置响应头。常见的设置是这样:add_header Cache-Control no-store;
access_log
与error_log
access_log
与error_log
分别代表的是访问日志与错误日志。这在开发中对于快速定位问题是非常有帮助的。所以推荐在配置location
的时候也一定加上log
。
另外要注意的是,在conf.d
目录中自定义的的conf
文件,都会以include
引入到nginx.conf
中。所以在设置access_log
与error_log
的相对路径时,实际上是要以nginx.conf
的相对路径来设置。