<h2><center>Nginx 访问控制</center></h2>

------

## 一：nginx访问控制模块

```
（1）基于IP的访问控制：http_access_module
（2）基于用户的信任登录：http_auth_basic_module
```



## 二：基于IP的访问控制

### 1. 语法格式

```
Syntax：allow address | CIDR | unix: | all;
default：默认无
Context：http，server，location，limit_except

Syntax：deny address | CIDR | unix: | all;
default：默认无
Context：http，server，location，limit_except
===================================================
allow    允许     //ip或者网段
deny     拒绝     //ip或者网段
```

### 2. 配置测试

​	编辑`/etc/nginx/conf.d/access_mod.conf`内容如下：

```bash
[root@test ~]# vim /etc/nginx/conf.d/access_mod.conf
server {
	listen 80;
	server_name localhost;
	
	location / {
		root /usr/share/nginx/html;
		index index.html index.htm;
		deny 192.168.159.131;
		allow all;
	}
}
[root@test ~]# nginx -t
[root@test ~]# nginx -s reload

#需要注意:
1.按顺序匹配，已经被匹配的ip或者网段，后面不再被匹配。
2.如果先允许所有ip访问，再定义拒绝访问。那么拒绝访问不生效。
3.默认为allow all
```

注意：

​	如果先允许访问，在定义拒绝访问；那么拒绝访问不生效.

​	虚拟机宿主机IP为192.168.159.131，虚拟机IP为192.168.159.130，故这里禁止宿主机访问，允许其他所有IP访问。 宿主机访问http://192.168.159.130/admin，显示403 Forbidden。 当然也可以反向配置，同时也可以使用IP网段的配置方式，如allow 192.168.159.0/24;，表示满足此网段的IP都可以访问。

**指定`location`拒绝所有请求**

```bash
[root@test ~]# vim /etc/nginx/conf.d/access_mod.conf
server {
	listen 80;
	server_name localhost;
	
	location / {
		root /usr/share/nginx/html;
		index index.html index.htm;
		deny all;
	}
}
[root@test ~]# nginx -t
[root@test ~]# nginx -s reload
```

注意：

​	如果你想拒绝某个指定URL地址的所有请求，而不是仅仅对其限速，只需要在location块中配置deny all指令。

## 三：基于用户的信任登录

### 1. 模块

​	基于用户的信任登录模块：http_auth_basic_module

​	有时我们会有这么一种需求，就是你的网站的某些页面不希望公开，我们希望的是某些特定的客户端可以访问。那么我们可以在访问时要求进行身份认证，就如给你自己的家门加一把锁，以拒绝那些不速之客。

### 2. 语法格式

```
Syntax：auth_basic string | off;
default：auth_basic off;
Context：http，server，location

Syntax：auth_basic_user_file file;
default：默认无
Context：http，server，location
file：存储用户名密码信息的文件。
```

### 3. 配置测试

```bash
[root@test ~]# vim /etc/nginx/conf.d/auth_mod.conf 
server {
	listen 80;
	server_name localhost;
	
	location ~ ^/admin {
		root /usr/share/nginx/html;
		index index.html index.htm;
		auth_basic "Auth access test!";
		auth_basic_user_file /etc/nginx/auth_conf;
	}
}
# auth_basic不为off，开启登录验证功能，auth_basic_user_file加载账号密码文件。
[root@test ~]# nginx -t
[root@test ~]# nginx -s reload
```

```bash
建立口令文件：
[root@test ~]# yum install -y httpd-tools # htpasswd 是开源 http 服务器 apache httpd 的一个命令工具，用于生成 http 基本认证的密码文件
[root@test ~]# htpasswd -cm /etc/nginx/auth_conf user10   # -c 创建解密文件，-m MD5加密（新版本的apache不用-m可默认加密）
[root@test ~]# htpasswd -m /etc/nginx/auth_conf user20
[root@test ~]# cat /etc/nginx/auth_conf 
user10:$apr1$bgbZyRky$SpEC50qcsw7UXHSse1yna.
user20:$apr1$NVcLhaq0$WBBC5liZKNwuQ9IN0/am/1
```

访问测试：

![](http://182.92.143.66:40072/directlink/img/nginx/image-202502260006.png)

### 4. 局限性

- 用户信息依赖文件方式
- 操作管理机械，效率低下

### 5. 解决办法

Nginx只做中间代理，具体认证交给应用