前端必会的nginx技巧

·  阅读 526

author: 赵天天 2021-10-15

什么是nginx???

nginx 是高性能的HTTP和反向代理web服务器

特点是:内存小、并发能力强(官方50000个并发)tomcat(500多个并发),当然这个主要看服务器的硬件配置

这里如果想了解到反向代理是什么,可以先了解正向代理是什么

正向代理:代理客户端,如vpn,我们需要访问国外的网站,当然需要一个代理客户端的

反向代理:用于代理服务端的

nginx 能做些什么???

静态资源部署

对于前端来说这个是最常用的,前端部署都是一般都是静态资源部署,如html / js / css/ img 等; 直接贴配置文件吧

server {

  server_name test.ddelement.com;

  listen 8888; 

  root /home/ddelement/test/;

  location /myweb {

      add_header 'Access-Control-Allow-Origin' $http_origin;

      add_header 'Access-Control-Allow-Credentials' 'true';

      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

      add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';

      index index.htm index.html;

    }

}
复制代码

这里在nginx.conf 里配置 如上的配置,再重新启动一下nginx,  /usr/sbin/nginx -s reload, 就可以访问了,例如 20.80.91.145:8888/myweb 就可以访问到资源,也就是部署成功了

对上述配置详解

server_name: 顾明思议,就是这个server 的name,就是域名

listen: 是监听的端口号,也是这个server 的端口号,在一个server 中 server_name 和 listen是这个服务的唯一标志,也就是说,你可以起多个端口号为 8888 的server,但是这里必须保证每个server端口号为8888的 server_name唯一

root: 是访问文件的根路径,root 当然可以放在 location 里面,放在外面表示是以下所有的location的共用配置

location /myweb :这里表示 如果访问到 /myweb 就会被拦截到访问/home/ddelement/test/myweb/index.html 

add_header: 这里加一些解决跨域的一些cors, 当然这样的配置也可以放到location 外, 表示是这个server 的共用配置

坑点:在配置root路径容易出错, 这里nginx 访问的路径 先通过root路径访问再匹配到location 的路径,再去找下面的index 的文件,拿上面的为例, 这里访问资源是通过在/home/ddelement/test/ 下访问文件路径为  /myweb/ 下的index.html 或者 index.htm文件

反向代理

反向代理对于客户端是无感知的,客户端不需要任何配置,只是将服务发送到反向代理服务器上,由反向代理服务器去选择目标服务器获取数据,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理的服务器,隐藏了真实的服务器。
场景1 在处理跨域过程中,可以通过反向代理进行处理;前端资源通过静态部署部署在NGINX 上,将后端地址通过nginx进行代理,如果前端访问后端地址,这样直接访问NGINX的代理,这样就不会出现不同源策略,配置如下

server {

  server_name localhost;

  listen 9999;

  # 前端静态资源部署

  location / {

      root /home/ddelement/test/;

      index index.html;

  }

 # 后端地址代理

  location /apiv2/{

    proxy_pass http://20.80.91.145:8080/;

  }

}

复制代码

场景2 如果通过一个ip 地址去访问多个服务,当然可以用到反向代理,比如 访问淘宝http://20.80.91.145/taobao,访问百度http://20.80.91.145/baidu, 访问滴滴 http://20.80.91.145/didi,.......,配置如下

server {

  server_name localhost;

  listen 80;

 location /baidu/ {

    proxy_pass http://baidu.com/;

}

location /taobao/ {

   proxy_pass http://taobao.com/;

  }

location /didi/ {

   proxy_pass http://didi.com/;

  }

location /qq/ {

   proxy_pass http://qq.com/;

  }

 

proxy_intercept_errors on;

error_page 404 403 500 502 503 504  /404.html;

location = /404.html {

  root /home/ddelement/test/;

}

}
复制代码

负载均衡

原理:在一个应用中,用户量和QPS往往都是很大的,往往一个服务机器是承载不住的,往往需要很多个机器进行分压的,如百度、淘宝可能都是需要上万个服务支撑,但是每个机器都是有自己唯一的IP地址,但是用户都是通过例如 baidu.com 这一个域名去访问的,那像这样的场景就是需要负载均衡进行来控制转发到那个机器去

原理图

下面直接上配置

http {

    upstream myapp1 {

        server 192.168.1.103:8080;

        server 192.168.1.104:8080;

    }

    ……略

   server {

        listen 80;

        server_name  localhost;

        ……略

        location /myweb {

            proxy_pass http://myapp1;

        }

    }

}
复制代码

这里的配置核心点是 upstream, 这里配置 myapp1, 那就在location 进行代理 proxy_pass 到 http://myapp1; 当然负载均衡的算法有很多中,这里默认轮询,也就是访问一次192.168.1.103:8080, 然后就访问一次192.168.1.104:8080

负载均衡的算法

轮询策略:轮询就是每个服务各访问一次,然后就轮询起来,配置如下

upstream myapp1 {

        server 192.168.1.103:8080;

        server 192.168.1.104:8080;

  }
复制代码

权重策略:负载的服务器都会存在差异,有的服务器处理能力强、或者内存大,有的服务器则相反,如果还是按照轮询策略的话,可能性能差的服务器就容易挂掉,那么就应该就“能有多少力出多少力”的策略,性能好的权重当然可以大一些,性能差的权重可以小一些,这样就会把各个服务器更好的分配出来,配置如下

upstream myapp1 {

        server 192.168.1.103:8080  weight = 3;

        server 192.168.1.104:8080 weight = 2;

  }

复制代码

最少连接策略:web请求都会被转发到空闲的机器上去, 但是这么需要慎重使用,一般来说空闲的机器都是性能差的机器, 配置如下

upstream myapp1 {

        least_conn;

        server 192.168.1.103:8080;

        server 192.168.1.104:8080;

 }
复制代码

以上策略都有一个问题 session 丢失的问题

IP hash策略:ip hash 也叫ip绑定,每个请求按访问的ip hash 值去分配, 这样每个客户端都会访问固定的 后端服务器, 这样也就可以解决session丢失的问题;配置如下

upstream myapp1 {

        ip_hash;

        server 192.168.1.103:8080;

        server 192.168.1.104:8080;

  }
复制代码

其他策略: 如backup 策略, down策略;backup 策略一般是非备用器全部挂掉后,才会启用backup机器,一般用于发布更新时用, 在发布更新时要记得先更新备用机器,再逐步更新非备用机;down 策略就是永远不会去参与负载

动静分离

在之前前后端不分离的时候,前后端部署就是通过一个jar 包进行部署在tomcat上,这样有一个问题是,静态资源的访问速度很慢;nginx 处理静态资源的能力是tomcat 10 倍,tomcat 处理后端服务又是比较强的,那为什么不让适合的服务去处理适合的事儿呢?NGINX 部署前端的静态资源,tomcat 部署后端服务,这样就可以实现服务性能的最大化

server {

  server_name localhost;

  listen 9999;

  # 前端静态资源部署

  location / {

      root /home/ddelement/test/;

      index index.html;

  }

 # 后端地址代理

  location /apiv2/{

    proxy_pass http://20.80.81.101:8080/;

  }

}
复制代码

虚拟主机

虚拟主机就是把一台物理机划分多个“虚拟”的服务器,就是一台物理服务器当做多个服务器使用,从而可以配置多个网站; nginx提供虚拟主机的功能,就是不用在一个服务器上安装多个nginx, 就可以运行多个域名不同的网站。

nginx 下,一个server 就是一个虚拟主机。nginx的虚拟主机就是通过nginx.conf 的server 节点指定的,想要配置多个虚拟主机,配置多个server节点即可,比如说像 微服务的子应用就没有必要一个微应用就一个nginx 服务器,就可以通过虚拟主机来实现

基于端口的虚拟主机

基于端口的虚拟主机,使用端口来进行区分,浏览器可以通过同一域名+端口号,或者通过同一个ip+端口号进行访问

server {

  server_name localhost;

  listen 9999;

  location / {

      root /home/ddelement/test/;

      index index.html;

  }

}

 

server {

  server_name localhost;

  listen 8888;

  location / {

      root /home/ddelement/test/;

      index index.html;

  }

}
复制代码

基于域名的虚拟主机

基于域名访问是最常见的虚拟主机 这里就可以通过 ww.ddelement.com,  gg.ddelement.com 访问

server {

  server_name ww.ddelement.com;

  listen 80;

  location / {

      root /home/ddelement/test/ww;

      index index.html;

  }

}

 

server {

  server_name gg.ddelement.com;

  listen 80;

  location / {

      root /home/ddelement/test/gg;

      index index.html;

  }

}

复制代码

nginx常用指令

  • ./nginx 启动
  • ./nginx -s stop 停止
  • ./nginx -s quit 安全退出
  • ./nginx -s reload 重新加载配置文件
  • ps aux|grep nginx 查看nginx 进程
分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改