nginx

1, 前端资源放在 nginx 的静态资源服务器上面
2, nginx ,映射静态目录,通过同一个端口代理不同服务,配置 https 等等
3,缓存用户的热点数据
4,自定义 nginx 日志
5,封禁恶意 ip
6,nginx 开启跨域配置

7, 正向代理服务器位于客户端和服务器之间,为了向服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标返回的数据交给客户端,比如 vpn 需要指定公司的 ip
进行连接,
反向代理服务器,位于服务端,我们只需要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后再返回给客户端,暴露的是代理服务器的地址,客户不知道要访问的服务器是哪台,
代理会根据一定的策略选择一个真实的服务器进行请求,访问域名 payne.club 但不知道提供数据的具体是哪台服务器,只知道反向代理

8,本地域名映射 ip ,管理员权限修改 hosts 文件

9,nginx : 官网 http://nginx.org
高性能的 http 和 反向代理 web 服务器

10,nginx 的 目录:
conf 的同级目录的 html 目录下两个文件 50.html (后端服务报错时)和 index.html (访问 nginx 的首页面)
conf 的 logs 目录下,access.log(访达日志) nginx.pid(主进程的id)
修改 nginx.conf 里的配置后使用 ./nginx -s reload 重新加载 conf 里的配置, 如果 conf 配置文件的目录挪动并且修改名称了的话可以使用 ./nginx -c /usr/local/aa-nginx-conf 来启动
停止 使用 ./nginx -s stop

11,本地域名映射虚拟机 ip ,通过域名访问时会先去本地的 hosts 文件中找域名对应的  ip ,如果存在就会直接访问

12,nginx 常见的核心配置:
  worker_processes 4; // 工作进程数,一般是 cpu 核心数
  events { // 事件模块指令 , nginx 里面有很多种网络 IO 模型,
    use epoll; //异步非阻塞的模型
    worker_connections 1024; // 每个进程的最大连接数,当前是1024*4 ,如果用户请求很高,但是配置的连接数太小,性能就会达不到,如果只是静态代理服务器对外代理服务提供静态资源,最大连接数就是
    // 1024*4,如果是作为反向代理服务器,用户请求的时候访问并且代理到反向代理服务器请求后端资源,最大连接数就是 1024 * 4 / 2 ,
  }

  以上是全局配置,还有下面的:
  http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on; // 开启高效传输模式
    keepalive_timeout 65; // 客户端连接到服务端 nginx 的超时时间,超过这个时间会断掉

    server { // 虚拟主机的配置,通过不同的域名反向代理到不同的后端的服务器,可以配置多个 server ,每个 server 监听不同的 ip 和 端口 代理到不同的目标服务器
      listen: 80; // 一个虚拟主机会监听一个端口
      (一个网站可以有多个域名): localhost; //配置域名或者ip,可以配置多个,多个域名访问的时候都可以访问到,访问 localhost:80/pub 的时候会映射到下面的路径,配置"/"就是root目录localhost:80
      //可以不写直接访问nginx的服务器ip
      location /pub/ {
        root html; //静态资源一般放在cdn上
        index index.html index.htm
      }

      location /pri/ { // 路径前缀,访问时会去下面的目录下找文件
        root html; // 存储静态资源的位置,在 nginx/html 目录下存储,默认的访问 nginx 的首页和出错时的错误页面都在 这个目录下
        index index.html index.htm // 访问文件的名称,访问 index.html 如果没有找到就会去找 index.htm ,找不到就会报 404
      }
    }
  }

  如果要配置映射目录
  server { // 虚拟主机的配置,通过不同的域名反向代理到不同的后端的服务器,可以配置多个 server ,每个 server 监听不同的 ip 和 端口 代理到不同的目标服务器
    listen: 80; // 一个虚拟主机会监听一个端口
    server_name: 39.97.240.142; //配置域名或者ip,可以配置多个,多个域名访问的时候都可以访问到,访问 39.97.240.142:80/app/img 的时候会映射到下面的路径,可以不写就是访问nginx的ip即可
    location /app/img {
      alias /usr/local/software/img/; //访问 /app/img 时会映射到 /usr/local/software/img/ 这个目录下,如果目录下有 123.png ,可以通过 39.97.240.142/app/img/123.png
    }
  }

13,accessLog 访问日志挖掘:一般会有对应的监控平台,查看应用的访问量,错误码,热点ip等等,都可以通过日志挖掘到
  统计站点访问ip来源、某个时间段的访问频率、访问最频繁的ip
  查看访问最频繁的页面、http响应状态码、接口性能
  接口秒级访问量、分钟访问量、小时访问量和天级访问量

  nginx.conf 中日志默认配置:

  #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  # '$status $body_bytes_sent "$http_referer" '
  # '"$http_user_agent" "$http_x_forwarded_for"';

  $remote_addr : 对应的是真实日志里的 117.152.221.255 ,即客户端的ip
  $remote_user: 如果没有远程用户用 -
  $request: GET /user/api/v1/product/order/query_state?product_id=1&token=xdclasseyJhbGciOJE HTTP/1.1
  $status: 响应状态码
  $body_bytes_sent : 响应 body 的大小,字节数
  $http_referer: 访问地址,可以控制防盗链,控制必须从某个网站的首页进去,否则不能访问,比如小米秒杀必须从首页进去,如果刷新这里就是-
  $http_user_agent: 表示客户端访问的信息,浏览器版本等
  $http_x_forwarded_for: 如果要拿到用户的真实ip,需要配置这个

  研究大厂中间件如何使用,需要挖掘日志,统计日志进行切割

实践操作如下:

一,nginx 站点统计访问量、错误码

  1,查看访问最频繁的前100个ip: 如果网站被攻击就可以查出对应的ip,查看 log 的名称
    切割出第一列 大小排序一下 去重和显示次数 根据数量倒序 显示次数之后,次数在前面,倒序的时候会在最上面,在取出前100条
    awk '{print $1}' access_temp.log | sort -n |uniq -c | sort -rn | head -n 100

  2,统计访问最多的 url 前20名

    cat access_temp.log | awk '{print $7}' | sort|uniq -c| sort -rn| head -20 | more

  3,常用命令操作:
    awk 默认按照空格切分,nginx 访问日志的格式是 nginx.conf 里面的日志默认配置以空格分隔开的,日志里面只要有空格就是一个分隔符
    sort -n 按照数值大小来排, -r 按照倒序来排,sort -rn 按照数值倒序
    uniq 去重显示 -c 在每列旁边显示出现的行数
  4,自定义日志格式统计接口响应耗时:
    日志格式增加 $request_time ,从接受用户请求的第一个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出响应数据时间
    $upstream_response_time : 指从 nginx 向后端建立连接开始到接受完数据然后关闭连接为止的时间
    $request_time 一般会比 upstream_response_time 大,因为用户网络较差,或者传递数据较大时,前者会耗时大很多

  自定义配置: 将 nginx.conf 中的 log_format 日志默认配置放开,如果要统计整个请求耗时就添加 $request_time ,用空格隔开,并且在 nginx.conf 中将 #access_log 这行放开,启用 logs/penghao.access.log , 取个名称

  cat penghao.access.log | awk '($NF > 2){print $7}'|sort -n|uniq -c|sort -nr|head -5
  $NF 表示最后一列,统计最后一列数值大于2的,传输时间超过2秒的接口,显示前5条

二,nginx 全局异常兜底数据返回,nginx 的配置钟尽量不要使用中文注释,可能会乱码

  如果后端某个业务出错,nginx 层也可以进行转换,
  如果 http 请求的状态码为 404 500 502 503 504 等 就转换成业务状态码 200

  location / {
    proxy_pass http://lbl;
    proxy_redirect default;

    #存放代理的目标url和用户的真实ip,反向代理后后端获取不到用户的真实ip,需要加此配置后获取,上面的 // HOST 代理跳转的 url ,后端在拦截器中可以获取这里存放的 url : String host = request.getHeader(HOST),下面的表示获取用户的真实ip  

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;

    #如果某个服务挂掉,可以重试
    proxy_next_upstream error timeout http_503 non_idempotent;

    #开启错误拦截配置,一定要开启后才能做自定义兜底配置
    proxy_intercept_errors on;

  }

  在 server 中加入以下配置: default_api 对应的下面的 location 中的返回数据
  error_page 404 500 502 503 504 =200 /default_api;
  location = /default_api {
    default_type application/json;
    return 200 '{"code":"-1","msg":"invoke fail,not found"}';
  }

  code 可以跟前端约定怎么处理

  nginx 配置了存放用户真实ip后,后端获取用户真实IP: 当有代理转发时候

  request.getHeader("X-Real-IP") : 10.47.103.13 ,      //用户的真实ip

  request.getRemoteAddr():10.96.112.230,       //转发后的ip

  request.getHeader("x-forwarded-for") : 10.47.103.13,4.2.2.2,10.96.112.230        //请求被转发时,多级转发的ip以逗号分隔

三, nginx 禁封恶意 ip
  DDOS 攻击: 很多个 ip 向服务器发起恶意攻击,导致带宽不够,只能靠烧钱去怼回去
  linux server 的层面可以封禁 ip : iptables (推荐,因为是在服务器层面做,请求进不来)
  nginx 的层面作为网关封禁 ip ,方式多种(但 请求 还是会打进来,让 nginx 返回403,占用资源)
  一个 server 对应的一个网站的后端资源,如果需要对一个网站的后端资源屏蔽恶意 ip ,把 include xxx; 放到网址对应的 server{} 语句块中,
  如果需要把所有网站的恶意 IP 屏蔽,把 include xxx; 放到 http {} 语句块中
  nginx 配置如下:
  http {
    # ....
    include blacklist.conf;
  }
  在 nginx/conf 目录下 touch blacklist.conf , 然后编辑 vim blacklist.conf , 然后把该文件加入到 nginx.conf 中,重启 nginx ,./nginx
  deny 192.168.0.1
  deny 192.168.0.3
  

  不同的 server 下放的是不同网站的资源,首页一般是 nginx 默认自带的 nginx 页面,扒首页没有意义
  所以访问 nginx 首页不会经过 server ,全局封禁恶意 ip 会拦截掉非 nginx 首页的资源,如果要拦截掉访问 nginx 首页的,需要在 server 中配置访问域名的时候进行拦截

  location / {
    proxy_pass http://lbs;
    proxy_redirect default;
  }
  自动化封禁恶意 ip 脚本,统计 access.log 日志,记录每秒访问超过60次的 ip ,然后配合 nginx 或者 iptables 进行封禁(重定向到 blacklist.conf ,然后加入到 nginx.conf 里面), crontab 定时跑脚本

四, nginx 配置解决浏览器跨域

  同源: 协议相同,域名相同,端口相同 ,浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一个不同,都是跨域

  跨域提示: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

  在nginx.conf 的 location 中加入以下三个配置:  第一个表示:// 服务器可以接受所有的请求源(Origin),即接受所有跨域的请求。第二个表示://当前请求Content-Type的值不被支持。其实是我们发起了"application/json"的类型请求导致的。这里涉及到一个概念:预检请求(preflight request),以下表示匹配上 /api/ 之后的接口允许跨域请求

location /api/ {

    add_header Access-Control-Allow-Origin *;  

    add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";

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

}

    

五,https :

  https 安全超文本传输协议,身披 SSL 外壳的 HTTP
  https 是一种通过计算机网络进行安全通信的传输协议,经由 HTTP 进行通信,利用 SSL/TLS 建立全信道,加密数据包
  SSL+HTTP 构建的可进行加密传输、身份认证的网络协议,比http传输安全,可防止数据在传输过程中被窃取、改变,缺包数据的完整性

  交互流程 : 客户端向服务端发起 https 请求,服务端会把客户端对应的证书以及服务端生成的公钥返回给客户端,客户端预置的机构会验证证书是否有效,如果没有风险,就会在浏览器生成随机的对称密钥,然后使用服务端返回的公钥进行加密后传给服务端,服务端用私钥进行解密,双方都有了这个对称密钥,就可以进行交互了,密钥的交换使用非对称加密的,数据传输使用对称加密方式

  阿里云 SSL 购买单域名 DVSSL 免费版的证书,配置和付费版的一样,但是功能不一样
  需要申请认证,用 域名绑定证书 提交审核后,服务器类型选择 nginx 然后下载下来,解压拿到两个证书, key 和 pem ,传到 nginx 所在服务器 /usr/local/software/key 目录下,然后配置到 nginx 里面,不同域名证书不一样

  nginx 配置 https 案例:

  删除原先的 nginx ,新增 ssl 模块, nginx 很多第三方模块,也可以直接新增,操作前先把 nginx 停掉,进入 nginx 主目录下执行
  ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
  make
  make install

  #查看是否成功
  /usr/local/nginx/sbin/nginx -V

  server {
    listen 443 ssl;
    server_name localhost; //域名, localhost 此处指 nginx 所在的域名,也是应用所在的域名
    ssl_certificate cert.pem; // 证书的目录: usr/local/software/key/payne.club.key
    ssl_certificate_key cert.key;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location {
      root html;
      index index.html index.htm;
    }
  }

  service firewalld stop //关闭防火墙
  需要开放 443 端口

六, nginx 配置 websocket 反向代理: 使用 websocket 的时候,如果换成了 nginx 反向代理,会导致无法完成推送,这时候需要升级 nginx 为 websocket 协议
  server {
    listen 80;
    server_name xdclass.net;
    location / {
      proxy_pass http://lbs;
      proxy_read_timeout 300s; // websocket 空闲保持时长
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_setheader X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade; //请求服务升级协议为 WebSocket
      proxy_set_header Connection $connection_upgrade;
    }
  }

七,nginx 网关缓存前置: 业务接口性能优化,高并发必备利器, 缓存只能用在后端数据变化很少的业务上,不能影响主要的业务,避免出现数据不一致,没及时刷新过来
常用配置:
  1,/root/cache : 本地路径,用来设置 nginx 缓存资源的存放地址
  2,levels=1:2 : 默认所有缓存文件都放在上面指定的根路径中,可能影响缓存性能,推荐指数为2级目录来存储缓存文件; 1和2表示用1位和2位16进制来命名目录名称。
  第一级目录用1位16进制命名,如a;第二级目录用2位16进制命名,如3a,所以此例中一级目录有16个,二级目录有 16*16 = 256个,总目录数位 16*256 = 4096 个
  当 levels = 1:1:1 时,表示是三级目录,且每级目录数均为16个
  3,key_zone : 在共享内存中定义一块存储区域来存放缓存的 key 和 metadata
  4,max_size : 最大缓存空间,如果不指定会使用掉所有磁盘空间,当达到 disk 上限后,会删除最少使用的 cache
  5,inactive : 某个缓存在 inactive 指定的时间内如果不访问,将会从缓存中删除
  6,proxy_cache_valid: 配置 nginx cache 中的缓存文件的缓存时间, proxy_cache_valid 200 304 2m ,对于状态为200和304的缓存文件的缓存时间是2分钟
  7,use_temp_path : 建议为 off ,则 nginx 会将缓存文件直接写入指定的 cache 文件中
  8,proxy_cache : 启用 proxy cache ,并指定 key_zone ,如果 proxy_cache 为 off 表示关闭掉缓存

  add_header Nging-Cache "$upstream_cache_status"
  用于统计缓存是否命中,可以在前端统计(请求头里可以查看),也可以在 nginx 这边统计( access 日志里面 tail -f 查看),miss(未命中),hit(命中),expired(缓存过期),updating(缓存正在更新中,使用旧的应答)

  在 nginx.conf 的 server 的上面加入配置:
  proxy_cache_path /root/cache levels=1:2 keys_zone=xd_cache:10m max_size=1g inactive=60m use_temp_path=off;

  然后在需要缓存前置的 server 中的 location 下加入以下配置开启缓存,重启 nginx
  location / {
    proxy_pass http://lbs;
    proxy_cache xd_cache;
    proxy_cache_valid 200 304 10m;
    proxy_cache_valid 404 1m;
    proxy_cache_key $host$uri$is_args$args; //这是缓存的 key ,如果 key 不一样,就会重新请求后端,如果已经缓存了,就会请求到缓存
    add_header Nginx-Cache "$upstream_cache_status";
  }

  修改 nginx.conf 的第一行为 user root

  默认情况下 GET 请求及 HEAD 请求会被缓存,而 POST 请求不会被缓存,并非全部都要缓存,比如增删改,对一些变动不大的数据查询一般可以缓存,也可以过滤部分路径不用缓存(根据 location 的规则配置)
  清空缓存可以找到 /root/cache 下的 key 直接 rm 删除缓存的 key

  出现问题就去找 nginx 的 error.log 查找问题,优秀的开源中间件都会有记录日志的地方

八, nginx 的压缩配置
  对文本、 js 、 css 文件等进行压缩,一般压缩后的大小是原始大小的25%

九, nginx 整合 OpenResty
  opebResty 管理后台等需要指定的网络(内网)才可以访问,网段/ip等

十, LVS(虚拟的服务器集群系统) + keepAlive(监控并管理LVS集群系统中的各个服务节点的状态)

  安装: yum install -y keepalived
  cd /etc/keepalived
  启动: service keepalives start
  停止: service keepalived stop
  查看状态: service keepalived status
  重启: service keepalived restart

十一,地址 url 重定向 rewrite ,在 location 中加入 rewrite ,映射的时候匹配到了就会进行重定向
  rewrite ^/(.*) https://xdclass.net/$1 permanent 以/开头匹配一个或则多个
  replacement 部分是 https://xdclass.net/$1, $1是取自 regex 部分()里的内容
  ^ 匹配输入字符串的起始位置
  $ 匹配输入字符串的结束位置
  * 匹配前面的字符零次或者多次
  + 匹配前面的字符一次或者多次
  ? 匹配前面的字符零次或者一次
  . 匹配除 "\n" 之外的所有单个字符
  (pattern) 匹配括号内的 pattern

  rewrite 最后一项 flag 参数
  last 本条规则匹配完成后继续向下匹配新的 location URI 规则
  break 本条规则匹配完成后终止,不在匹配任何规则
  redirect 返回302临时重定向
  permanent 返回301永久重定向

十二, 负载均衡 upstream
  upstream lbs {
    server 192.168.0.106:8080 weight=10;
    server 192.168.0.106:8081 weight=5;
  }

  location /api/ {
    proxy_pass http://lbs; //代理到上面的 lbs
    proxy_redirect default;
  }

十三,docker 安装 nginx ,使用 docker inspect nginx(镜像名称)查看镜像挂载目录信息

 

posted @ 2020-10-07 13:36  陌小但  阅读(527)  评论(0编辑  收藏  举报