Nginx学习之代理(4)

187 阅读17分钟

Nginx学习之代理(4)

本笔记是参考《黑马程序员Nginx教程》总结,供学习查阅

1.正向代理

简而言之就是正向代理代理的对象是客户端,反向代理代理的是服务端,这是两者之间最大的区别

Nginx即可以实现正向代理,也可以实现反向代理。

image-20221007125931540

如上图,当没有代理的时候,客户端直接访问服务器端,那么服务器能够直接打印客户端真实的IP地址,而若使用正向代理,那么Nginx就是代理客户端,把客户端的信息接收过来再转发给服务器端,那么服务器端接收Nginx的数据,Nginx作为了客户端,所以就打印出的IP是Nginx的

配置:

service配置:

    log_format main 'client send request=>clientIp=$remote_addr serverIp=>$host';
    server {
        listen 80;
        server_name localhost;
        access_log logs/access.log main;
        location {
            root html;
            index index.html index.htm;
        } 
    }

proxy服务器配置:

    server {
        listen 82;
        resolver 8.8.8.8;
        location /{
            proxy_pass http://$host$request_uri;
        }
    }

resolver 8.8.8.8: 设置DNS的IP,用来解析proxy_pass的域名(若用到域名的时候)

在客户机上配置proxy地址:

image-20221007131210503

然后在客户端浏览器里输入http://192.168.1.12访问,浏览器的请求会先发到代理服务1.11那台上去,然后11那台再根据用户填写的IP为12去访问真实服务器,可以看到service的日志文件里打印的IP是192.168.1.11

image-20221007131355700

Nginx正向代理,在实际的应用中不是特别多

2.反向代理

Nginx反向代理模块的指令是由ngx_http_proxy_module模块进行解析,该模块在安装Nginx的时候已经自己加装到Nginx中了

反向代理中常用指令

proxy_pass
proxy_set_header
proxy_redirect

2.1 相关指令

2.1.1 proxy_pass

该指令用来设置被代理服务器地址,可以是主机名称、IP地址加端口号形式。

语法proxy_pass URL;
默认值
位置location

URL:为要设置的被代理服务器地址,包含传输协议( http , https:// )、主机名称或IP地址加端口号、URI等要素。

编写proxy_pass的时候,后面的值加"/" 的区别?

location / {
	#proxy_pass http://192.168.200.146;
	proxy_pass http://192.168.200.146/;
}
若location后面是 / ,那么我们写192.168.200.146,服务器会默认加上/,所以192.168.200.146和192.168.200.146/都是访问 192.168.200.146/下的资源的
location /server {
	#proxy_pass http://192.168.200.146;
	proxy_pass http://192.168.200.146/;
}
若location后面是 /+字母,比如/server,那么当写192.168.200.146,则访问的是http://192.168.200.146/server,当访问192.168.200.146/,那么就不加/server,直接访问http://192.168.200.146/

2.1.2 proxy_set_header

该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后将新的请求头发送给代理的服务器

语法proxy_set_header field value;
默认值proxy_set_header Host $proxy_host; proxy_set_header Connection close;
位置http、server、location

需要注意的是,如果想要看到结果,必须在被代理的服务器上来获取添加的头信息。

server配置

server {
    listen 8080;
    server_name localhost;
    default_type text/plain;
    return 200 $http_username;
}

$http_username:获取http头的username参数值

proxy配置

    server {
        listen 8080;
        server_name localhost;
        location /server {
            proxy_pass http://192.168.1.11:8080/;
            proxy_set_header username TOM;
        }
    }

客户发送信息给代理后,代理再在http头里增加TOM的信息,发给服务器

2.1.3 proxy_redirect

该指令是用来重置头信息中的"Location"和"Refresh"的值。

语法proxy_redirect redirect replacement; proxy_redirect default; proxy_redirect off;
默认值proxy_redirect default;
位置http、server、location
proxy_redirect redirect replacement;
redirect:目标,Location的值
replacement:要替换的值  

proxy_redirect default;
default;
将location块的uri变量作为replacement,
将proxy_pass变量作为redirect进行替换  

proxy_redirect off;
关闭proxy_redirect的功能

当我们输入一个不存在的地址时,那么代理转发请求到服务器访问,找不到资源,会报如下错误页面:

image-20221007163934100

那么我们可以在代理上配置找不到资源时,返回给用户默认数据

    server {
        listen 8081;
        server_name localhost;
        if (!-f $request_filename){
            return 302 http://192.168.200.146;
        }
    }

若fileame的资源没有找到,则返回到另外一个服务器,查找默认的index.htm返回给用户

image-20221007163848241

上面的虽然返回的146的欢迎页面了,但是浏览器的IP从133变到了146,若不想变,那么可以如下配置

image-20221007164402937

然后再输入访问

image-20221007164450828

image-20221007164618083

2.2 案例

如下图,有三台服务器,每台服务器的内容不一样,那么nginx需要根据不同用户输入的不同url去指定访问不同的服务器

环境模拟:

image-20221007165151992

配置:

#代理服務器:
server {
    listen 8082;
    server_name localhost;
    location /server1 {
        proxy_pass http://192.168.200.146:9001/;
    } 
    location /server2 {
        proxy_pass http://192.168.200.146:9002/;
    } 
    location /server3 {
        proxy_pass http://192.168.200.146:9003/;
    }
} 

#服务端
server1
server {
    listen 9001;
    server_name localhost;
    default_type text/html;
    return 200 '<h1>192.168.200.146:9001</h1>'
} 

server2
server {
    listen 9002;
    server_name localhost;
    default_type text/html;
    return 200 '<h1>192.168.200.146:9002</h1>'
}

server3
server {
    listen 9003;
    server_name localhost;
    default_type text/html;
    return 200 '<h1>192.168.200.146:9003</h1>'
}

2.3 反向代理系统调优

image-20221028172127370

2.3.1 Buffer Cache

Buffer翻译过来是"缓冲",Cache翻译过来是"缓存"。

相同点: 两种方式都是用来提供IO吞吐效率,都是用来提升Nginx代理的性能。 不同点: 缓冲主要用来解决不同设备之间数据传递速度不一致导致的性能低的问题,缓冲中的数据一旦此次操作完成后,就可以删除。 缓存主要是备份,将被代理服务器的数据缓存一份到代理服务器,这样的话,客户端再次获取相同数据的时候,就只需要从代理服务器上获取,效率较高,缓存中的数据可以重复使用,只有满足特定条件才会删除.

2.3.2 相关指令

2.3.2.1 proxy_buffering

该指令用来开启或者关闭代理服务器的缓冲区

语法proxy_buffering on|off;
默认值proxy_buffering on;
位置http、server、location
2.3.2.2 proxy_buffers

该指令用来指定单个连接从代理服务器读取响应的缓存区的个数和大小。

语法proxy_buffers number size;
默认值proxy_buffers 8 4k | 8K;(与系统平台有关)
位置http、server、location

number:缓冲区的个数 size:每个缓冲区的大小,缓冲区的总大小就是number*size

2.3.2.3 proxy_buffer_size

该指令用来设置从被代理服务器获取的第一部分响应数据的大小。保持与proxy_buffers中的size一致即可,当然也可以更小

语法proxy_buffer_size size;
默认值proxy_buffer_size 4k | 8k;(与系统平台有关)
位置http、server、location
2.3.2.4 proxy_busy_buffers_size

该指令用来限制同时处于BUSY状态的缓冲总大小

语法proxy_busy_buffers_size size;
默认值proxy_busy_buffers_size 8k|16K;
位置http、server、location
2.3.2.5 proxy_temp_path

当缓冲区存满后,仍未被Nginx服务器完全接受,响应数据就会被临时存放在磁盘文件上,该指令设置文件路径 注意path最多设置三层。

语法proxy_temp_path path;
默认值proxy_temp_path proxy_temp;
位置http、server、location
2.3.2.6 proxy_temp_file_write_size

该指令用来设置磁盘上缓冲文件的大小

语法proxy_temp_file_write_size size;
默认值proxy_temp_file_write_size 8K|16K;
位置http、server、location

通用网站的配置

proxy_buffering on;
proxy_buffer_size 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

根据项目的具体内容进行相应的调节。

3.安全控制

Nginx反向代理是如何来提升web服务器的安全 呢?

3.1 安全隔离

什么是安全隔离?

通过代理分开了客户端到应用程序服务器端的连接,实现了安全措施。在反向代理之前设置防火墙,仅留一个入口供代理服务器访问。

image-20221028170456911

3.2 SSL

3.2.1 介绍

HTTP协议是明文传输数据,存在安全问题,而https是加密传输,相当于http+ssl,并且可以防止流量劫持。

HTTPS是一种通过计算机网络进行安全通信的传输协议。它经由HTTP进行通信,利用SSL/TLS建立全通信,加密数据包,确保数据的安全性。

  • SSL(Secure Sockets Layer)安全套接层
  • TLS(Transport Layer Security)传输层安全

上述这两个是为网络通信提供安全及数据完整性的一种安全协议,TLS和SSL在传输层和应用层对网络连接进行加密。

Nginx要想使用SSL,需要满足一个条件即需要添加一个模块--withhttp_ssl_module ,而该模块在编译的过程中又需要OpenSSL的支持

3.2.2 相关指令

该模块的指令都是通过ngx_http_ssl_module模块来解析的。

3.2.2.1 ssl

该指令用来在指定的服务器开启HTTPS,可以使用 listen 443 ssl,后面这种方式更通用些。

语法ssl on | off;
默认值ssl off;
位置http、server
server{
	listen 443 ssl;
}
3.2.2.2 ssl_certificate

为当前这个虚拟主机指定一个带有PEM格式证书的证书

语法ssl_certificate file;
默认值
位置http、server
3.2.2.3 ssl_certificate_key

该指令用来指定PEM secret key文件的路径

语法ssl_ceritificate_key file;
默认值
位置http、server
3.2.2.4 ssl_session_cache

该指令用来配置用于SSL会话的缓存

语法ssl_sesion_cache off|none|[builtin[:size]] [shared:name:size]
默认 值ssl_session_cache none;
位置http、server

说明:

off:禁用会话缓存,客户端不得重复使用会话
none:禁止使用会话缓存,客户端可以重复使用,但是并没有在缓存中存储会话参数
builtin:内置OpenSSL缓存,仅在一个工作进程中使用。
shared:所有工作进程之间共享缓存,缓存的相关信息用name和size来指定
3.2.2.5 ssl_session_timeout

开启SSL会话功能后,设置客户端能够反复使用储存在缓存中的会话参数时间。

语法ssl_session_timeout time;
默认值ssl_session_timeout 5m;
位置http、server
3.2.2.6 ssl_ciphers

指出允许的密码,密码指定为OpenSSL支持的格式

语法ssl_ciphers ciphers;
默认值ssl_ciphers HIGH:!aNULL:!MD5;
位置http、server

可以使用openssl ciphers查看openssl支持的格式。

3.2.2.7 ssl_prefer_server_ciphers

该指令指定是否服务器密码优先客户端密码

语法ssl_perfer_server_ciphers on|off;
默认值ssl_perfer_server_ciphers off;
位置http、server

3.2.3 生成证书

方式一:使用阿里云/腾讯云等第三方服务进行购买。 方式二:使用openssl生成证书

先要确认当前系统是否有安装openssl

openssl version

按照下面的命令进行生成

mkdir /root/cert
cd /root/cert
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey
server.key -out server.crt

开启SSL实例

server {
    listen 443 ssl;
    server_name localhost;
    ssl_certificate server.cert;
    ssl_certificate_key server.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;
    }
}

4.集群代理

Nginx在高并发场景和处理静态资源是非常高性能的,但是在实际项目中除了静态资源还有就是后台业务代码模块,一般后台业务都会被部署在Tomcat,weblogic或者是websphere等web服务器上。那么如何使用Nginx接收用户的请求并把请求转发到后台web服务器?

image-20221028172713135

4.1 单机代理

1.资源

静态资源: http://192.168.200.146:8080/demo/index.html
动态资源: http://192.168.200.146:8080/demo/getAddress

2.配置

upstream webservice {
	server 192.168.200.146:8080;
} 
server{
    listen 80;
    server_name localhost;
    location /demo {
    proxy_pass http://webservice;
    }
}

4.2 动静分离

什么是动静分离?

**动:**后台应用程序的业务处理 **静:**网站的静态资源(html,javaScript,css,images等文件) **分离:**将两者进行分开部署访问,提供用户进行访问。举例说明就是以后所有和静态资源相关的内容都交给Nginx来部署访问,非静态内容则交个类似于Tomcat的服务器来部署访问。

为什么要动静分离?

Nginx在处理静态资源的时候,效率是非常高的,而且Nginx的并发访问量也是名列前茅,而Tomcat则相对比较弱一些,所以 把静态资源交个Nginx后,可以减轻Tomcat服务器的访问压力并提高静态资源的访问速度。 动静分离以后,降低了动态资源和静态资源的耦合度。如动态资源宕机了也不影响静态资源的展示。

如何实现动静分离?

实现动静分离的方式很多,比如静态资源可以部署到CDN、Nginx等服务器上,动态资源可以部署到Tomcat,weblogic或者websphere上。本次课程只要使用Nginx+Tomcat来实现动静分离。

步骤:

1.在Nginx所在服务器创建如下目录,并将对应的静态资源放入指定的位置 ,比如图片、js

2.访问的页面,即html里静态资源都是相对nginx根目录root下去查找,动态资源,则根据后端应用配置url去查找

3.配置nginx

upstream webservice{
    server 192.168.200.146:8080;
} 
server {
    listen 80;
    server_name localhost;
    #动态资源
    location /demo {
        proxy_pass http://webservice;
    } 
    #静态资源
    location ~/.*\.(png|jpg|gif|js){
        root html/web;
        gzip on;
    } 
    location / {
        root html/web;
        index index.html index.htm;
    }
}

4.3 集群搭建

一台服务器容易宕机,那就多搭建几台Tomcat服务器,这样的话就提升了后的服务器的可用性。

image-20221028173521826

在Nginx对应的配置文件中添加如下内容即可

upstream webservice{
    server 192.168.200.146:8080;
    server 192.168.200.146:8180;
    server 192.168.200.146:8280;
}

4.4 nginx高可用

上述4.3环境中,如果是Nginx宕机了呢,那么整套系统都将服务对外提供服务了,这个如何解决?

需要两台以上的Nginx服务器对外提供服务,这样的话就可以解决其中一台宕机了,另外一台还能对外提供服务,但是如果是两台Nginx服务器的话,会有两个IP地址,用户该访问哪台服务器,用户怎么知道哪台是好的,哪台是宕机了的?

4.4.1 Keepalived

使用Keepalived来解决,Keepalived 软件由 C 编写的,最初是专为 LVS负载均衡软件设计的,Keepalived 软件主要是通过 VRRP 协议实现高可用功能。

image-20221028173752961

VRRP(Virtual Route Redundancy Protocol)协议,翻译过来为虚拟路由冗余协议。VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP,而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,MASTER实现针对虚拟路由器IP的各种网络功能。其他设备不拥有该虚拟IP,状态为BACKUP,处了接收MASTER的VRRP状态通告信息以外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。

从上面的介绍信息获取到的内容就是VRRP是一种协议,那这个协议是用来干什么的?

1.选择协议

VRRP可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台。其中的虚拟路由即Virtual路由是由VRRP路由群组创建的一个不真实存在的路由,这个虚拟路由也是有对应的IP地址。而且VRRP路由1和VRRP路由2之间会有竞争选择,通过选择会产生一个Master路由和一个Backup路由。

2.路由容错协议

Master路由和Backup路由之间会有一个心跳检测,Master会定时告知Backup自己的状态,如果在指定的时间内,Backup没有接收到这个通知
内容,Backup就会替代Master成为新的Master。Master路由有一个特权就是虚拟路由和后端服务器都是通过Master进行数据传递交互的,而备
份节点则会直接丢弃这些请求和数据,不做处理,只是去监听Master的状态

用了Keepalived后,解决方案如下:

image-20221028173931730

4.4.2 Keepalived配置文件介绍

1.keepalived的安装

2.打开keepalived.conf配置文件 这里面会分三部,第一部分是global全局配置、第二部分是vrrp相关配置、第三部分是LVS相关配置。 本次课程主要是使用keepalived实现高可用部署,没有用到LVS,所以我们重点关注的是前两部分

global全局部分:
global_defs {
    #通知邮件,当keepalived发送切换时需要发email给具体的邮箱
    地址
    notification_email {
    tom@itcast.cn
    jerry@itcast.cn
    } #
    设置发件人的邮箱信息
    notification_email_from zhaomin@itcast.cn
    #指定smpt服务地址
    smtp_server 192.168.200.1
    #指定smpt服务连接超时时间
    smtp_connect_timeout 30
    #运行keepalived服务器的一个标识,可以用作发送邮件的主题信
    息
    router_id LVS_DEVEL
    #默认是不跳过检查。检查收到的VRRP通告中的所有地址可能会比较
    耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的
    master路由器,则不执行检查(跳过检查)
    vrrp_skip_check_adv_addr
    #严格遵守VRRP协议。
    vrrp_strict
    #在一个接口发送的两个免费ARP之间的延迟。可以精确到毫秒级。
    默认是0
    vrrp_garp_interval 0
    #在一个网卡上每组na消息之间的延迟时间,默认为0
    vrrp_gna_interval 0
}

4.4.2 案例

1.环境准备

VIPIP主机名主/从
192.168.200.133keepalived1Master
192.168.200.222
192.168.200.122keepalived2Backup

2.nginx两台服务配置

nginx1

global_defs {
    notification_email {
        tom@itcast.cn
        jerry@itcast.cn
    }
    notification_email_from zhaomin@itcast.cn
    smtp_server 192.168.200.1
    smtp_connect_timeout 30
    router_id keepalived1
    vrrp_skip_check_adv_addr
    vrrp_strict
    vrrp_garp_interval 0
    vrrp_gna_interval 0
    } 
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    } 
    virtual_ipaddress {
        192.168.200.222
    }
}

nginx2

global_defs {
    notification_email {
    tom@itcast.cn
    } 
    notification_email_from zhaomin@itcast.cn
    smtp_server 192.168.200.1
    smtp_connect_timeout 30
    router_id keepalived2
    vrrp_skip_check_adv_addr
    vrrp_strict
    vrrp_garp_interval 0
    vrrp_gna_interval 0
    } 
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    } 
    virtual_ipaddress {
        192.168.200.222
    }
}

进入133(master) nginx服务器,然后启动keepalived ,可以看到已经虚拟出一个vip为222的IP,这样用户直接访问222就能访问到两台nginx中的一台,当一台nginx坏了,那么这个vip是不会变的,这个vip会自动切换到另外一个nginx上去

虚拟IP(VIP)会在MASTER节点上,当MASTER节点上的keepalived出问题以后,因为BACKUP无法收到MASTER发出的VRRP状态通过信息,就会直接升为MASTER。VIP也会"漂移"到新的MASTER。

image-20221028174745724

keepalived只能做到对网络故障和keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,进行切换。但是这些还不够,我们还需要监控keepalived所在服务器上的其他业务,比如Nginx,如果Nginx出现异常了,仅仅keepalived保持正常,是无法完成系统的正常工作的,因此需要根据业务进程的运行状态决定是否需要进行主备切换,这个时候,我们可以通过编写脚本对业务进程进行检测监控。

比如上面133当nginx挂了,但是keepalived没挂,那么访问222的时候,请求还是发给133这个nginx,这样就有问题,因为133这个服务已经不可用了,本应该发给另外一台好的nginx的,但事实上并没有,所以我们需要写一个脚本,监控nginx是否挂了,若挂了,就关闭keepalived,那么vip就会自动漂移到另外一个好的nginx上去

1.在keepalived配置文件中添加对应的配置像

vrrp_script 脚本名称
{
script "脚本位置"
interval 3 #执行时间间隔
weight -20 #动态调整vrrp_instance的优先级
}

2.编写脚本 ck_nginx.sh

#!/bin/bash
num=`ps -C nginx --no-header | wc -l`
if [ $num -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
killall keepalived
fi
fi

3.脚本赋权、添加到配置文件中,再执行即可,详细参考网上即可

5.制作下载站点

image-20221028175957029

nginx使用的是模块ngx_http_autoindex_module来实现的,该模块处理以斜杠("/")结尾的请求,并生成目录列表。

nginx编译的时候会自动加载该模块,但是该模块默认是关闭的,我们需要使用下来指令来完成对应的配置

5.1 相关指令

5.1.1 autoindex

启用或禁用目录列表输出

语法autoindex on|off;
默认值autoindex off;
位置http、server、location

5.1.2 autoindex_exact_size

对应HTLM格式,指定是否在目录列表展示文件的详细大小

默认为on,显示出文件的确切大小,单位是bytes。 改为off后,显示出文件的大概大小,单位是kB或者MB或者GB

语法autoindex_exact_size on|off;
默认值autoindex_exact_size on;
位置http、server、location

5.1.3 autoindex_format

设置目录列表的格式

注意:该指令在1.7.9及以后版本中出现

语法autoindex_format html|xml|json|jsonp;
默认值autoindex_format html;
位置http、server、location

5.1.4 autoindex_localtime

对应HTML格式,是否在目录列表上显示时间。 默认为off,显示的文件时间为GMT时间。 改为on后,显示的文件时间为文件的服务器时间

语法autoindex_localtime on | off;
默认值autoindex_localtime off;
位置http、server、location

5.1.5 配置

1.在nginx服务器创建一个目录local

2.把相关文件放到local这个目录里

3.配置nginx属性

location /download{
    root /usr/local;
    autoindex on;
    autoindex_exact_size on;
    autoindex_format html;
    autoindex_localtime on;
}

4.访问nginx xxx/download即可显示下载页面

5.2 用户认证模块

对应系统资源的访问,我们往往需要限制谁能访问,谁不能访问。这块就是我们通常所说的认证部分,认证需要做的就是根据用户输入的用户名和密码来判定用户是否为合法用户,如果是则放行访问,如果不是则拒绝访问。 Nginx对应用户认证这块是通过ngx_http_auth_basic_module模块来实现的,它允许通过使用"HTTP基本身份验证"协议验证用户名和密码来限制对资源的访问。默认情况下nginx是已经安装了该模块,如果不需要则使用--without-http_auth_basic_module。

5.2.1 相关指令

auth_basic使用“ HTTP基本认证”协议启用用户名和密码的验证

语法auth_basic string|off;
默认值auth_basic off;
位置http,server,location,limit_except

开启后,服务端会返回401,指定的字符串会返回到客户端,给用户以 提示信息,但是不同的浏览器对内容的展示不一致。

auth_basic_user_file指定用户名和密码所在文件

语法auth_basic_user_file file;
默认值
位置http,server,location,limit_except

指定文件路径,该文件中的用户名和密码的设置,密码需要进行加密。 可以采用工具自动生成

5.2.2 配置

1.nginx配置

location /download{
    root /usr/local;
    autoindex on;
    autoindex_exact_size on;
    autoindex_format html;
    autoindex_localtime on;
    auth_basic 'please input your auth';
    auth_basic_user_file htpasswd;
}

2.我们需要使用htpasswd工具生成

htpasswd -c /usr/local/nginx/conf/htpasswd username //
创建一个新文件记录用户名和密码
htpasswd -b /usr/local/nginx/conf/htpasswd username
password //在指定文件新增一个用户名和密码
htpasswd -D /usr/local/nginx/conf/htpasswd username //
从指定文件删除一个用户信息
htpasswd -v /usr/local/nginx/conf/htpasswd username //
验证用户名和密码是否正确

上述方式虽然能实现用户名和密码的验证,但是大家也看到了,所有的用户名和密码信息都记录在文件里面,如果用户量过大的话,这种方式就显得有点麻烦了,这时候我们就得通过后台业务代码来进行用户权限的校验了。