nginx 在前端中的简单应用

目录
文章目录隐藏
  1. 关于 Nginx
  2. Nginx 配置精进

其实从刚入行起,就陆陆续续接触 Nginx,学着安装,学着配,学着用它解决不是前端管得了的前端问题,知识零零星星从百度查了很多,但从没记住,于是….

关于 Nginx

如果对 Nginx 一点概念还没有,推荐看一下百度百科之 nginx

记住一句:Nginx 是一个很强大的高性能 Web反向代理服务,它具有很多非常优越的特性;

高性能 Web 服务

Web 服务实际上又称静态资源服务,自从前后端分离后,前端的输出趋向于静态资源的形式,什么是静态资源:就是我们通常用 webpack 构建输出的结果,比如:

nginx 在前端中的简单应用

而为了提供文件在互联网中的可访问性,前端还是需要依赖静态资源服务;最常用的做法就是 Node 服务和 Nginx 服务。

Node 服务最常见的,就是 WebpackServer, 在前端开发联调时经常用到, 启动后我们就可以通过 http://localhost:8907/bundle.05a01f6e.js 的形式来访问构建资源;除此之外,我给大家安利另一款 Node 服务库:serve, 它也能快速启动一个静态资源服务。

但在生产环境,我们一般用 Nginx 来处理,不是 Node 不好,而是 Nginx 已经够好了。通常整个大前端会有很多前端项目,我们都将构建结果放在一台服务器上(一般有备份机器)的某个文件夹下,然后通过安装 Nginx 来创建一个静态资源服务供所有前端资源的访问;比如文件夹 static 下有 A,B,C,D 四个前端项目资源, 我们通过 nginx 配置:

server {
    listen 80;
    listen[: :] : 80;
    server_name static.closertb.site;

    #Load configuration files
    for the
default server block.include / etc / nginx /
default.d
    /*.conf;

       location / {
           alias /home/static/;
           autoindex on;
           if ($request_uri ~ .*\.(css|js|png|jpg)$) {
                #etag on;
                expires 365d;
                #add_header    Cache-Control  max-age=31536000;
           }
        }
    }*/

我们即可通过http://static.closertb.site/A… 访问 A 项目,通过http://static.closertb.site/C… 访问 C 项目, 从而做到一鸡多吃,这种玩法在 HTTPS 与 HTTP2 的时代特别常见。

以上就是 Nginx 作为 Web 服务的简单用法,接下来我们了解一下反向代理服务

反向代理服务

作为一个开发者,可能经常听到代理两字,但很多人区分不清楚正向和反向的区别:

nginx 反向代理服务

如上图左侧所示,正向代理是用户的主动行为,如我们 fq 时访问 goggle 所做的;右侧反向代理是我们访问的服务器行为,作为用户的我们是不能控制也无需关注的。

反向代理在服务部署中,是一种非常常见的技术,比如负载均衡、容灾、缓存。

而对于前端开发来说,反向代理多用于请求转发,来处理跨域问题。当我们把前端静态资源服务都指向一个域名(static.closertb.site)时,与服务端请求域名(server.closertb.site)不一致,就会造成跨域。如果服务端不配合的话,那通过 nginx,前端也是可以轻松做到的,在前面的配置上,我们添加:

server {
    listen 80;
    listen[: :] : 80;
    server_name static.closertb.site;

    location / api / {
        proxy_pass http: //server.closertb.site;
        proxy_set_header Host $host;
        proxy_set_header X - Real - IP $remote_addr;
        proxy_set_header X - Forwarded - For $proxy_add_x_forwarded_for;
    }

    location / {....
    }

所以当网页发出一个请求:http://static.closertb.site/a…时,实际请求地址是:http://server.closertb.site/a…,这就简单实现了一个服务代理。其原理与 WebpackServer 的 proxy 相似.

以上就是 Nginx 的 web 服务和代理服务在前端开发中的两个典型使用场景, 接下来我们说点零碎又有用的

Nginx 配置精进

知识来源:http://nginx.org/en/docs/http…

root vs alias

root 与 alias 主要区别在于 nginx 如何解释 location 后面的 uri,即以不同的方式将请求路径映射到服务器文件上,比如:

location ^~ /static {
    root /home/static;
}

当请求http://static.closertb.site/s…时,将会返回服务器上的/home/static/static/a/logo.png 文件,即’/home/static’+’/static/a/logo.png’,其拼接的地址是匹配字符串及其以后的

而对于 alias:

location ^~ /static {
    root /home/static;
}

当请求http://static.closertb.site/s…时,将会返回服务器上的/home/static/a/logo.png 文件,即’/home/static’+’/a/logo.png’,其拼接的地址是除了匹配字符串以后的地址

location 带’/’与不带’/’

你可能见过 A 这种:

location /api {
    proxy_pass http://server.closertb.site;
}

也可能见过 B 这种:

location /api/ {
    proxy_pass http://server.closertb.site;
}

有什么区别?

两者与 root 和 alias 有相似之处,只不过这种差别,只适用于:

如果 location 是由以斜杠字符结尾的前缀字符串定义,并且请求由 proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pa​​ss 或 grpc_pass 之一处理,则执行特殊处理。响应具有等于此字符串但没有尾部斜杠的 URI 的请求,带有代码 301 的永久重定向将返回到附加斜杠请求的 URI

所以当收到一个请求:http://static.closertb.site/a… 时,配置 A 将会把请求代理到:http://server.closertb.site/a…; 配置 B 将会把请求代理到:http://server.closertb.site/u…

这个知识,在代理配置中真的相当重要

请求重定向

当我们下架一个前端服务,或者用户访问了某个根本不存在的页面,我们不希望用户看到的是 404,而是将其引导到一个模糊正确的页面,这时候我可以用 rewrite 服务;反手一个配置,直接就将流量打到了网站首页;

location /404.html {
    rewrite  ^.*$ / redirect;
}

另一个比较常用的,就是网站开启 https,我们需要将所有 http 请求重定向到 https:

server {
    listen 80 default_server;
    server_name closertb.site;

    include / etc / nginx /
default.d
    /*.conf;
        rewrite ^(.*)$ https://$host$1 permanent;
}*/

上面同是 rewrite,但还是有不一样的 ,一个是 redirect(302), 另一个是 permanent(301),这两个还是有很大区别的;

助力 web 性能体验优化

web 性能优化是前端的一门学问,好的静态资源加载速度,会显著提升用户体验,而 nginx 作为最常用的静态资源服务器,也是有诸多渠道来帮助我们来提升静态资源加载速度,简单来讲,可以三个方面,直接上配置:

  • 开启资源缓存:因为目前资源除.html外,我们文件名都采用了 hash 方式,所以我们可以对除 html 文件以外的文件做长久缓存,这样能保证用户刷新页面时资源瞬间加载完成;
    if ($request_uri ~ .*\.(css|js|png|jpg|gif)$) {
        expires 365d;
        add_header  Cache-Control  max-age=31536000;
    }

    expires 与 max-age 两种配置方式都可以达到告诉浏览器资源一年以后过期的目的

  • 开启 http2:随着 HTTP2 的不断成熟,以及其多路复用特性,可以大大的提升页面多资源依赖的首屏加载速度, 其实开启 http2 更多的工作量是在于开启 https,然后加一个 http2 标识,网上文章很多.
    # listen  443 ssl default_server; 
    listen  443 ssl http2 default_server;
  • 开启 gzip:http2 解决了同一时间请求的个数,资源缓存提升了资源二次加载的速度,那么 gzip 就从根本上,减少了这个资源在网络中传输的大小, 直接在 http 这一级开启 gzip 配置即可;
    http {
        gzip on;
        gzip_disable "msie6";
        gzip_min_length 10k;
        gzip_vary on;
        # gzip_proxied any;
        gzip_comp_level 3;
        gzip_buffers 16 8k;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    }

作者:Denzel

原文链接:传送门

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
码云笔记 » nginx 在前端中的简单应用

发表回复