nginx 使用配置详解

356 阅读12分钟

1 前端为啥学习 Nginx

  • 据统计,世界上每 3 个⽹站中就有⼀个使⽤ Nginx

  • 市场上使⽤情况:阿⾥( Tnginx )、腾讯、百度等,这是全球反向代理服务器中排名

  • 前端-后端-架构-运维基本都离不开 Nginx

总之一句话:世界流行,大厂在用,能涨工资

image.png

2 需要的前置知识

  • linux 基础知识

3 Nginx 初步认识

3.1 什么是 Nginx
  • 官⽹:nginx.org/
  • 是⼀个⾼性能的 [ HTTP ] 和 [ 反向代理 ] web服务器
  • Nginx代码完全⽤ [ C语⾔ ] 从头写成
  • 兼容系统:Mac/Windows/Linux
3.2 为啥用 Nginx
  • 社区活跃

  • ⾼性能-⽀持单机千万级连接

  • 强⼤的第三⽅库⽀持

  • 功能强⼤:负载均衡、静态⽂件服务器、⽀持多种协议 https、POP3 等等

负载均衡

3.3 正向代理服务器与反向代理服务器
  • 正向代理服务器
    • 客户端和⽬标服务器之间的服务器,客户端向代理发送⼀个请求指定⽬标服务器,然后代理向⽬标服务器请求并获得内容,并返回给客户端,平时说的代理服务器⼀般是正向代理服务器

    • 核⼼:⽤户知道⾃⼰访问的⽬标服务器

    • 场景:vpn、访问原来⽆法访问的⽹站, ⽐如国外的⼀些站点

正向代理服务器.png

  • 反向代理服务器

    • 客户端和⽬标服务器之间的服务器,客户端向代理发送⼀个请求,然后代理向⽬标服务器请求并获得内容,并返回给客户端。反向代理隐藏了真实的服务器

    • 核⼼:客户端不知道要访问的⽬标服务器是哪台服务器,代理会根据⼀定的策略选择⼀个真实的服务器进⾏请求

    • 场景:访问淘宝,知道访问的域名是 taobao.com, Nginx 分发给对应的业务进行处理

image.png

4 Nginx 实操

4.1 Nginx 安装
  • 购买云服务器进行安装

  • 本地虚拟机进行安装

    • 下载压缩包 并上传 nginx.org/en/download…

    • 安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

    • 创建⼀个⽂件夹,上传本地提供的nginx包 解压命令 tar -zxvf nginx-1.18.0.tar.gz

    • 执行配置命令 ./configure 编译 make 安装 make install

    • 默认安装路径 /usr/local/nginx

    • 切换到 Nginx 目录 cd /usr/local/nginx/sbin 执行运行命令 ./nginx

    • 防⽕墙开放端⼝,阿⾥云⽹络安全组配置 80 端⼝

  • windows 常见工具

  • mac 常见工具

    • 连接远程 通过终端登录

    • 远程连接上传⽂件 filezilla

4.2 绑定域名到服务器 IP 上
  • 可以看看我自己的腾讯云服务器 IP image.png
  • 可以在腾讯云花钱直接申请域名也可以在 freenom 上申请免费的域名(需要科学上网),下面绑定的都是上面提到的云服务器 IP

image.png

  • 注意 需要防火墙开放 80 端口 或者腾讯云网络安全组配置

image.png

4.3 Nginx 目录介绍

image.png

conf # 所有配置⽂件⽬录

    nginx.conf # 默认的主要的配置⽂件

    nginx.conf.default # 默认模板

html # 这是编译安装时 Nginx 的默认站点⽬录

    50x.html # 错误⻚⾯

    index.html # 默认⾸⻚

logs # nginx 默认的⽇志路径,包括错误⽇志及访问⽇志

    error.log # 错误⽇志

    nginx.pid # Nginx 启动后的进程 id

    access.log # Nginx 访问⽇志

sbin # nginx 命令的⽬录

    nginx # 启动命令
    
  • Nginx 常见命令

     是要在 /etc/nginx/sbin 执行 ./nginx 才会有效
     
     ./nginx # 默认配置⽂件启动
    
     ./nginx -s reload # 重启,加载默认配置⽂件
    
     ./nginx -c /usr/local/nginx/conf/nginx.conf # 启动指定某个配置⽂件
    
     ./nginx -s stop # 停⽌
    
     # 关闭进程,Nginx 有 master process 和 worker process,关闭 master 即可
    
     ps -ef | grep "nginx"
    
     kill -9 PID
    
4.4 Nginx 核⼼之配置⽂件剖析

image.png

配置文件分为三大模块

  • 全局配置

  • server 主机设置

  • location( URL 匹配特定位置的设置)

    可以打开 nginx.conf.default,这个是默认的配置模板,每次更改配置都可以复制这份出来改 然后更改文件名为 nginx.conf。

4.3 搭建前端静态服务器
  • 虚拟主机的概念

    • 指在⼀台物理主机服务器上划分出多个磁盘空间,每个磁盘空间都是⼀个虚拟主机,每台虚拟主机都可以对外提供 Web 服务,并且互不⼲扰,就类似虚拟机
    • 利⽤虚拟主机把多个不同域名的⽹站部署在同⼀台服务器上,节省了服务器硬件成本和相关的维护费⽤ image.png 就像图片显示的 2 个域名都是指向一个 IP 地址,但是都能对外提供 web 访问服务,配置如下

    server {

      listen 80;
    
      server_name bob.coder996.cf;
    
      location / {
      
          # 指定网页路径
          
          root /usr/local/nginx/html;
    
          index bob.html;
    
      } 
    

    }

    server {

      listen 80;
    
      server_name www.coderrao.cf;
    
      location / {
          
          root html;
    
          index bob.html index.htm;
    
      }
    

    } 修改完配置一定要在 Nginx sbin 目录下执行 ./nginx -s reload 命令才会生效

01.gif

4.4 搭建图片服务器
  • 图片服务器

    • 学 javaweb、node、或者其他基础 web 项⽬,基本都是图⽚上传到项⽬本身

    • 公司⼀般会使⽤图⽚服务器或者云⼚商提供的 CDN

  • 使⽤流程

    • 前端提交图⽚ -> 后端处理 -> 存储到图⽚服务器 -> 拼接好访问路径存储到数据库

image.png

  • 修改配置文件 先在 /usr/local/software/img/ 图片下面放置两张图片 mountain.jpg 和 sea.jpg

      server {
    
          listen 80;
    
          server_name www.coderrao.cf;
    
          location /app/img {
    
              alias /usr/local/software/img/;
    
          }
      }
    

02.gif

4.5 挖掘 accessLog ⽇志
  • Nginx 访问⽇志的⽤处

    • 统计站点访问 IP 来源、某个时间段的访问频率

    • 查看访问最频的⻚⾯、Http 响应状态码、接⼝性能

    • 接⼝秒级访问量、分钟访问量、⼩时和天访问量

  • 默认配置

      # log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
      
      #                  '$status $body_bytes_sent "$http_referer" '
      
      #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
  • 访问案例

     150.255.37.51 - - [09/May/2022:15:52:38 +0800] "GET /js/tween.min.js HTTP/1.1" 
     
     200 4882 "https://bob.coder996.cf/" "Mozilla/4.047745454 Mozilla/4.0 
     
     (compatible; MSIE 5.00; Windows 98)"
    
  • 解析

     $remote_addr 对应的是真实⽇志⾥的 150.255.37.51 ,即客户端的 IP。
    
     $remote_user 对应的是第⼆个中杠 “-”,没有远程⽤户,所以⽤ “-” 填充。
    
     [ $time_local ]对应的是 [ 09/May/2022:15:52:38 +0800 ]。
    
     “$request” 对应的是 "GET /js/tween.min.js HTTP/1.1"$status 对应的是 200 状态码。
    
     $body_bytes_sent 对应的是 4882 字节,即响应 body 的⼤⼩。
     
     “$http_referer” 对应的是 ”https://bob.coder996.cf/“,若是直接打开域名浏览的时,
     referer 就会没有值,为 ”-“。
    
     “$http_user_agent” 对应的是 ”Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)”。
    
     “$http_x_forwarded_for” 对应的是 ”-“ 或者空。
    
  • 查看访问最频繁的前 100 个 IP

      cat access.log | awk '{print $1}' | sort -n|uniq -c | sort -rn | head -n 100
    

默认的日志在 /etc/nginx/logs 目录下,使用 awk 命令

image.png

前面为访问次数 后面为 IP 地址

  • 统计访问最多的 url 前 20 名

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

image.png

  • awk 基础

      awk 是⽂本处理⼯具,默认按照空格切分,$N 是切割后第 N 个,从 1 开始
    
      sort  命令⽤于将⽂本⽂件内容加以排序, 默认将文本文件的第一列以 ASCII 码的次序排列 
      -n 按照数值排,-r 按照倒序来排
    
      案例的 sort -n 是按照第⼀列的数值⼤⼩进⾏排序,从⼩到⼤,倒序就是 sort -rn
    
      uniq 去除重复出现的⾏列, 当重复的行并不相邻时,uniq 命令是不起作用的 ,
      一般与 sort 命令结合使用 -c 在每列旁边显示该⾏重复出现的次数。
    
  • 统计接⼝响应耗时

    • ⽇志格式增加 $request_time

        从接受⽤户请求的第⼀个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时
        间、输出响应数据时间 
        
        $upstream_response_time:指从 Nginx 向后端建⽴连接开始到接受完数据然后关闭连接为
        ⽌的时间 
        
        $request_time ⼀般会⽐upstream_response_time ⼤,因为⽤户⽹络较差,或者传递数据
        较⼤时,前者会耗时⼤很多
      
  • 配置⾃定义⽇志格式

      log_format main '$remote_addr - $remote_user [ $time_local ] "$request" '
      
      '$status $body_bytes_sent "$http_referer" '
       
      '"$http_user_agent" "$http_x_forwarded_for" $request_time';
    
      server {	
      
              listen       80;
              
              server_name  www.coderrao.cf;
    
              # 指定输出日志位置 和 模板
              
              access_log logs/host.access.log main;
    
              location / {
              
                  root   html;
                  
                  index  bob.html index.htm;
                  
              }
              
              location /app/img {
    
                      alias /usr/local/software/img;
                      
                  }
          }
    

进行路径访问后,查看 host.access.log

image.png

可以看到最后 $request_time 大多数为 0.000 我们可以修改来模拟访问时间,最后通过命令筛选出来

cat host.access.log| awk '($NF > 2) {print $7}' | sort -n | uniq -c | sort -nr | head -5

备注:$NF 表示最后⼀列, awk '{print $NF}'

image.png

4.6 负载均衡策略
  • 负载均衡(Load Balance)

    • 分布式系统中⼀个⾮常重要的概念,当访问的服务具有多个实例时,需要根据某种“均衡”的策略决定请求发往哪个节点,这就是所谓的负载均衡

    • 原理是将数据流量分摊到多个服务器执⾏,减轻每台服务器的压⼒,从⽽提⾼了数据的吞吐量

  • 负载均衡的种类

    • 通过硬件来进⾏解决,常⻅的硬件有 NetScaler、F5、Radware 和 Array 等商⽤的负载均衡器,但⽐较昂贵

    • 通过软件来进⾏解决,常⻅的软件有 LVS、Nginx 等,它们是基于 Linux 系统并且开源的负载均衡策略

    • ⽬前性能和成本来看,Nginx 是⽬前多数公司选择使⽤的

image.png

  • 环境准备

    • 安装 JDK 并配置环境变量, 并立即生效

    • 准备好 2 个 jar 包,分别监听 8080 和 8081 端口

    • 启动项目,并且在后台运行

  • nginx.conf 配置

      upstream lbs {
      
          # 43.129.29.223 为远程服务器的 IP, 两个端口分别对应 2 个运行中的运用
          
          server 43.129.29.223:8080;
    
          server 43.129.29.223:8081;
    
      }
    
      location /api {
    
          proxy_pass http://lbs;
    
          proxy_redirect default;
    
      }
      
      当我们 访问 /api/ 的路径时就会转发到 http://43.129.29.223:8080 或者
      
      http://43.129.29.223:8081 上
      
    
  • Nginx 常⻅的负载均衡策略

    • 节点轮询(默认)

      • 简介:每个请求按顺序分配到不同的后端服务器

      • 场景:会造成可靠性低和负载分配不均衡,适合静态⽂件服务器

    • weight 权重配置

      • 简介:weight 和访问⽐率成正⽐,数字越⼤,分配得到的流量越⾼

      • 场景:服务器性能差异⼤的情况使⽤

           upstream lbs {
        
               server 43.129.29.223:8080 weight = 5;
        
               server 43.129.29.223:8081 weight = 10;
        
           }
        
    • ip_hash(固定分发)

      • 简介:根据请求按访问 IP 的 hash 结果分配,这样每个⽤户就可以固定访问⼀个后端服务器

      • 场景:服务器业务分区、业务缓存、Session 需要单点的情况

          upstream lbs {
        
             ip_hash;
        
             server 43.129.29.223:8080;
        
             server 43.129.29.223:8081;
         }
        
    • upstream 还可以为每个节点设置状态值

      • server 43.129.29.223:8080 down;

        • down 表示当前的 server 暂时不参与负载
      • server 192.168.159.133:8080 backup;

        • backup 其它所有的⾮ backup 机器 down 的时候,会请求 backup 机器,这台机器平时压⼒是最轻的,配置也会相对低
  • Nginx 探测后端节点可⽤性

    • 如果某个应⽤挂了,请求不应该继续分发过去

      • max_fails 允许请求失败的次数,默认为 1 当超过最⼤次数时就不会请求

      • fail_timeout : max_fails 次失败后,暂停的时间,默认:fail_timeout 为 10s

      • 参数解释

        • max_fails = N 设定 Nginx 与后端节点通信的尝试失败的次数

        • 在 fail_timeout 参数定义的时间内,如果失败的次数达到max_fails,Nginx 就将这个节点标记不可⽤

        • 在下⼀个 fail_timeout 时间段到来前,服务器不会再被尝试

        • 失败的尝试次数默认是 1,如果设为 0 就会停⽌统计尝试次数,认为服务器是⼀直可⽤的

    • 具体什么是 nginx 认为的失败呢

      • 可以通过指令 proxy_next_upstream 来配置什么失败的尝试

      • 注意默认配置时,http_404 状态不被认为是失败的尝试

    • 配置如下

        upstream lbs {
      
           server 43.129.29.223:8080 max_fails = 2 fail_timeout = 60s ;
      
           server 43.129.29.223:8081 max_fails = 2 fail_timeout = 60s;
           
       }
      
        location /api {
      
           proxy_pass http://lbs;
      
           proxy_next_upstream error timeout http_500 http_503 http_404;
      
       }
       
      
4.7 Nginx 经典应用
  • 全局异常兜底数据返回

    • 简介:Nginx ⾃定义全局异常 json 数据

    • 任何接⼝都是可能出错,4xx、5xx 等

    • 如果业务没有做好统⼀的错误管理,直接暴露给⽤户,⽆疑是看不懂

    • 所以假如后端某个业务出错,nginx 层也需要进⾏转换

    • 让前端知道 Http 响应是 200,其实是将错误的状态码定向⾄ 200,返回了全局兜底数据

    • 配置如下

       location / {
      
           proxy_pass http://lbs;
      
           proxy_redirect default;
      
           # 存放⽤户的真实 ip
      
           proxy_set_header Host $host;
      
           proxy_set_header X-Real-IP $remote_addr;
      
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      
           # 如果发生下面的情况 服务挂了,希望重新启动其他服务,实现高可用
           
           proxy_next_upstream error timeout http_503 non_idempotent;
      
           # 开启错误拦截配置,⼀定要开启
      
           proxy_intercept_errors on;
      
       }
       # 不加 = 200,则返回的就是原先的 http 错误码;配上后如果出现 500 等错误都返回给⽤户 200
      状态,并跳转⾄ /default_api
      
       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 "}';
      
       }
      
  • Nginx 封禁恶意 IP

    • ⽹络攻击时有发⽣

      • TCP 洪⽔攻击、注⼊攻击、DOS 等

      • ⽐较难防的有 DDOS 等

    • 数据安全,防⽌对⼿爬⾍恶意爬取,封禁 IP

    • 封禁 IP

      • linux server 的层⾯封 IP:iptables

      • Nginx 作为⽹关,可以有效的封禁 IP ,⽅式多种 ( 但 req 还是会打进来,让nginx 返回 403, 占⽤资源 )

         单独⽹站屏蔽 IP 的⽅法,把 include xxx; 放到⽹址对应的在 server{} 语句块,虚
         拟主机
        
         所有⽹站屏蔽 IP 的⽅法,把 include xxx; 放到 http {} 语句块。
        
         nginx 配置如下:
        
         http {
        
         # ....
        
               include blacklist.conf;
        
         }
        
         location / { 
         
             proxy_pass http://lbs;
        
             proxy_redirect default;
        
         }
        
         #blacklist.conf ⽬录下⽂件内容
        
         deny 192.168.159.2;
        
         deny 192.168.159.32;
        
    • 拓展-⾃动化封禁思路

      • 编写 shell 脚本

      • AWK 统计 access.log,记录每秒访问超过 60 次的 IP,然后配合 Nginx 或 iptables 进⾏封禁

      • crontab 定时跑脚本

  • Nginx 配置解决浏览器跨域

    • 跨域:浏览器同源策略 1995 年,同源政策由 Netscape 公司引⼊浏览器。⽬前,所有浏览器都实⾏这个政策。 最初,它的含义是指,A ⽹⻚设置的 Cookie,B ⽹⻚不能打开,除⾮这两个⽹⻚"同源"。所谓"同源"指的是"三个相同"

       协议相同 http https
      
       域名相同 www.baidu.com
      
       端⼝相同 80 81
      
       ⼀句话:浏览器从⼀个域名的⽹⻚去请求另⼀个域名的资源时,域名、端⼝、协议任⼀不同,
       都是跨域
      
       浏览器控制台跨域提示:
      
       No 'Access-Control-Allow-Origin' header is present on the requested resource. 
      
       Origin 'null' is therefore not allowed access
      
    • 解决方案

      • JSONP

      • Http 响应头配置允许跨域

        • nginx 层配置

        • 程序代码中处理通过拦截器配置

      • Nginx 开启跨域配置

        • location 下配置

          location / {
          
              add_header 'Access-Control-Allow-Origin' $http_origin;
          
              add_header 'Access-Control-Allow-Credentials' 'true';
          
              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';
          
              add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';
          
              # 如果预检请求则返回成功,不需要转发到后端
          
              if ($request_method = 'OPTIONS') {
          
                  add_header 'Access-Control-Max-Age' 1728000;
          
                  add_header 'Content-Type' 'text/plain; charset=utf-8';
          
                  add_header 'Content-Length' 0;
          
                  return 200;
              }
          
          }
          
    • Nginx 的 location 规则

      • 正则表达式

           ^ 以什么开始
        
           $ 以什么结束
        
           ^/api/user$
           
        
    • location 路径匹配

      • 语法 location [ = | ~ | ~ ( 中间没有空格 )* | ^~ ] uri { ...... }

      • location = /uri = 表示精准匹配,只要完全匹配上才能⽣效

      • location /uri 不带任何修饰符,表示前缀匹配

      • location ^~ /uri/ 匹配任何以 /uri/ 开头的任何查询并且停⽌搜索

      • location / 通⽤匹配,任何未匹配到其他location的请求都会匹配到

      • 正则匹配

        • 区分⼤⼩写匹配(~)

        • 不区分⼤⼩写匹配(~*)

      • 优先级(不要写复杂,容易出问题和遗忘)

      • 精准匹配 > 字符串匹配( 若有多个匹配项匹配成功,那么选择匹配⻓的并录 ) > 正则匹配

  • nginx 的 rewrite 规则和应⽤

    • 重写 - 重定向

    • rewrite 地址重定向,实现 URL 重定向的重要指令,他根据 regex ( 正则表达式 )来匹配内容跳转

    • 语法 rewrite regex replacement[flag]

        rewrite ^/(.*) https://www.coderrao.cf/$1 permanent
      
       # 这是⼀个正则表达式,匹配完整的域名和后⾯的路径地址
      
       # replacement 部分是 https://www.coderrao.cf/$1,$1 是取⾃ regex  部分 () ⾥的内容
      
    • 常⽤正则表达式:

      字符描述
      ^匹配输⼊字符串的起始位置
      $匹配输⼊字符串的结束位置
      *匹配前⾯的字符零次或者多次
      +匹配前⾯字符串⼀次或者多次
      ?匹配前⾯字符串的零次或者⼀次
      .匹配除 “\n” 之外的所有单个字符
      ( pattern )匹配括号内的 pattern
    • rewrite 最后⼀项 flag 参数

      标记符号说明
      last本条规则匹配完成后继续向下匹配新的 location URI 规则
      break本条规则匹配完成后终⽌,不在匹配任何规则
      redirect返回 302 临时重定向
      permanent返回 301 永久重定向
    • 应⽤场景

      • ⾮法访问跳转,防盗链

      • ⽹站更换新域名

      • http 跳转 https

      • 不同地址访问同⼀个虚拟主机的资源

  • nginx 配置 websocket 反向代理

    • 配置

        server {
      
            listen 80;
      
            server_name www.coderrao.cf;
      
            location / {
      
            proxy_pass http://lbs;
      
            proxy_read_timeout 300s; //websocket 空闲保持时⻓
      
            proxy_set_header Host $host;
      
            proxy_set_header X-Real-IP $remote_addr;
      
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      
            proxy_http_version 1.1;
      
            proxy_set_header Upgrade $http_upgrade;
      
            proxy_set_header Connection $connection_upgrade; 
        
            }
      
        }
      
    • 核⼼是下⾯的配置 其他和普通反向代理没区别, 表示请求服务器升级协议为 WebSocket

        proxy_set_header Upgrade $http_upgrade;
      
        proxy_set_header Connection $connection_upgrade;
        
      
    • 服务器处理完请求后,响应如下报⽂ # 状态码为 101

        HTTP/1.1 101 Switching Protocols
      
        Upgrade: websocket
      
        Connection: upgrade
        
      
  • 服务端缓存前置

    • 常⻅的开发⼈员控制的缓存分类

      • 数据库缓存

      • 应⽤程序缓存

      • Nginx ⽹关缓存

      • 前端缓存

image.png

  • 让后端结果缓存离⽤户更进⼀步

    • /root/cache 本地路径,⽤来设置 Nginx 缓存资源的存放地址

    • 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 个

    • key_zone 在共享内存中定义⼀块存储区域来存放缓存的 key 和 metadata

    • max_size 最⼤ 缓存空间, 如果不指定会使⽤掉所有磁盘空间。当达到 disk 上限后,会删除最少使⽤的 cache

    • inactive 某个缓存在 inactive 指定的时间内如果不访问,将会从缓存中删除

    • proxy_cache_valid 配置 nginx cache 中的缓存⽂件的缓存时间, proxy_cache_valid 200 304 2m 对于状态为 200 和 304 的缓存⽂件的缓存时间是 2 分钟

    • use_temp_path 建议为 off,则 nginx 会将缓存⽂件直接写⼊指定的 cache ⽂件中

    • proxy_cache 启⽤ proxy cache,并指定 key_zone,如果 proxy_cache off 表示关闭掉缓存

    • add_header Nging-Cache "$upstream_cache_status" ⽤于前端判断是否是缓存,miss、hit、expired ( 缓存过期 )、updating ( 更新,使⽤旧的应答 )

    • 配置如下

       proxy_cache_path /root/cache levels = 1:2 keys_zone = cache : 10m max_size = 1g 
       
       inactive = 60m use_temp_path = off;
      
       server {
      
           location / {
      
               ...
      
               proxy_cache cache;
      
               proxy_cache_valid 200 304 10m;
      
               proxy_cache_valid 404 1m;
      
               proxy_cache_key $host$uri$is_args$args;
      
               add_header Nginx-Cache "$upstream_cache_status";
      
               }
      
       }
      
    • 注意点

      • Nginx 缓存过期影响的优先级进⾏排序为:inactive > 源服务器端Expires/max-age > proxy_cache_valid

      • 如果出现 Permission denied 修改 nginx.conf,将第⼀⾏修改为 user root

      • 默认情况下 GET 请求及 HEAD 请求会被缓存,⽽ POST 请求不会被缓存,并⾮全部都要缓存,可以过滤部分路径不⽤缓存

  • Nginx 静态资源压缩

    • 对⽂本、js 和 css ⽂件等进⾏压缩,⼀般是压缩后的⼤⼩是原始⼤⼩的 25%

        # 开启 gzip,减少我们发送的数据量
      
        gzip on;
      
        gzip_min_length 1k;
      
        # 4 个单位为 16k 的内存作为压缩结果流缓存
      
        gzip_buffers 4 16k;
      
        # gzip压缩⽐,可在 1~9 中设置,1 压缩⽐最⼩,速度最快,
      
        # 9 压缩⽐最⼤,速度最慢,消耗 CPU 
        
        gzip_comp_level 4;
      
        # 压缩的类型
      
        gzip_types application/javascript text/plain
      
        text/css application/json application/xml
      
        text/javascript;
      
        # 给代理服务器⽤的,有的浏览器⽀持压缩,有的不⽀持,所以避免浪费不⽀持的也压缩,
        所以根据客户端的 HTTP 头来判断,是否需要压缩
      
        gzip_vary on;
      
        # 禁⽤ IE6 以下的 gzip 压缩,IE 某些版本对 gzip 的压缩⽀持很不好
      
        gzip_disable "MSIE [1-6].";
        
        # 设置一个路径访问,看是否生效
        
        location /static {
      
            alias /usr/local/software/static;
      
        }
      
    • ⾯试题:压缩是时间换空间,还是空间换时间?

      • web 层主要涉及浏览器和服务器的⽹络交互,⽽⽹络交互显然是耗费时间的

      • 要尽量减少交互次数

      • 降低每次请求或响应数据量

      • 开启压缩

        • 在服务端是时间换空间的策略,服务端需要牺牲时间进⾏压缩以减⼩响应数据⼤⼩

        • 压缩后的内容可以获得更快的⽹络传输速度,时间是得到了优化

        • 所以是双向的

  • Nginx 配置 Https 证书

    • 申请 Https 证书 (可以在购买域名的服务器商免费申请)

    • 证书上传至远程服务器

    • 删除原先的 Nginx,新增 ssl 模块

      ./configure --prefix=/usr/local/nginx --with-http_stub_status_module 
      --with-http_ssl_module
      
      make
      
      make install
      
      # 查看是否成功
      
      /usr/local/nginx/sbin/nginx -V
      
    • 再安装好 Nginx 配置 https 证书

      server {
      
          listen 443 ssl;
      
          server_name coderrao.cf; 
          
          ssl_certificate /usr/local/software/biz/key/4383407_coderrao.cf.pem;
      
          ssl_certificate_key /usr/local/software/biz/key/4383407_coderrao.cf.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;
      
          }
      
      }
      
    • Https 访问: 杀掉原先进程,重启 Nginx 防⽕墙关闭或者开放 443 端⼝ ⽹络安全组开放端⼝

      • 后面访问网址时,地址栏带把小锁图标,说明配置成功了