Nginx ? 泰酷辣

我正在参加「掘金·启航计划」

目录结构

  • 进入 Nginx 的主目录有这些文件夹

    Snipaste_2022-11-03_10-06-45.png

    client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
    
  • 其中这几个文件夹在刚安装后是没有的,主要用来存放运行过程中的临时文件

    client_body_temp fastcgi_temp proxy_temp scgi_temp
    
  • 详情

    conf 配置文件
      |-nginx.conf  主配置文件
      |-其他配置文件,都被引入到了nginx.conf
    html 存放静态文件的默认目录 html、css等
    logs
      |-access.log 访问日志(每次访问都会记录)
      |-error.log 错误日志
      |-nginx.pid 进程号
    sbin
      |-nginx 主进程文件
    *_temp 运行时,生成临时文件
    

基本运行原理

Snipaste_2022-11-03_10-16-44.png

Nginx 基础配置

修改Nginx配置,每次修改配置文件,一定要重载才能生效

# worker_processes1;默认为1,表示开启一个业务进程 (数值越大并发能力越强)
worker_processes  1; 
​


events {
    # worker_connections1024;单个业务进程可接受连接数量(数值越大并发能力越强)
    worker_connections  1024;
}

​
http {
    #  include是引入关键字,这里引入了mime.types这个配置文件(同在conf目录下,mime.types是用来定义,请求返回的content-type)
    include      mime.types;
    
# 如果mime类型没匹配上,默认使用二进制流的方式传输。
    default_type  application/octet-stream;
    
#on未使用linux的sendfile(socket,file,len)高效网络传输,也就是数据0拷贝。未开启sendfile
    sendfile        on;
    
#保持连接 超时时间
    keepalive_timeout  65;
​
# 一个nginx可以启用多个server(虚拟服务器) 
    server {
      # 监听端口号
        listen    80;  
        
      # localhost 主机名 (这里的localhost能被解析是因为hosts文件里配置了对应的解 析)
        server_name  localhost;
        
        # 匹配路径
        location / {
            // 指向文件根目录
            root   html;
            // 默认页名称
            index  index.html index.htm;
        }
​
        # 报错编码对应页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
​

servername匹配规则

需要注意的是 servername 匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了

通过下述技术可以实现很多功能:多用户二级域名、短网址、HttpDNS等

  • 完整匹配

    可以在同一个– severname 匹配规则

    server_name  vod.mmban.com www1.mmban.com
    
  • 通配符匹配

    server_name  *.mmban.com
    
  • 通配符结束匹配

    server_name  vod.*
    
  • 正则匹配

    server_name ~^[0-9]+.mmban.com$
    

反向代理和正向代理

反向代理

​ 描述:反向代理是指以代理服务器来接受连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器,而且整个过程对于客户端而言是透明的。

image.png

  • proxy_pass 反向代理的配置、

    • rootindex 字段在使用proxy_pass后会失效
    • proxy_pass后的地址必须写完整  http://xxx,不支持https
        • 当访问Nginx服务器,网页打开的是 http://xxx(应用服务器)
     server {
    
    
            listen    80;  
    
    
            server_name  localhost;
    
    
    
            location / {
    
    
                proxy_pass http://baidu.com
    
    
               # root   html;
    
    
               # index  index.html index.htm;
    
    
            }
    
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
    }
    
    • 反向代理 (前缀 /api 的作用)
    location  ^~/api/ {
      #^~/api/表示匹配前缀是api的请求,proxy_pass的结尾有/,则会把/api/*后面的路径直接拼接到后面,即移除api
       proxy_pass http://tomcat_list/;
    }
    
    
    
    
    
    

正向代理

描述:正向代理意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后由代理向原始服务器转交请求并将获得的内容返回给客户端。

image2.png

正向与反向的区别

站在客户端的角度,看代理服务器是帮客户端代理,还是帮服务端代理

基于反向代理的负载均衡

  • 配置

    worker_processes  1; 
    events {
        worker_connections  1024;
    }
    
    
    
    
    
    
      http {
          include        mime.types;
          default_type   application/octet-stream;
          sendfile        on;
          keepalive_timeout  65;
            upstream httpbs {
                 server  192.168.44.102:80;
                 server  192.168.43.103:80;
                }
          server {
              listen    80;  
              server_name  localhost;
    
              location / {
                 # httpbs 为虚拟路径对应 upstream
                   proxy_pass http://httpbs;
              }
              error_page   500 502 503 504  /50x.html;
              location = /50x.html {
                  root   html;
              }
          }
      }
    

负载均衡策略

  • 负载均衡
    • 描述:负载均衡也是Nginx常用的一个功能。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡

image3.png

1. 轮询

默认情况下使用轮询方式,逐一转发,这种方式适用于无状态请求

注意: 需要定义地址别名

  • upstream

    使用upstream定义一组地址【在server字段下】

  • 设置

    指定轮询机率,weight 和访问比率成正比,用于后端服务器性能不均的情况

    • down (关闭):表示当前的server暂时不参与负载
    • weight(权重): 默认为1 weight 越大,负载的权重就越大。
    • backup(备用): 除down 外 ,无法提供服务,就会请求backup这个机器
      worker_processes  1; 
      events {
          worker_connections  1024;
      }
    ​
    
    
      http {
          include        mime.types;
          default_type   application/octet-stream;
          sendfile        on;
          keepalive_timeout  65;
       upstream httpbs {
         server  192.168.44.102:80  weight=10 down ; # 如果是80端口,可以省略不写
         server  192.168.43.103:80  weight=3;
         server  192.168.43.106:80  weight=2 backup;
      }
    
    
          server {
              listen    80;  
              server_name  localhost;
              location / {
                 # httpbs 为虚拟路径对应 upstream
                   proxy_pass http://httpbs; 
              }
              error_page   500 502 503 504  /50x.html;
              location = /50x.html {
                  root   html;
              }
          }
      }
    
  • ip_hash

    根据客户端的ip地址转发同一台服务器,可以保持回话。

  • least_conn

    最少连接访问

  • url_hash

    根据用户访问的url定向转发请求

  • fair

    根据后端服务器响应时间转发请求

2 保持会话
  1. ip_hash

    根据客户端的ip地址转发同一台服务器,可以保持回话。

         upstream httpds {
           ip_hash;
           server 192.168.44.102 ;
           server 192.168.44.103 ;
           }
            server {
                listen       80;
                server_name  localhost;
                location / {
                proxy_pass http://httpds;
                # root   html;
                }
               location ~*/(css|img|js) {
                root   /usr/local/nginx/html;
            }
    
  2. hash $cookie_jsessionid;

  3. hash $request_uri;

  4. 使用sticky模块完成对Nginx的负载均衡

    使用参考

    nginx.org/en/docs/htt…

    tengine中有session_sticky模块我们通过第三方的方式安装在开源版本中

    sticky是第三方模块,需要重新编译Nginx,他可以对Nginx这种静态文件服务器使用基于cookie的负载均衡

    1.下载模块

    项目官网

    bitbucket.org/nginx-goodi…/

    另外一个版本

    github.com/bymaximus/n…

    下载

    bitbucket.org/nginx-goodi…

    2.上传解压
    3.重新编译Nginx

    依赖openssl-devel

    进到源码目录重新编译

    ./configure --prefix=/usr/local/nginx --add-module=/root/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d
    

    执行make

    如遇报错修改源码

    Snipaste_2022-11-18_16-44-11.png

    打开 ngx_http_sticky_misc.c文件

    在12行添加

    #include <openssl/sha.h>
    #include <openssl/md5.h>
    

    备份之前的程序

    mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
    

    把编译好的Nginx程序替换到原来的目录里

    cp objs/nginx /usr/local/nginx/sbin/
    

    升级检测

    make upgrade
    
    

    检查程序中是否包含新模块

    nginx -V
    
    
    

    配置方法

    upstream httpget {
    ​
    
    sticky name=route expires=6h;
    ​
    
    server 192.168.44.102;
    server 192.168.44.103;
    }
    
    

动静分离

当用户请求时,动态请求分配到的 Tomcat业务服务器,静态资源请求放在 Nginx服务中,减少 Tomcat 服务器的请求量

例子

  • 如果请求的资源地址是location/,/的优先级比较低,如果下面的location没匹配到,就会走http://xxx 这个地址的机器

  • 如果请求的资源地址是location/css/*,就会被匹配到nginx的html目录下的css文件夹中(我们把css静态资源放在这个位置)

    Snipaste_2022-11-04_13-53-19.png

server {





        listen       80;
        server_name  localhost;



        
        location / {  # /的优先级比较低,如果下面的location没匹配到,就会走http://xxx这个地址的机器
            proxy_pass http://xxx;
        }
        
        location /css {   # root指的是html,location/css指的是root下的css,所以地址就是html/css
                root html;
                index  index.html index.htm;
        }

​
        error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                root   html;
        }
} 

使用正则 简化

location ~*/(js|css|img){
  root html;
  index  index.html index.htm;
}





location匹配规则

标识符 描述
= 精确匹配;用于标准uri前,要求请求字符串和uri严格匹配。如果匹配成功,就停止匹配,立即执行该location里面的请求。
~ 正则匹配;用于正则uri前,表示uri里面包含正则,并且区分大小写。
~* 正则匹配;用于正则uri前,表示uri里面包含正则,不区分大小写。
^~ 非正则匹配;用于标准uri前,nginx服务器匹配到前缀最多的uri后就结束,该模式匹配成功后,不会使用正则匹配。
普通匹配(最长字符匹配) ;与location顺序无关,是按照匹配的长短来取匹配结果。若完全匹配,就停止匹配。
location =/ {  
   //精确匹配/ ,主机名后面不能带任何字符串
    echo "规则A";
}





location =/login {
  //精确匹配 /login 开头的地址,匹配符合以后,不在继续往下搜索 
    echo "规则B";
}

location ^~/blog/ { 
  //非正则匹配,匹配/blog/后,停止往下搜索正则,采用这一条
  echo "规则C";
}
location ~.(gif|jpg|png|js|css)$ {
    //区分大小写的正则匹配  若匹配成功,停止往下搜索正则,采用这一条
    echo "规则D";
}
location ~*.png$ {  
   //区分大小写的正则匹配 ,停止往下搜索正则,采用这一条
    echo "规则E";
}
location / {
  //因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
  //如果没任何规则匹配上,就采用这条规则
    echo "规则F";
}
location /blog/detail { 
  //最长字符串匹配,若完全匹配成功,就不在继续匹配,否则还会进行正则匹配
  echo "规则G";
}
location /images {  
    //最长字符串匹配,同上 
    echo "规则Y";
}
location ^~/static/files {  
    //非正则匹配,若匹配成功,就不在继续匹配
    echo "规则X";
} 
location 匹配顺序
  • 多个正则 location 直接按书写顺序匹配,成功后就不会继续往后面匹配

  • 普通(非正则)location会一起往下,直到找到匹配最高的(最大前缀匹配)

  • 当普通 location与正则 location同时存在,如果正则匹配成功,则不会再执行普通匹配

  • 所有类型 location 存在时 ,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配)

    location ~*/(css|img|js) {
    
        root /usr/local/nginx/static;
        index index.html index.htm;
    }
    
    
    
    
    
    
alias与root

root用来设置根目录,而alias在接受请求时候在路径上不会加上 location

location ~*/(css|img|js) {

    alias  /usr/local/nginx/static;
    index  index.html index.htm;
}





  1. alias指定的目录是准确的,即 location 匹配访问的path目录下的文件直接是在alias目录下查找的
  2. root 指定的目录是location 匹配访问的path 目录的上一级目录,这个path 目录一定要是真实存在root指定目录下的
  3. 使用alias 标签的目录块中不能使用rewritebreak(具体原因不明) :另外,alias指定的目录后面必须要加上‘/’符号
  4. alias虚拟目录配置中,location匹配的path目录如果 后面不带 / 那么访问的url地址中这个path目录后面加不加‘/’ 不影响访问,访问时它会自动加上 / 但是如果location匹配的 path目录后面加上 /那么访问的 url地址中这个path目录必须要加上 / 访问时它不会自动加上 / 如果不加上 /访问就会失败
  5. root目录配置,loction匹配的path目录后面 带不带 / 都不影响访问

URL 重写

rewrite

rewrite是URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。

关键字    正则      替代内容        flagt标记
rewrite  <regex>   <replacement>   [flag]
​


实例
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1  break;
  • 正则:per1森容正则表达式语句进行规则匹配

  • 替代内容:将正则匹配的内容替换成replacement

  • flag标记说明:

    • last本条规则匹配完成后,继续向下匹配新的Location URI规则
    • break本条规则匹配完成即终止,不再匹配后面的任何规则
    • redirect返回302临重定向,游览器地址会显示跳转后的URL地址
    • permanent 返回301永久重定向,测览器地址栏会显示跳转后的URL地址

实例

浏览器地址栏访问 xxx/123.html实际上是访问xxx/index.html?pageNum=123

server {     
        listen       80;   
        server_name  localhost;   
        
        location / {          
        # 这里的匹配规则可以让被匹配的内容与制定规则进行匹配   
        rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1  break;            
        proxy_pass http://xxx;      
        }       
        
        error_page   500 502 503 504  /50x.html;   
        location = /50x.html {    
        root   html;        }
   }

网关

Snipaste_2022-11-04_17-22-01.png
上图中,应用服务器,不能直接被外网访问到,只能通过 Nginx 服务器进行访问(使用 proxy_pass) ,这时候这台 Nginx服务器就成为了网关服务器(承担入口的功能) 所以我们启动应用服务器的防火墙,设置其只能接受这台Nginx服务器的请求添加,rich规则
0.
打开防火墙

```nginx.conf



systemctl start firewalld
```



0. 指定端口和ip访问

```nginx.conf

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.236.110" port protocol="tcp" port="8080" accept" # 这里的192.168.236.110是网关 服务器地址
```

0. 查看已配置规则

```nginx.conf



firewall-cmd --list-all
```



0. 重启防火墙

```nginx.conf



systemctl restart firewalld
```



0. 重载rich规则

```nginx.conf



firewall-cmd --reload
```



0. 移除 rich规则

```nginx.conf

firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.236.110" port port="8080" protocol="tcp" accept"
```

防盗链

当我们请求到一个页面后 ,这个页面一般会再去请求其中的静态资源,这时候请求头中,会有一个 refer字段 ,表示当前这个请求的来源,我们可以限制指定来源的请求才返回,否则就不返回,这样可以节省资源
image6.png

  • 配置

        valid_referers 【none】【blocked】【server_name】
    
    • none: 表示检测地址没有 refer,不拦截

    • server_name:检测主机地址,refer显示是从哪个地址来的,则有效的(server_name 必须是完整的http://xxxx

    • blocked 检测 Referer 头域的值被防火墙或者 代理服务器删除或伪装的情况。这种情况该头域的值不可以 ” http://” 或 “https://” 开头

    • 例子:这里设置 nginx http:192.168.236.110才能访问

      注意:if ($invalid_referer)if后有个空格,不写就会报错

      server {    
             listen  80;   
             server_name  localhost;    
             location / {
                 proxy_pass http://xxx;
                 }
               location /img{   
                  valid_referers http:192.168.236.110;  
                  if ($invalid_referer){# 无效的    
                    return 403;# 返回状态码403     
                  }             
                  root html;     
                  index  index.html index.htm;  
             }
         error_page   500 502 503 504  /50x.html;   
         location = /50x.html {  
            root   html;     
         }
      }
      
      
      
      
  • 设置防盗链图片

    • rewrite 用于返回URL 重写

    • break隐藏地址

      location /img{ 
            valid_referers http:192.168.236.110; 
            if ($invalid_referer){  
              rewrite ^/  /img/x.png break; //  
              }       
              root html;   
              index  index.html index.htm;
       }
      

Keepalived

使用场景

image7.png

安装 Keepalived

编辑安装
  1. 下载地址

    https://www.keepalived.org/download.html#
    
  2. 使用 ./configure 编译安装

  3. 如遇报错提示

    1. configure: error:
    2. !!! OpenSSL is not properly installed on your system. !!!
    3. !!! Can not include OpenSSL headers files. !!!
    
  4. 安装依赖

    yum install openssl-devel
    
yum安装
yum install -y keepalived
# 报错的话安装依赖  
yum install openssl-devel

keepalived 配置

  1. 配置文件在/etc/keepalived/keepalived.conf

    vrrp_instanceauthenticationvirtual_router_idvirtual_ipaddress这几个一样的机器,才算是同一个组里。这个组里才会选出一个作为Master机器

  2. 设置两台机器,分别下载好keepalived,然后进行配置

    1. 机器一

      ! Configuration File for keepalived
      
      ​
      
      global_defs {
        router_id lb1  # 名字与其他配置了keepalive的机器不重复行
      }
      
      
       vrrp_instance Yang{ # vrrp实例名可以随意取  
        state MASTER  # 只能有一个默认的Master,其他写BACKUP   
        interface ens33  # ip addr查看下网卡名,默认时ens33   
        virtual_router_id 51   
         priority 100  # 多台安装了keepalived的机器竞争成为Master的优先级   
         advert_int 1 # 通信时间
          authentication {   
              auth_type PASS  
              auth_pass 1111 
            }  
          virtual_ipaddress {  
             192.168.236.120 # 虚拟IP 
          }
      }
      
      
      
      
    2. 机器二

      ! Configuration File for keepalived
      
          global_defs {  
             router_id lb2  # 名字与其他配置了keepalive的机器不重复就行
           }
             vrrp_instance Yang{ # vrrp实例名可以随意取 
              state BACKUP # 只能有一个默认的Master,其他写BACKUP  
              interface ens33  # ip addr查看下网卡名,默认时ens33  
              virtual_router_id 51  
              priority 50 # 多台安装了keepalived的机器竞争成为Master的优先级
              advert_int 1 # 通信时间  
              authentication {     
                   auth_type PASS   
                   auth_pass 1111  
                  }   
              virtual_ipaddress {    
                 192.168.236.120 # 虚拟IP  
             }
      }
      
    3. 启动 keepalived

      systemctl start keepalived
      
    4. 验证

      通过命令 ip addr 查看机器一的ip 信息,可以看到虚拟IP,验证的可以 ping虚拟IP ,然后让其中一台机器宕机,但是服务不会受太大的影响

Keepalive

http协议的请求 Request Headers 中可以 看到当前浏览keepalive 的当前连接状态

Response Headers 可以看到服务器 返回的 keepalive 的当前连接状态

1.什么时候使用

明显的预知用户会在当前连接时,有下一步操作

复用连接,有效减少握手次数,尤其是https建立一次连接开销会更大

2. 什么时候不用

访问内联资源一般用缓存,不需要keepalive,长时间的 tcp连接容易导致系统资源无效占用

1. 对客户端使用 Keepalive

  • keepalive_item

    限制keepalive_item保持连接的最大时间

  • keepalive_timeout

    用于设置 Nginx服务器与客户端保持连接的超时时间

    用于踢出不活动的连接

    keepalive_timeout = 0 即关闭

    • send_timeout 10; 10秒
    • send_timeout 10 10; 同时下发一个header 告诉浏览器
  • send_timeout

    两次向客户端操作之间的间隔,如果大于这时间则关闭连接,默认60s

  • keepalive_request

    默认 1000

    单个连接中可处理的请求数

  • keepalive_disable

    不对某些浏览器建立长连接

    默认 msie6

    http {
        include       mime.types;
        default_type  application/octet-stream;
    ​
    
        sendfile        on;
    ​
    
    
        keepalive_timeout  65 65; #超过这个时间 没有活动,会让keepalive失效 
        keepalive_time 1h; # 一个tcp连接总时长,超过之后 强制失效
      
        send_timeout 60;# 默认60s  此处有坑!! 系统中 若有耗时操作,超过 send_timeout 强制断开连接。 注意:准备过程中,不是传输过程
    ​
    
    ​
        keepalive_requests 1000;  #一个tcp复用中 可以并发接收的请求个数,默认1000
    }
    
    

2. 对上游服务器使用 Keepalive

  • upstream 中配置

    • keepalive 100;

      向上游服务器的保留连接数

    • keepalive_timeout

      连接保留时间

    • keepalive_requests

      一个tcp 复用中,可以并发接收的请求个数

  • server中配置

    • proxy_http_version 1.1;

      配置 http 版本号 1.1

    • proxy_set_header Connection ” “;

      默认使用http1.0协议,需要在request中增加”Connection: keep-alive“ header才能够支持,而HTTP1.1默认支持。

      清楚 close 信息

      upstream httpds {
      
        ip_hash;
      
        server 192.168.44.102 ;
      
        server 192.168.44.103 ;
      
      }
      
      
      ​
      
      
      server {
        listen       80;
        server_name  localhost;
      ​
        location / {
          proxy_pass http://httpds;
          proxy_set_header  Connection " ";
        
        }
      
      
        location ~*/(css|img|js) {
      
          root   /usr/local/nginx/html;
      
        }
      
      }
      
      
      
      

3.keepalive 压力测试

AB安装

yum install httpd-tools

参数说明:

  • -n 即requests,用于指定压力测试总共的执行次数。
  • -c 即concurrency,用于指定的并发数。
  • -t 即timelimit,等待响应的最大时间(单位:秒)。
  • -b 即windowsize,TCP发送/接收的缓冲大小(单位:字节)。
  • -p 即postfile,发送POST请求时需要上传的文件,此外还必须设置-T参数。
  • -u 即putfile,发送PUT请求时需要上传的文件,此外还必须设置-T参数。
  • -T 即content-type,用于设置Content-Type请求头信息,例如:application/x-www-form-urlencoded,默认值为text/plain。
  • -v 即verbosity,指定打印帮助信息的冗余级别。
  • -w 以HTML表格形式打印结果。
  • -i 使用HEAD请求代替GET请求。
  • -x 插入字符串作为table标签的属性。
  • -y 插入字符串作为tr标签的属性。
  • -z 插入字符串作为td标签的属性。
  • -C 添加cookie信息,例如:”Apache=1234″(可以重复该参数选项以添加多个)。
  • -H 添加任意的请求头,例如:”Accept-Encoding: gzip”,请求头将会添加在现有的多个请求头之后(可以重复该参数选项以添加多个)。
  • -A 添加一个基本的网络认证信息,用户名和密码之间用英文冒号隔开。
  • -P 添加一个基本的代理认证信息,用户名和密码之间用英文冒号隔开。
  • -X 指定使用的和端口号,例如:”126.10.10.3:88″。
  • -V 打印版本号并退出。
  • -k 使用HTTP的KeepAlive特性。
  • -d 不显示百分比。
  • -S 不显示预估和警告信息。
  • -g 输出结果信息到gnuplot格式的文件中。
  • -e 输出结果信息到CSV格式的文件中。
  • -r 指定接收到错误信息时不退出程序。
  • -h 显示用法信息,其实就是ab -help。

Http 1.x 协议报文组成

Snipaste_2022-11-28_17-27-39.png

配置证书

购买服务器——>购买域名,并解析到这个主机——>购买证书,绑定到域名上,并且把证书文件安装到服务器,并在Nginx上配置好

这时候,这个域名就可以使用https 进行访问里(https://xxxx),浏览器上会有一个小锁

image8.png

申请证书

image9.png

下载证书文件

下载后,解压压缩包,可以看到两个文件,一个是 xxx.key(私钥)和xxx.pem(证书)

将两个文件上传到Nginx目录中,记得放置的位置。我这里直接放在nginx.conf配置文件所在的目录(/*/conf),所以写的都是相对路径

server {  
      listen 443 ssl; 
      ssl certificate  xxx.pem; #这里是证书路径  
      ssl_ certificate_key  xxx.key  #这里是私钥路径
      }

配置https 报错

nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in 
/usr/local/nginx/conf/nginx.conf:67nginx: [emerg] the "ssl" parameter requires 
ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:67

原因: nginx缺少http_ssl_module模块

说明:我的nginx的安装目录是/usr/local/nginx这个目录,我的源码包在/usr/local/src/nginx-1.16.1目录

切换

进到源码目录

   cd /usr/local/src/nginx-1.11.3
安装模块

1.安装模块并重新编译

   ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
  • 运行命令后:有可以会报错

    ./configure: error: SSL modules require the OpenSSL library.
    You can either do not enable the modules, or install the OpenSSL library
    into the system, or build the OpenSSL library statically from the source
    with nginx by using --with-openssl=<path> option.
    
  • 解决问题:需要安装 相关依赖 openssl-devel

    yum -y install openssl openssl-devel
    

2. 重新安装模块并重新编译

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
编译
make

注意 这里不要 make install,否则就是覆盖安装

备份

备份原有已安装好的nginx

cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
覆盖

注意nginx要在停止状态

把编译好的Nginx程序替换到原来的目录里

cp ./objs/nginx /usr/local/nginx/sbin/

升级检测
make upgrade

检查程序中是否包含新模块

nginx -V


Http和Https共存

  • http 默认商品为 80
  • https 默认端口为 443
server {





            listen 80 default backlog=2048;
            listen 443 ssl;
            server_name wosign.com;
            root /var/www/html;
            ssl_certificate xxxxx.pem;
            ssl_certificate_key xxxxxx.Key;
        }

UpStream工作流程

proxy_pass 向上游服务器请求数据共有6个阶段

  • 初始化
  • 与上游服务器建立连接
  • 向上游服务器发送请求
  • 处理响应头
  • 处理响应体
  • 结束

set_header

设置header

proxy_connect_timeout

与上游服务器连接超时时间、快速失败

proxy_send_timeout

定义nginx向后端服务发送请求的间隔时间(不是耗时)。默认60秒,超过这个时间会关闭连接

proxy_read_timeout

后端服务给nginx响应的时间,规定时间内后端服务没有给nginx响应,连接会被关闭,nginx返回504 Gateway Time-out。默认60秒

缓冲区

proxy_requset_buffering

是否完全读到请求体之后再向上游服务器发送请求

proxy_buffering

是否缓冲上游服务器数据

proxy_buffers 32 64k;

缓冲区大小 32个 64k大小内存缓冲块

proxy_buffer_size

header缓冲区大小

proxy_requset_buffering on;
proxy_buffering on;
​


proxy_buffer_size 64k;
​


proxy_buffers 32 128k;
proxy_busy_buffers_size 8k;
proxy_max_temp_file_size 1024m;

proxy_temp_file_write_size 8k

当启用从代理服务器到临时文件的响应的缓冲时,一次限制写入临时文件的数据的大小。 默认情况下,大小由proxy_buffer_size和proxy_buffers指令设置的两个缓冲区限制。 临时文件的最大大小由proxy_max_temp_file_size指令设置。

proxy_max_temp_file_size 1024m;

临时文件最大值

proxy_temp_path

   proxy_temp_path /spool/nginx/proxy_temp 1 2;

a temporary file might look like this:

 /spool/nginx/proxy_temp/7/45/00000123457

对客户端的限制

可配置位置

  • http
  • server
  • location

client_body_buffer_size

对客户端请求中的body缓冲区大小

默认32位8k 64位16k

如果请求体大于配置,则写入临时文件

client_header_buffer_size

设置读取客户端请求体的缓冲区大小。 如果请求体大于缓冲区,则将整个请求体或仅将其部分写入临时文件。 默认32位8K。 64位平台16K。

client_max_body_size 1000M;

默认1m,如果一个请求的大小超过配置的值,会返回413 (request Entity Too Large)错误给客户端

将size设置为0将禁用对客户端请求正文大小的检查。

client_body_timeout

指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)

client_header_timeout

客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。

client_body_temp_path path[level1[level2[level3`]]]

在磁盘上客户端的body临时缓冲区位置

client_body_in_file_only on;

把body写入磁盘文件,请求结束也不会删除

client_body_in_single_buffer

尽量缓冲body的时候在内存中使用连续单一缓冲区,在二次开发时使用$request_body读取数据时性能会有所提高

client_header_buffer_size

设置读取客户端请求头的缓冲区大小

如果一个请求行或者一个请求头字段不能放入这个缓冲区,那么就会使用large_client_header_buffers

large_client_header_buffers

默认8k

获取客户端真实IP

X-Real-IP

额外模块,不推荐使用

setHeader

upstream httpds {

  ip_hash;

  server 192.168.44.102 ;

  server 192.168.44.103 ;

}


​


​

server {
  listen       80;
  server_name  localhost;
​

  location / {
    proxy_pass http://httpds;
    proxy_set_header X-Forwarded-For $remote_addr; #获取用户真实IP
  }


  location ~*/(css|img|js) {

    root   /usr/local/nginx/html;

  }

}



Gzip

作用域 http, server, location

gzip on;

开关,默认关闭

gzip_buffers 32 4k|16 8k

缓冲区大小

gzip_comp_level 1;

压缩等级 1-9,数字越大压缩比越高

gzip_http_version 1.1;

使用gzip的最小版本 (默认1.1版本,可配可不配)

gzip_min_length

设置将被gzip压缩的响应的最小长度。 长度仅由“Content-Length”响应报头字段确定。

gzip_proxied 多选

off 为不做限制

作为反向代理时,针对上游服务器返回的头信息进行压缩

expired – 启用压缩,如果header头中包含 “Expires” 头信息no-cache – 启用压缩,如果header头中包含 “Cache-Control:no-cache” 头信息no-store – 启用压缩,如果header头中包含 “Cache-Control:no-store” 头信息private – 启用压缩,如果header头中包含 “Cache-Control:private” 头信息no_last_modified – 启用压缩,如果header头中不包含 “Last-Modified” 头信息no_etag – 启用压缩 ,如果header头中不包含 “ETag” 头信息auth – 启用压缩 , 如果header头中包含 “Authorization” 头信息any – 无条件启用压缩

gzip_vary on;

增加一个header,适配老的浏览器 Vary: Accept-Encoding

gzip_types

哪些mime类型的文件进行压缩

例如

text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
    text/javascript application/javascript application/x-javascript
    text/x-json application/json application/x-web-app-manifest+json
    text/css text/plain text/x-component
    font/opentype application/x-font-ttf application/vnd.ms-fontobject
    image/x-icon;
gzip_disable

禁止某些浏览器使用gzip

注意: 正则会影响nginx的匹配的性能

  gzip_disable "MSIE [1-6].(?!.*SV1)"; 
完整实例
  gzip on;
  gzip_buffers 16 8k;
  gzip_comp_level 6;
  gzip_http_version 1.1;
  gzip_min_length 256;
  gzip_proxied any;
  gzip_vary on;
  gzip_types text/plain application/x-javascript text/css application/xml;
  gzip_types
    text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
    text/javascript application/javascript application/x-javascript
    text/x-json application/json application/x-web-app-manifest+json
    text/css text/plain text/x-component
    font/opentype application/x-font-ttf application/vnd.ms-fontobject
    image/x-icon;
  gzip_disable "MSIE [1-6].(?!.*SV1)";
HTTP/1.1 200
Server: nginx/1.21.6
Date: Wed, 18 May 2022 17:42:35 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 7832
Connection: keep-alive
Keep-Alive: timeout=65

合并客户端请求

Concat模块

Tengine

Nginx官方介绍

www.nginx.com/resources/w…/

  1. github下载地址

    github.com/alibaba/ngi…

  2. 解压

    unzip nginx-http-concat-master.zip  
    

    注意 如果没有unzip 命令 需要安装

    yum install -y unzip
    
  3. 进到源码目录
    cd /usr/local/src/nginx-1.11.3
    
  4. 安装模块

    ./configure --prefix=/usr/local/nginx --add-module=/root/nginx-http-concat-master
    
  5. 编译

    make
    
    

    注意 这里不要 make install,否则就是覆盖安装

  6. 覆盖

    提示nginx 要在停止状态

    把编译好的Nginx程序替换到原来的目录里

    cp ./objs/nginx /usr/local/nginx/sbin/
    
    
    升级检测
     make upgrade
    

    检查程序中是否包含新模块

    nginx -V
    
    
    
  7. 配置合并请求

    server {
    
    
    
    
    
      listen 80 default_server;
    
    
       location / {
    
    
            concat on;
            concat_max_files 30;
            index  index.html index.htm;
    
        }
    
    }   
    
    
  8. 重启Nginx

nginx配置vue history去除#号

配置

server {





  listen 80 default_server;


   location / {


    try_files $uri $uri/ /index.html; #需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
     index  index.html index.htm;
    }
  #主要原因是路由的路径资源并不是一个真实的路径,所以无法找到具体的文件,然后交给路由在处理请求资源  
}

正向代理配置

#变量 $scheme 表示协议 (http,https)
#变量 $host 表示 IP 或域名
# $request_uri /aliyun/89yuan.html#参数   表示包含请求的文件名和路径及所有参数
# $uri:/aliyun/89yuan.html   包含请求的文件名和路径,不包含包含“?”或“#”等参数。
​


proxy_pass $scheme://$host$request_uri;
​

# 用于解析 $host 域名
resolver 8.8.8.8;
server {





    listen 80 default_server;
    resolver 8.8.8.8;
   location / {
        proxy_pass $scheme://$host$request_uri;
        index  index.html index.htm;

    }

}   

多级缓存

浏览器缓存

什么时候可以用缓存

  1. 不常改变的内容
  2. 过期时间
  3. 针对 post/get 请求都可以
  4. 存储位置
  5. 磁盘使用空间限制
  • deskcache

    字面理解是从内存中,其实也是字面的含义,这个资源是直接从内存中拿到的,不会请求服务器一般已经加载过该资源且缓存在了内存当中,当关闭该页面时,此资源就被内存释放掉了,再次重新打开相同页面时不会出现from memory cache的情况

  • memorycache

    是从磁盘当中取出的,也是在已经在之前的某个时间加载过该资源,不会请求服务器但是此资源不会随着该页面的关闭而释放掉,因为是存在硬盘当中的,下次打开仍会from disk cache

  • Age

    是CDN 添加的属性表示在CDN中缓存了多少秒

  • via

    有来标识CDN 缓存经历了哪些服务器同,缓存是否命中,使用的协议

强制缓存与协商缓存

  1. 强制缓存:直接从本机读取,不请求服务器
  2. 协商缓存:发送请求 header 中携带 Last-Modified,服务器可能会返回304 Not Modified

浏览器强制缓存

cache-control

http1.1的规范,使用max-age表示文件可以在浏览器中缓存的时间以秒为单位

标记 类型 功能
public 响应头 响应的数据可以被缓存,客户端和代理层都可以缓存
private 响应头 可私有缓存,客户端可以缓存,代理层不能缓存(CDN,proxy_pass)
no-cache 请求头 可以使用本地缓存,但是必须发送请求到服务器回源验证
no-store 请求和响应 应禁用缓存
max-age 请求和响应 文件可以在浏览器中缓存的时间以秒为单位
s-maxage 请求和响应 用户代理层缓存,CDN下发,当客户端数据过期时会重新校验
max-stale 请求和响应 缓存最大使用时间,如果缓存过期,但还在这个时间范围内则可以使用缓存数据
min-fresh 请求和响应 缓存最小使用时间,
must-revalidate 请求和响应 当缓存过期后,必须回源重新请求资源。比no-cache更严格。因为HTTP 规范是允许客户端在某些特殊情况下直接使用过期缓存的,比如校验请求发送失败的时候。那么带有must-revalidate的缓存必须校验,其他条件全部失效。
proxy-revalidate 请求和响应 和must-revalidate类似,只对CDN这种代理服务器有效,客户端遇到此头,需要回源验证
stale-while-revalidate 响应 表示在指定时间内可以先使用本地缓存,后台进行异步校验
stale-if-error 响应 在指定时间内,重新验证时返回状态码为5XX的时候,可以用本地缓存
only-if-cached 响应 那么只使用缓存内容,如果没有缓存 则504 getway timeout

在浏览器和服务器端验证文件是否过期的时候,浏览器在二次请求的时候会携带IF-Modified-Since属性

Expires

过期时间

expires 30s;   #缓存30秒
expires 30m;  #缓存30分钟   
expires 2h;     #缓存2小时
expires 30d;    #缓存30天

协商缓存

last-modified
etag

http1.1支持

在HTTP协议中If-Modified-Since和If-None-Match分别对应Last-Modified和ETag

Entity Tag 的缩写,中文译过来就是实体标签的意思.

HTTP中并没有指定如何生成ETag,哈希是比较理想的选择。

在计算Etag的时候,会产生CPU的耗费,所以也可以用时间戳,但这样直接使用Last-Modified即可。

ETag 用来校验用户请求的资源是否有变化,作用和lastmodified很像,区别是lastmodified精确到秒,ETag可以用hash算法来生成更精确的比对内容。

当用户首次请求资源的时候返回给用户数据和200状态码并生成ETag,再次请求的时候服务器比对ETag,没有发生变化的话返回304

Cache-Control直接是通过不请求来实现,而ETag是会发请求的,只不过服务器根据请求的东西的内容有无变化来判断是否返回请求的资源

总结:

cache-control expires 强制缓存

页面首次打开,直接读取缓存数据,刷新,会向服务器发起请求

etag lastmodify 协商缓存

没发生变化 返回304 不发送数据 (默认是开启协商缓存的)

server {





  listen 80 default_server;


   location / {


      ## 协商缓存 
         etag off; #关闭协商缓存 
         #add_header Last-Modified:'';#关闭协商协商缓存(文件修改日期)
         if_modified_since off; #关闭协商缓存(不返回304状态码)
     ##强制缓存 
        expires 30s;   #缓存30秒
        #  add_header cache-control "max-age:300"; #文件可以在浏览器中缓存的时间以秒为单位
        index  index.html index.htm;
    }
}   

浏览器缓存原则

  • 多级集群负载时last-modified必须保持一致

  • 还有一些场景下我们希望禁用浏览器缓存。比如轮训api上报数据数据

  • 浏览器缓存很难彻底禁用,大家的做法是加版本号,随机数等方法。

  • 只缓存200响应头的数据,像3XX这类跳转的页面不需要缓存。

  • 对于js,css这类可以缓存很久的数据,可以通过加版本号的方式更新内容

  • 不需要强一致性的数据,可以缓存几秒

  • 异步加载的接口数据,可以使用ETag来校验。

  • 在服务器添加Server头,有利于排查错误

  • 分为手机APP和Client以及是否遵循http协议

  • 在没有联网的状态下可以展示数据

  • 流量消耗过多

  • 提前下发 避免秒杀时同时下发数据造成流量短时间暴增

  • 兜底数据 在服务器崩溃和网络不可用的时候展示

  • 临时缓存 退出即清理

  • 固定缓存 展示框架这种,可能很长时间不会更新,可用随客户端下发

    • 首页有的时候可以看做是框架 应该禁用缓存,以保证加载的资源都是最新的
  • 父子连接 页面跳转时有一部分内容不需要重新加载,可用从父菜单带过来

  • 预加载 某些逻辑可用判定用户接下来的操作,那么可用异步加载那些资源

  • 漂亮的加载过程 异步加载 先展示框架,然后异步加载内容,避免主线程阻塞

proxy 缓存

官网解释

nginx.org/en/docs/htt…

配置

http模块:
proxy_cache_path /ngx_tmp levels=1:2 keys_zone=test_cache:100m inactive=1d max_size=10g ;
location模块:
add_header  Nginx-Cache "$upstream_cache_status";
proxy_cache test_cache;
proxy_cache_valid 168h;

proxy_cache_use_stale

默认off

在什么时候可以使用过期缓存

可选error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off

proxy_cache_background_update

默认off

运行开启子请求更新过期的内容。同时会把过期的内容返回给客户端

proxy_no_cache proxy_cache_bypass

指定什么时候不使用缓存而直接请求上游服务器

proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
proxy_no_cache $http_pragma    $http_authorization;

如果这些变量如果存在的话不为空或者不等于0,则不使用缓存

error_page

指定状态码

error_page 404 =302 http://www.atguigu.com;

示例

 server {


        listen    80;  


        server_name  localhost;



        location / {


            proxy_pass http://baidu.com


           # root   html;


           # index  index.html index.htm;


        }


        # 指定状态码 返回指定页面
        error_page 404 =302 /50x.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}

匿名 location

  error_page 404 =@err;
        location @err {
            root   html;
        }

示例

 server {


        listen    80;  


        server_name  localhost;



        location / {


            proxy_pass http://baidu.com


           # root   html;


           # index  index.html index.htm;


        }


        #  匿名 location
        error_page 404 =@err;
        location @err {
            root   html;
        }
}

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MY2u5ira' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片